Страница 1 из 1

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

Добавлено: 2017.09.14, 09:09
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. Или же есть какое то более коробочное решение? Подскажите пожалуйста, кто сталкивался.

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

Добавлено: 2017.09.15, 18:58
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 сами доделаете по аналогии

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

Добавлено: 2017.09.16, 03:05
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 сами доделаете по аналогии
Благодарю!

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

Добавлено: 2018.01.18, 12:58
macmillan
Подскажите, а как в view вывести кнопки с SORT_PRICE_DESC => 'Цене, по убыванию' и SORT_PRICE_ASC => 'Цене, по возрастанию' ?

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

Добавлено: 2018.01.18, 13:01
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 => 'Цене, по возрастанию' ?

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

Добавлено: 2018.01.18, 13:12
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 => 'Цене, по возрастанию' ?

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

Добавлено: 2018.01.21, 08:16
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>?

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

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