Ответы пользователя по тегу Yii
  • Как в Yii2 сделать ListView с кастомным фильтром (Ajax/Pjax) и пагинацией?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Ну во первых, надо понимать, что Ajax это технология максимально связана с языком javascript
    Чтобы обновлялась информация по Ajax, нужно создать поле (DOM-дерево), с неким id, которое будет привязано к функции.
    Pjax это лишь вспомогательный класс, инструмент, для манипуляции с контентом, поэтому сети блока с классом Pjax надо раскинуть ровно на столько, на сколько это будет касаться обновления контента. В некоторых случаях мне приходилось захватывать во вью всю страничку экшена, паганацию можно вывести отдельно, вне ListView, и эта технология описана в документации Yii2

    Вот пример рабочего экшена, пусть написано криво, но сообщения отсылаются мгновенно и без перезагрузки страницы, со временем я сделаю этот код более удобным и простым:
    public function actionMessages($id ='', $token ='')
        {
    
            $model = new Message(); // обращаемся к классу привязанному к таблице БД
                if ($model->load(Yii::$app->request->post()) && $model->save()) // убеждаемся что передача данных проходит успешно
                {
                    $model = new Message(); // возвращаем то что обновили
                }    
    
            $send = Message::find()->where(['token' => $token])->orderBy(['id' => SORT_ASC ])->all(); // выводим всю переписку с конкретным пользователем
            $col = Message::find()->where(['token' => $token])->count(); // выводим количество сообщений с конкретным пользователем (например, чтобы скрыть пустой код, если переписки ещё не было)
            $getm = User::find()->where(['id' => $id])->one(); // так мы определим с кем мы переписываемся (имя, аватарка, возраст, что угодно)
            
            return $this->render('messages', ['model' => $model, 'col' => $col, 'send' => $send, 'getm' => $getm, 'id' => $id, 'token' => $token,]); // рендерим всё к чему прикоснулись, чтобы работало.
        }

    Вроде всё понятно, и это всё работает внутри "пиджака", через javascript по конкретному id в блоке div возможно кто-то уже нашёл готовое решение, я лишь делюсь своим скромным опытом.
    Что касается конкретно класса пагинации:
    <?php
    use yii\data\Pagination;
    ?>

    Это класс хорошо работает с классом:
    <?php
    use yii\widgets\LinkPager;
    ?>

    Который надо прописать во вью, и прописать вот такую не хитрую конструкцию:
    <?php echo LinkPager::widget(['pagination' => $pages,]);?>

    Там, где следует отобразить саму пагинацию. Как говорилось выше, надо применить некий id к коду выше, думаю как прописать это в коде - вы знаете, если вдруг фокусы с ListView не прошли.
    Никому не нужны костыли, но если нужно срочно что-то решать, то сойдёт и рабочий код:
    Controller::action /
    $query = Guestbook::find()->where(['level' => 1])->orderBy(['time' => SORT_DESC,]); // создаём конструкцию обращения
            $pages = new Pagination(['totalCount' => $query->count(),'pageSize' => 5]); // обращаемся к классу чтобы сказать сколько записей за раз нужно отобразить, например 5
            $pages->pageSizeParam = false; // отключаем самодеятельность параметров
            $models = $query->offset($pages->offset)->limit($pages->limit)->all(); // теперь зная количество записей и лимиты, мы заставляем скрипт показывать нам ровно столько сколько нам нужно


    На сколько мне известно, теги и айдишко можно прописать и в самом ListView , класс не привередливый, лёгкий и гибкий, решает практически все потребности и капризы заказчиков, почитай о всех возможностях здесь: https://xn--d1acnqm.xn--j1amh/%D0%B7%D0%B0%D0%BF%D... и здесь: www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html думаю это будет приятным чтивом, потому как тут очень много ответов и решений.
    ну и наконец ссылочка, которая лично мне очень помогла: https://nix-tips.ru/examples/simplegridview/index

    Благодарю за внимание.
    Ответ написан
    Комментировать
  • Как сделать выборку уникальных значений через ActiveRecord в Yii2?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Я не стал изобретать велосипед. Оказалось, что вывести список записей через цикл на столько просто и легко и элементарно)) Повторяющиеся записи исчезают, остаётся список только уникальных записей!

    Просто в экшене контроллера напиши:

    public function actionPage(){
            $select = City::find()->select(['obl'])->distinct()->all();
            return $this->render('page', ['select' => $select,]);
        }



    Немного поясню City это модель, которая обращается к некой таблице в БД
    obl - название столбца в таблице, записи которого хотите вывести


    Топорный пример вывода списка записей через select:

    <select class="form-control">
                        <?php foreach ($select as $m) { ?>
                            <option value="<?=$m->obl;?>"><?=$m->obl;?></option>
                        <?php } ?>
                    </select>


    Испытано лично, работает! Подсчёт уникальных записей, это:
    ->count();

    --

    $select = City::find()->select(['obl'])->distinct()->count();

    --
    <p>У вас всего <?=$select;?> уникальных записей</p>

    В документации Yii взял, там и черпаю знания, кому помог? )) Был рад стать полезен. Успехов!
    Ответ написан
    5 комментариев
  • Как сделать редирект без смены url?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Зная вашу версию, объясняю, есть в urlManager роли, которые надо указать. Если в ролях используются get запросы, тогда надо учитывать, число это или строка, если число, ставим значение 'd' (digital) если это строка,указываем значение 'w' (word), как в примере:

    'urlManager'=> [
                'enablePrettyUrl' => true,
                'showScriptName' => false,            
                    'rules'=> [
    // возвратит название домена, без слэша ( 1 )
                        '' => 'site/index',
    // возвратит экшен без названия папки контроллера ( 2 )
                        '<action:(login|logout|new|index|contact)>' => 'site/<action>',
                        '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
                        '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                        '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    // возвратит get запрос с ссылкой, у которой переменная $link отобразит строку ( 3 )
                        'site/news/<link:\w+>' => 'site/news',
                    ],            
            ],

    путь к данным параметрам /frontend/config/main.php

    в контроллере /frontend/controllers/SiteController.php
    public function actionNews($link = '') {
                // делаем get запрос
                $get = News::find()->where(['link' => $link])->one();
                return $this->render('news', ['link' => $link, 'get' => $get,]); 
    	}

    естественно не забыть указать узы для класса, и создать во вьюхе файл news.php

    В самом файле все get-переменные будут выглядеть примерно так:
    <?=$get->header;?>

    понятно, что $get - это переменная делающая запрос в БД, а header - переменная и название столбца в таблице БД, из которой передаётся значение по переменной $link а не $id !!!
    Получится что-то типа:

    // это для примера, писать не надо
    <?php 
    $link = 'first';
    ?>
    http://mysite.host/frontend/web/site/news/first


    Если хотите убрать /frontend/web/ , придётся поменять session и request, это может привести к потере директорий для многих стилей и скриптов, и перекроет кислород бекэнд разделу, но можно сделать модуль, создать свой лэяут и отделить во фронтэнде этот раздел, чтобы он был как бы бэкэндом, в тоже время папки с админкой будут во фронтэнде, операция сложная и требует знаний архетектуры Yii2, знания я черпаю из документации, хоть она и на английском, но там есть знакомые фрагменты кода Yii2 и даже описаны примеры и как и что применить.
    В конечном итоге я добился вида ссылок:

    mysite.host/site/news/first - при get-запросе, случай ( 3 )
    и
    mysite.host/news - при отображении страницы из экшена. Случай ( 2 )
    --
    Смотреть выше.
    Успехов вам ))
    Ответ написан
    1 комментарий
  • Почему не работает фильтр в GridView в Yii2?

    Isolution666
    @Isolution666
    Full-Stack Developer
    первое - дописать:
    public function scenarios()
        {
            return Model::scenarios();
        }

    узы сверху указать обязательно:
    use yii\base\Model;

    Второе:
    // grid filtering conditions
            $query->andFilterWhere([
                'id' => $this->id,
            ]);

    Убрать всё лишнее.

    Такова логика Yii2 :)
    Ответ написан
    Комментировать
  • DatePicker в GridView Yii2 не работает?

    Isolution666
    @Isolution666
    Full-Stack Developer
    А если написать просто
    'type' => 'date',
    Вы же используете html5 ?
    По идее календарь и так должен отобразится, хотя не во всех браузерах...
    Возможно Кирилл был прав, если поиск в GridView не настроен, то даже это не спасёт. Ведь инпут будет отправлять данные по дате в никуда ))
    Ответ написан
    Комментировать
  • Yii2 Advanced, В какую папку приходят письма?

    Isolution666
    @Isolution666 Автор вопроса
    Full-Stack Developer
    Для тех у кого возникла проблема с поиском писем в автономном режиме, откройте composer
    --
    Выберите путь к вашему проекту, например:
    cd C:\OpenServer\domains\site.host
    нажмите ENTER и введите команду:
    composer update и нажмите ENTER
    после обновления всё должно заработать и появиться

    Ещё нужно проверить здесь /frontend/config/main.php
    'mailer' => [
                'class' => 'yii\swiftmailer\Mailer',
                'useFileTransport' => true,
            ],


    поставьте
    'useFileTransport' => false,

    если хотите чтобы письма шли на электронную почту
    Ответ написан
    Комментировать
  • Как сделать ЧПУ пагинацию на Yii2?

    Isolution666
    @Isolution666
    Full-Stack Developer
    А если я хочу сделать ссылку по принципу:

    так было: http://домен/ru/site/reviev?page=1&per-page=3
    так стало: http://домен/ru/site/reviev/1/3


    что мне писать в urlManager ?

    правило 'site/reviev/<page:\d+>' => 'site/reviev', работает только для get запросов, что не катит в случае с пагинацией.
    Ответ написан