Скрытие в адресной строке параметров SearchModel

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Скрытие в адресной строке параметров SearchModel

Сообщение long399 »

Здравствуйте, товарищи-разработчики. Требуется ваша помощь, т.к. не получается до конца реализовать то, что указано в заголовке темы.

Вывожу в GridView некоторые данные и если применять к ним фильтры, то в адресной строке будет ужасная картина из get-параметров SearchModel, параметр сортировки, пагинации и т.д.

Искал ответ, как скрыть все это безобразие и нашел способ, GridView можно обернуть в Pjax и передавать параметры через POST. В контроллере также вносится небольшая правка.

Код: Выделить всё

//view
<?php Pjax::begin([
    'id' => 'student-work',
    'timeout' => false,
    'enablePushState' => false,
    'clientOptions' => ['method' => 'POST'],
]); ?>

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ....
        ],
    ],
]); ?>

<?php Pjax::end(); ?>

Код: Выделить всё

//controller
public function actionIndex()
    {
        $searchModel = new StudentWorkSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->post());

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
Но тогда возникают другого рода проблемы..
1) Это работает для применения одного фильтра. Грубо говоря andWhere() из двух установок фильтров сделать не получится.
2) Сортировка и пагинация не включаются в обработку Pjax.

Если знаете, пожалуйста, подскажите решение данного вопроса!
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Скрытие в адресной строке параметров SearchModel

Сообщение Prooksius »

Сделал попап форму для выбора клиентов из списка, который показываю через GridView с поиском, сортировкой и пагинацией. Все идеально работает. И ищет по двум-трем полям.

Только я несколько иначе сделал, чтобы в адресную строку не кидалось все это.
Надо при инициализации PJAX использовать ['enablePushState' => false]

Код: Выделить всё

<?php Pjax::begin(['enablePushState' => false]); ?>
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Скрытие в адресной строке параметров SearchModel

Сообщение long399 »

Prooksius писал(а): 2020.05.14, 18:18 Сделал попап форму для выбора клиентов из списка, который показываю через GridView с поиском, сортировкой и пагинацией. Все идеально работает. И ищет по двум-трем полям.

Только я несколько иначе сделал, чтобы в адресную строку не кидалось все это.
Надо при инициализации PJAX использовать ['enablePushState' => false]

Код: Выделить всё

<?php Pjax::begin(['enablePushState' => false]); ?>
у меня тоже поле 'enablePushState' => false установлено также.

Согласен, поиск по нескольким полям срабатывает, я не заметил этого сразу.

Не работает другое: если выполнить поиск и попытаться отсортировать найденные результаты, тогда фильтры сбрасываются...
Так же не работает: если выполнить поиск и попытаться задействовать пагинацию - фильтры сбрасываются..
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Скрытие в адресной строке параметров SearchModel

Сообщение Prooksius »

У меня фильтрация и сортировка работают вместе.
Но у меня pjax работает по GET.
Ну и соответственно:

Код: Выделить всё

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
Попробуйте отказаться от POST в pjax
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Скрытие в адресной строке параметров SearchModel

Сообщение unknownby »

long399 писал(а): 2020.05.14, 13:11 Здравствуйте, товарищи-разработчики. Требуется ваша помощь, т.к. не получается до конца реализовать то, что указано в заголовке темы.
Если данный поиск работает в админке, то ничего страшного, можно и через GET с такой некрасивой структурой выводить.
Если же в общедоступной клиентской, то можно мучаться с передачей в POST и тогда будут проблемы как с пагинацией, так и с возвратом на предыдущий поиск, который ранее был выбран. Вариант передавать через GET, но при этом самому формировать эту строку с сохранением в window.history.state
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Скрытие в адресной строке параметров SearchModel

Сообщение long399 »

unknownby писал(а): 2020.05.18, 09:04 Если же в общедоступной клиентской
Да, в этом и проблема, что поиск в GridView будет выполняться в клиентской части.
unknownby писал(а): 2020.05.18, 09:04 Вариант передавать через GET, но при этом самому формировать эту строку с сохранением в window.history.state
Я верно понял, что нужно добавить JS-код в представление, в котором находится GridView?
Не могли бы вы привести, как примерно должна выглядеть эта JS-вставка?
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Скрытие в адресной строке параметров SearchModel

Сообщение long399 »

Prooksius писал(а): 2020.05.15, 08:37 У меня фильтрация и сортировка работают вместе.
Но у меня pjax работает по GET.
Ну и соответственно:

Код: Выделить всё

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
Попробуйте отказаться от POST в pjax
в Pjax же и так по умолчанию стоит метод передачи GET, если не ошибаюсь...

Поэтому я и пытался отказаться от GET, дабы скрыть из Url эту кашу вроде :
http:// hostname/index
?SearchModel%5Bname%5D=TESTNAME&SearchModel%5Bdate%5D=2020-05-12&SearchModel%5Bwork_filename%5D=FILENAME&SearchModel%5Bcurator_grade%5D=5

(выделено жирным)

и оставить только http:// hostname/index
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Скрытие в адресной строке параметров SearchModel

Сообщение unknownby »

long399 писал(а): 2020.05.22, 06:38
unknownby писал(а): 2020.05.18, 09:04 Если же в общедоступной клиентской
Да, в этом и проблема, что поиск в GridView будет выполняться в клиентской части.
unknownby писал(а): 2020.05.18, 09:04 Вариант передавать через GET, но при этом самому формировать эту строку с сохранением в window.history.state
Я верно понял, что нужно добавить JS-код в представление, в котором находится GridView?
Не могли бы вы привести, как примерно должна выглядеть эта JS-вставка?
Можно посмотреть ТУТ
В моём варианте был ListView, а не GridView, но суть не должна поменяться.
Ответить