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

  • attributes определяют атрибуты, по которым данные могут быть отсортированы. Атрибут может быть таким же простым, как атрибут модели. Он также может быть составным путем объединения нескольких атрибутов модели или столбцов БД. Более подробная информация будет дана ниже.
  • AttributeOrders предоставляет текущие запрошенные направления упорядочения для каждого атрибута.
  • orders задают направления заказа в терминах столбцов нижнего уровня.

Чтобы использовать yii\data\Sort, сначала объявите, какие атрибуты могут быть отсортированы. Затем извлекайте запрошенную информацию о заказе из атрибутов или заказов и используйте их для настройки запроса данных. Например:

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();

В приведенном выше примере для объекта Sort объявлены два атрибута: age и name. Атрибут age является простым атрибутом, соответствующим возрастному атрибуту класса Article Active Record. Это эквивалентно следующему объявлению:

'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.

Вы можете вызвать yii\data\Sort::link(), чтобы создать гиперссылку, по которой конечные пользователи могут щелкнуть, чтобы запросить сортировку данных по указанному атрибуту. Вы также можете вызвать yii\data\Sort::createUrl(), чтобы создать сортируемый URL-адрес. Например:

// specifies the route that the URL to be created should use
// If you do not specify this, the currently requested route will be used
$sort->route = 'article/index';

// display links leading to sort by name and age, respectively
echo $sort->link('name') . ' | ' . $sort->link('age');

// displays: /index.php?r=article%2Findex&sort=age
echo $sort->createUrl('age');

yii\data\Sort проверяет параметр запроса sort, чтобы определить, какие атрибуты запрашиваются для сортировки. Вы можете указать порядок по умолчанию через yii\data\Sort::$defaultOrder, если параметр запроса отсутствует. Вы также можете настроить имя параметра запроса, настроив свойство sortParam.