# Ordenação ¶

Ao exibir várias linhas de dados, muitas vezes é necessário que os dados sejam ordenados de acordo com algumas colunas especificadas pelos usuários finais. O Yii utiliza um objeto yii\data\Sort para representar as informações sobre um esquema de ordenação. Em particular,

- attributes especifica os atributos através dos quais os dados podem ser ordenados. Um atributo pode ser simples como um atributo do model. Ele também pode ser um composto por uma combinação de múltiplos atributos de model ou colunas do DB. Mais detalhes serão mostrados logo a seguir.
- attributeOrders dá as instruções de ordenação requisitadas para cada atributo.
- orders dá a direção da ordenação das colunas.

Para usar yii\data\Sort, primeiro declare quais atributos podem ser ordenados. Em seguida, pegue a requisição com as informações de ordenação através de attributeOrders ou orders E use-os para personalizar a consulta de dados. Por exemplo:

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

No exemplo abaixo, dois atributos são declarados para o objeto Sort: `age` e `name`.

O atributo `age` é um atributo simples que corresponde ao atributo `age` da classe Active Record `Article`. É equivalente a seguinte declaração:

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

O atributo `name` é um atributo composto definido por `first_name` e `last_name` de `Article`. Declara-se com a seguinte estrutura de array:

- Os elementos `asc` e `desc` determina a direção da ordenação dos atributos em ascendente ou descendente respectivamente. Seus valores representam as colunas e as direções pelas quais os dados devem ser classificados. Você pode especificar uma ou várias colunas para indicar uma ordenação simples ou composta.
- O elemento `default` especifica a direção pela qual o atributo deve ser ordenado quando requisitado. O padrão é a ordem crescente, ou seja, se a ordenação não for definida previamente e você pedir para ordenar por esse atributo, os dados serão ordenados por esse atributo em ordem crescente.
- O elemento `label` especifica o rótulo deve ser usado quando executar yii\data\Sort::link() para criar um link de ordenação. Se não for definida, yii\helpers\Inflector::camel2words() será chamado para gerar um rótulo do nome do atributo. Perceba que não será HTML-encoded.

> Observação: Você pode alimentar diretamente o valor de orders para a consulta do banco de dados para implementar a sua cláusula `ORDER BY`. Não utilize attributeOrders porque alguns dos atributos podem ser compostos e não podem ser reconhecidos pela consulta do banco de dados.

Você pode chamar yii\data\Sort::link() para gerar um hyperlink em que os usuários finais podem clicar para solicitar a ordenação dos dados pelo atributo especificado. Você também pode chamar yii\data\Sort::createUrl() para criar um URL ordenáveis. Por exemplo:

    // especifica a rota que a URL a ser criada deve usar
    // Se você não especificar isso, a atual rota requisitada será utilizada
    $sort->route = 'article/index';

    // exibe links direcionando a ordenação por ‘name‘ e ‘age‘, respectivamente
    echo $sort->link('name') . ' | ' . $sort->link('age');

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

O yii\data\Sort verifica o parâmetro `sort` da consulta para determinar quais atributos estão sendo requisitados para ordenação. Você pode especificar uma ordenação padrão através de yii\data\Sort::$defaultOrder quando o parâmetro de consulta não está fornecido. Você também pode personalizar o nome do parâmetro de consulta configurando propriedade sortParam.