SearchModel & ActiveDataProvider & sort

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

SearchModel & ActiveDataProvider & sort

Сообщение Maxim Glushko »

Набираю вручную $params для ActiveDataProvider:

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

$searchModel = new ProductSearch();
$params['ProductSearch'] = ['content_id' => $content->id];
$params['sort'] = '-price';
$params['page'] = 2;
$dataProvider = $searchModel->search($params);

// ...
// во вьюхе:

$products = $dataProvider->models;

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

$dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'defaultOrder' => ['sequence' => SORT_ASC],
                'attributes' => [
                    'sequence',
                    'price' => [
                        'asc' => ['products.price' => SORT_ASC],
                        'desc' => ['products.price' => SORT_DESC],
                    ],
                ]
            ],
        ]);
Почему-то включается сортировка по умолчанию. Что нужно сделать?
Проверял - в метод search() входит мой '-price', но дальше он ни на что не влияет. На этапе $products = $dataProvider->models оно использует сортировку по умолчанию. Параметр же page не теряется.
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: SearchModel & ActiveDataProvider & sort

Сообщение Maxim Glushko »

Кажется, разобрался.
sort напрямую берётся из get
Им никак не поспекулируешь, не переложишь вручную в params и не изменишь на красоты в урле
Нужно в пути писать 'price' или '-price', никак иначе - тогда он подхватится.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: SearchModel & ActiveDataProvider & sort

Сообщение unknownby »

Maxim Glushko писал(а): 2020.05.12, 10:10 Кажется, разобрался.
sort напрямую берётся из get
Им никак не поспекулируешь, не переложишь вручную в params и не изменишь на красоты в урле
Нужно в пути писать 'price' или '-price', никак иначе - тогда он подхватится.
А для чего передавать вручную params?
Если нужна сортировку по-умолчанию, то указываем в defaultOrder (если выводится GridView, то по нажатию на колонку будет изменяться сортировка)
Если сортировка в виде выпадающего списка (отображение ListView), то можно передавать через POST значение переменной и выводить нужную сортировку

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

if('' != $this->sort){
            switch ($this->sort){
                case 0:
                    $query->orderBy(['products_price' => SORT_ASC]);
                    break;
                case 1:
                    $query->orderBy(['products_price' => SORT_DESC]);
                    break;
                default:
                    break;
            }
        }
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: SearchModel & ActiveDataProvider & sort

Сообщение Maxim Glushko »

unknownby писал(а): 2020.05.12, 11:20 А для чего передавать вручную params?
Как по мне, такой урл вне админ панели некрасив:
/product?ProductSearch[id]=&ProductSearch[vendorcode]=&ProductSearch[name]=&ProductSearch[price]=&ProductSearch[discount]=&ProductSearch[measure]=&ProductSearch[availability]=&ProductSearch[status]=
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: SearchModel & ActiveDataProvider & sort

Сообщение unknownby »

Maxim Glushko писал(а): 2020.05.12, 11:37 Как по мне, такой урл вне админ панели некрасив:
/product?ProductSearch[id]=&ProductSearch[vendorcode]=&ProductSearch[name]=&ProductSearch[price]=&ProductSearch[discount]=&ProductSearch[measure]=&ProductSearch[availability]=&ProductSearch[status]=
Согласен, есть два пути.
Первый - это делать через POST, а не GET (но тогда пропадает возможность вернуться к нужному запросу при помощи кнопки "Назад" в браузере)
Второй - формировать урл при помощи JS с перезагрузкой контента с сохранением истории состояний
Ответить