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

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

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

Сообщение EVOSandru6 » 2017.09.14, 09:09

Добрый день.

У меня в файле _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
Сообщения: 1885
Зарегистрирован: 2012.07.08, 19:28
Откуда: Донецк

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

Сообщение 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 сами доделаете по аналогии
Все говорят, что нужно кем-то мне становиться.
А я хотел бы остаться собой.

EVOSandru6
Сообщения: 561
Зарегистрирован: 2014.07.04, 13:33

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

Сообщение EVOSandru6 » 2017.09.16, 03:05

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 » 2018.01.18, 12:58

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

macmillan
Сообщения: 3
Зарегистрирован: 2018.01.18, 12:54

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

Сообщение macmillan » 2018.01.18, 13:01

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 » 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 => 'Цене, по возрастанию' ?

Аватара пользователя
futbolim
Сообщения: 1885
Зарегистрирован: 2012.07.08, 19:28
Откуда: Донецк

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

Сообщение futbolim » 2018.01.21, 08:16

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 » 2018.01.21, 22:25

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

Ответить