Back to Yii2

Output Sorting

docs/guide-ru/output-sorting.md

2.0.545.8 KB
Original Source

Сортировка

При выводе нескольких строк данных часто требуется сортировка по определённым столбцам, указанным пользователем. Yii использует объект [[yii\data\Sort]] для представления информации о схеме сортировки. В частности,

  • [[yii\data\Sort::$attributes|attributes]] определяет атрибуты, по которым данные могут быть отсортированы. Атрибут может соответствовать простому атрибуту модели или быть составным, объединяющим несколько атрибутов модели или столбцов БД. Подробности приведены ниже.
  • [[yii\data\Sort::$attributeOrders|attributeOrders]] содержит текущие направления сортировки для каждого атрибута.
  • [[yii\data\Sort::$orders|orders]] содержит направления сортировки в терминах низкоуровневых столбцов.

Чтобы использовать [[yii\data\Sort]], объявите доступные для сортировки атрибуты, затем получите текущие параметры сортировки из [[yii\data\Sort::$attributeOrders|attributeOrders]] или [[yii\data\Sort::$orders|orders]] и используйте их для настройки запроса данных. Например:

php
use yii\data\Sort;

$sort = new Sort([
    'attributes' => [
        'age',
        'name' => [
            'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
            'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
            'default' => SORT_DESC,
            'label' => 'Name',
        ],
    ],
]);

$articles = Article::find()
    ->where(['status' => 1])
    ->orderBy($sort->orders)
    ->all();

В примере выше для объекта [[yii\data\Sort|Sort]] объявлены два атрибута: age и name.

Атрибут age - это простой атрибут, соответствующий атрибуту age класса Active Record Article. Он эквивалентен следующему объявлению:

php
'age' => [
    'asc' => ['age' => SORT_ASC],
    'desc' => ['age' => SORT_DESC],
    'default' => SORT_ASC,
    'label' => Inflector::camel2words('age'),
]

Атрибут name - это составной атрибут, определённый через first_name и last_name модели Article. Он объявлен с помощью следующей структуры массива:

  • Элементы asc и desc задают порядок сортировки по атрибуту по возрастанию и убыванию соответственно. Их значения представляют реальные столбцы и направления сортировки. Можно указать один или несколько столбцов для простой или составной сортировки.
  • Элемент default задаёт направление сортировки при первом запросе. По умолчанию - по возрастанию: если атрибут ранее не сортировался и пользователь запросил сортировку по нему, данные будут отсортированы по возрастанию.
  • Элемент label задаёт метку, используемую при вызове [[yii\data\Sort::link()]] для создания ссылки сортировки. Если не указан, для генерации метки из имени атрибута будет вызван [[yii\helpers\Inflector::camel2words()]]. Метка не кодируется в HTML.

Info: Значение [[yii\data\Sort::$orders|orders]] можно передавать напрямую в запрос к базе данных для построения секции ORDER BY. Не используйте для этого [[yii\data\Sort::$attributeOrders|attributeOrders]], так как некоторые атрибуты могут быть составными и не будут распознаны запросом к БД.

Для создания гиперссылки, по которой пользователь может запросить сортировку по указанному атрибуту, вызовите [[yii\data\Sort::link()]]. Для создания URL сортировки используйте [[yii\data\Sort::createUrl()]]. Например:

php
// задаёт маршрут, который будет использоваться в URL
// если не указан, используется текущий маршрут
$sort->route = 'article/index';

// отображение ссылок сортировки по name и age
echo $sort->link('name') . ' | ' . $sort->link('age');

// выводит: /index.php?r=article%2Findex&sort=age
echo $sort->createUrl('age');

[[yii\data\Sort]] проверяет query-параметр sort, чтобы определить, по каким атрибутам запрошена сортировка. Сортировку по умолчанию (при отсутствии параметра) можно задать через [[yii\data\Sort::defaultOrder]]. Имя query-параметра настраивается через свойство [[yii\data\Sort::sortParam|sortParam]].