Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
EVOSandru6
Сообщения: 605
Зарегистрирован: 2014.07.04, 13:33

Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение EVOSandru6 »

Добрый день.

У меня в файле _search Есть набор для фильтрации dataProvider в ListView:

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

<?php $form = ActiveForm::begin([
          'options' => ['data-pjax' => true ],
        'method' => 'post',
    ]); ?>
<?= $form->field($model, 'id')->textInput([
        'type'=>'number'
    ]) ?>

<!-- рабочий price filter -->

<?= $form->field($model, 'name')->textInput() ?>
<?php ActiveForm::end(); ?>
Помимо фильтрации я хочу выполнять сортировку.

Глянул на примере обычного грида в Network уходят запросы типа:

По возрастанию:

products?sort=id

По убыванию:

products?sort=-id

Хочу сделать dropDown для сртировки, варианты которого -

1. name от а до я
2. name от я до а
3. price по возрастанию
4. price по убыванию

Предполагаю, что нужно создать новое свойство в ProductsSearch и каким то образов вставлять его значение в defaultSort. Или же есть какое то более коробочное решение? Подскажите пожалуйста, кто сталкивался.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение futbolim »

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

// SearchModel
const SORT_PRICE_ASC = 'price-asc';
const SORT_PRICE_DESC = 'price-desc';
public $sort;

// rules()
['sort', 'in', 'range' => array_keys(self::getSortLabels())],

// attributeLabels()
 $labels['sort'] = 'Сортировка';
 
 // search()
if(!empty($this->sort)) {
    switch ($this->sort) {
        case self::SORT_PRICE_DESC: {
            $query->orderBy(['price' => SORT_DESC]);
            break;
        }
        case self::SORT_PRICE_ASC: {
            $query->orderBy(['price' => SORT_ASC]);
            break;
        }
        default: {}
    }
}

public static function getSortLabels() {
    return [
        self::SORT_PRICE_DESC => 'Цене, по убыванию',
        self::SORT_PRICE_ASC => 'Цене, по возрастанию',
    ];
}
name сами доделаете по аналогии
EVOSandru6
Сообщения: 605
Зарегистрирован: 2014.07.04, 13:33

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение EVOSandru6 »

futbolim писал(а): 2017.09.15, 18:58

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

// SearchModel
const SORT_PRICE_ASC = 'price-asc';
const SORT_PRICE_DESC = 'price-desc';
public $sort;

// rules()
['sort', 'in', 'range' => array_keys(self::getSortLabels())],

// attributeLabels()
 $labels['sort'] = 'Сортировка';
 
 // search()
if(!empty($this->sort)) {
    switch ($this->sort) {
        case self::SORT_PRICE_DESC: {
            $query->orderBy(['price' => SORT_DESC]);
            break;
        }
        case self::SORT_PRICE_ASC: {
            $query->orderBy(['price' => SORT_ASC]);
            break;
        }
        default: {}
    }
}

public static function getSortLabels() {
    return [
        self::SORT_PRICE_DESC => 'Цене, по убыванию',
        self::SORT_PRICE_ASC => 'Цене, по возрастанию',
    ];
}
name сами доделаете по аналогии
Благодарю!
macmillan
Сообщения: 3
Зарегистрирован: 2018.01.18, 12:54

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение macmillan »

Подскажите, а как в view вывести кнопки с SORT_PRICE_DESC => 'Цене, по убыванию' и SORT_PRICE_ASC => 'Цене, по возрастанию' ?
macmillan
Сообщения: 3
Зарегистрирован: 2018.01.18, 12:54

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение macmillan »

futbolim писал(а): 2017.09.15, 18:58

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

// SearchModel
const SORT_PRICE_ASC = 'price-asc';
const SORT_PRICE_DESC = 'price-desc';
public $sort;

// rules()
['sort', 'in', 'range' => array_keys(self::getSortLabels())],

// attributeLabels()
 $labels['sort'] = 'Сортировка';
 
 // search()
if(!empty($this->sort)) {
    switch ($this->sort) {
        case self::SORT_PRICE_DESC: {
            $query->orderBy(['price' => SORT_DESC]);
            break;
        }
        case self::SORT_PRICE_ASC: {
            $query->orderBy(['price' => SORT_ASC]);
            break;
        }
        default: {}
    }
}

public static function getSortLabels() {
    return [
        self::SORT_PRICE_DESC => 'Цене, по убыванию',
        self::SORT_PRICE_ASC => 'Цене, по возрастанию',
    ];
}
Подскажите, а как в view вывести кнопки с SORT_PRICE_DESC => 'Цене, по убыванию' и SORT_PRICE_ASC => 'Цене, по возрастанию' ?
macmillan
Сообщения: 3
Зарегистрирован: 2018.01.18, 12:54

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение macmillan »

futbolim писал(а): 2017.09.15, 18:58 public static function getSortLabels() {
return [
self::SORT_PRICE_DESC => 'Цене, по убыванию',
self::SORT_PRICE_ASC => 'Цене, по возрастанию',
];
}
[/code]
Подскажите, а как в view вывести кнопки с SORT_PRICE_DESC => 'Цене, по убыванию' и SORT_PRICE_ASC => 'Цене, по возрастанию' ?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение futbolim »

macmillan писал(а): 2018.01.18, 13:12
futbolim писал(а): 2017.09.15, 18:58 public static function getSortLabels() {
return [
self::SORT_PRICE_DESC => 'Цене, по убыванию',
self::SORT_PRICE_ASC => 'Цене, по возрастанию',
];
}
[/code]
Подскажите, а как в view вывести кнопки с SORT_PRICE_DESC => 'Цене, по убыванию' и SORT_PRICE_ASC => 'Цене, по возрастанию' ?
В смысле кнопки?
Нужны <a>, <button> или <select>?
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

Сообщение Nerf »

Лучше уж сделать сортировку через стандартный класс yii\data\Sort, чем вариант предложенный выше. Там и генерация ссылок есть.
Ответить