Выборка с сортировкой
(запрос sort)

sort.tpl
<?php

echo "
    <table>
        <tr>
        <th> </th>
        <th><a href='?page=$page&block=$block&sort[1]=asc'>Столбец 1</a></th>
        <th><a href='?page=$page&block=$block&sort[2]=asc'>Столбец 2</a></th>
        <th><a href='?page=$page&block=$block&sort[3]=asc'>Столбец 3</a></th>
        </tr>
";
foreach ($tab as $dat)
echo "
        <tr>
        <td>{$dat['edit']}</td>
        <td>$dat[1]</td>
        <td>$dat[2]</td>
        <td>$dat[3]</td>
        </tr>
";
echo "
    </table>
    $saveSortedByColumns
";

?>

sort.tdd
<?php

$types[1] = 'varchar(100)';
$types[2] = 'varchar(100)';
$types[3] = 'varchar(100)';

$params['isMultiRec'] = true;

?>

В первой строке таблицы даны ссылки на сортировку по столбцам. При щелчке по ссылке, соответствующий столбец будет отсортирован по алфавиту в возрастающем порядке.

Направление сортировки

Если нужно задать определенное направление сортировки, параметру нужно присвоить одно их значений: asc или desc, для прямого или обратного порядка сортировки, соответственно, например:

<a href='?page=$page&block=$block&sort[3]=desc'>Сортировать</a>

Для автоматического переключения направления сортировки на противоположный, можно применить следующий код:

Переключатель направления сортировки
<?php
    $order = ($request['sort'][]=='desc') ? 'asc' : 'desc';
    ...'&sort[3]='.$order.'...
?>

Сортировка по нескольким столбцам

Возможна также сортировка по нескольким столбцам. В приведенном ниже примере записи будут отсортированы в возрастающем порядке по первому полю, а для записей у которых значения в первом поле совпадают, дополнительно будет происходить сортировка по второму полю в убывающем порядке.

<a href='?page=$page&block=$block&sort[1]=asc&sort[2]=desc'>Сортировать</a>

Приоритет сортировки столбцов задается порядком элементов массива в запросе.

Объявление параметров сортировки по умолчанию в дескрипторе

Если сортировка записей должна производиться всегда и в одном и том же порядке, то предпочтительней объявить параметры сортировки в дескрипторе.

.tdd
$params['sort'][1] = 'asc'; 
$params['sort'][2] = 'desc';

Порядок элементов массива определяет приоритеты при осуществлении многостолбцовой сортировки — в первую очередь сортировка будет производиться по тому столбцу, сортировка которого объявлена раньше.

Теперь URL получатся более короткими и более привлекательными для поисковых роботов:

<a href='?page=$page&block=$block&sort[1]=asc&sort[2]=desc'>Страница 2</a>

К тому же, индексация ссылок с sort-запросами по умолчанию вообще запрещена (в robots.txt).

Запросы сортировки через URL можно применять по-прежнему — они будут просто перебивать параметры, заданные в дескрипторе.

Сохранение нового порядка записей

Запросы сортировки не затрагивает порядка данных непосредственно в базе данных. Однако, данные в отсортированном виде в базе данных можно сохранить. Существует несколько способов:

  1. Самый предпочтительный способ это — сортировка записей в окне сортировки. Это окно можно открыть через панель окна редактирования > Блок > Сортировка записей.
  2. Если посмотреть на самый первый пример шаблона, то под таблицей можно увидеть переменную $saveSortedByColumns – в этой переменной заключен код кнопки сохранения нового порядка записей. Кнопка сохранения нового порядка записей появляется после команды сортировки или команды на обратный порядок записей, и после щелчка по ней, данные будут сохранены в базе данных в новом порядке.

    Кнопку сохранения нового порядка записей видят только пользователи с правом редактирования блока.

  3. Если вы хотите отображать кнопку сохранения нового порядка в своем стиле, то можете непосредственно записать в шаблоне ее код. URL сохранения сортировки отличается от обычного запроса сортировки тем, что параметр page заменен на saveSortedByColumns:

    <a href='?saveSortedByColumns&block=$block&sort[1]=asc'>Сортировать и сохранить</a>

    Как видно из кода, запускается скрипт saveSortedByColumns. Более того, предварительные запросы сортировки никак не влияют работу этого скрипта – параметры сортировки нужно передавать непосредственно скрипту. Отсюда следует, что если пользователю нужно просто сохранить отсортированный порядок записей, ему достаточно показать одну кнопку с запросом saveSortedByColumns (без других кнопок предварительной сортировки).

    Сохраненять новый порядок записей могут только редакторы сортируемого блока.


См. также