Сортировка
При выборке необходимых записей из таблицы модели можно сортировать результаты в нужном порядке. Если сортировка проводится только в одном направлении, то используется параметр, описанный в разделе Конструктор запросов.
//Сортировка по дате, вначале самые поздние
$rows = $mv -> events -> select(['order->desc' => 'date']);
//Сортировка по дате, вначале самые ранние
$rows = $mv -> events -> select(['order->asc' => 'date']);
//Самая ранняя запись
$record = $mv -> events -> find(['order->asc' => 'date']);
Динамическая сортировка
В случае, когда на странице сайта пользователь сам может сортировать результаты выборки, необходимо запустить сортировщик. Процедурой сортировки управляет класс Sorter, внутри модели объект данного класса создается при помощи метода runSorter().
class Vacancy extends Model
{
protected $name = 'Вакансии';
protected $model_elements = [
['Активировать', 'bool', 'active'],
['Название', 'char', 'name', ['required' => true, 'min_max_length' => '2,40']],
['Дата создания', 'date', 'date'],
['Зарплата', 'int', 'salary', ['positive' => true]],
['Описание', 'text', 'desc']
];
}
//Метод вывода списка вакансий
public function display($parent, $current_brand)
{
$rows = $this -> select(['active' => 1]);
$html = '';
foreach($rows as $row)
{
$html .= ...
}
return $html;
}
Сортировщик обычно запускается из шаблона и принимает на входе список возможных полей, и также можно передать поле и направление сортировки по умолчанию.
//Файл шаблона, например views/view-vacancies.php
//Вызов без сортировки по умолчанию
$mv -> vacancy -> runSorter(['date', 'name', 'salary']);
//Задана изначальная сортировка по дате
$mv -> vacancy -> runSorter(['date', 'name', 'salary'], 'date', 'desc');
Далее добавляем передачу параметров сортировки в запрос по извлечению записей.
public function display($parent, $current_brand)
{
$params = $this -> sorter -> getConditions();
$params['active'] = 1;
$rows = $this -> select($params);
...
}
В шаблоне выводим ссылки, кликнув на которые будем запускать нужную сортировку. Активной ссылке будет присвоен соответствующий css класс.
$path = $mv -> root_path.'vacancies';
echo $mv -> vacancy -> sorter -> displayLink('date', 'Дата', $path);
echo $mv -> vacancy -> sorter -> displayLink('name', 'Название вакансии', $path);
echo $mv -> vacancy -> sorter -> displayLink('salary', 'Зарплата', $path);
В примере создается одна ссылка на каждое поле для сортировки в обе стороны. Можно создавать ссылку на каждый вид сортировки. Текущей ссылке будет присвоен класс active.
$path = $mv -> root_path.'vacancies';
//Если необходимо добавить парамерты пагинации
$path = $mv -> vacancy -> paginator -> addUrlParams($path);
echo $mv -> vacancy -> sorter -> displaySingleLink('name', 'asc', 'Название А-Я', $path);
echo $mv -> vacancy -> sorter -> displaySingleLink('name', 'desc', 'Название Я-А', $path);
//Сортировка по умолчанию меняется на противоположную
echo $mv -> vacancy -> sorter -> displayLink('salary', 'Зарплата', $path, 'reverse');
Методы объекта Sorter
- getField(), getOrder() - возвращают соответственно текущее поле сортировки и порядок сортировки
- getConditions() - возвращает параметры сортировки для конструктора запросов
- setParams($field, $order) - устанавливает текущие параметры сортировки
- hasParams() - проверяет на наличие параметров сортировки, если поле и значение установлены то возвращает true
- getUrlParams() - возвращает GET параметры текущей сортировки в виде ‘sort-field=price&sort-order=desc’
- addUrlParams($path) - добавляет GET параметры вида 'sort-field=name&sort-order=asc' к переданному URL. Обычно используется для переброски параметров сортировки в другие модули: постраничную разбивку, фильтрацию.
- displayLink($field, $title [, $path, $reverse]), displaySingleLink($field, $order, $title [, $path]) - вывод ссылок сортировщика
- getParamsForSQL() - возвращает часть SQL запроса вида 'ORDER BY `date` DESC' с текущими параметрами сортировки
В некоторых случаях изначальный порядок сортировки нужно изменить, например при сортировки по цене товаров в каталоге, чтобы при клике на ссылку 'Сортировать по цене' более дешевые товары были вначале списка. По умолчанию для целочисленного поля ставится сортировка по убыванию, чтобы сделать первичную сортировку по возрастанию, необходимо передать четвертый параметр в метод displayLink в виде 'reverse'.
$path = $mv -> root_path.'catalog/34';
echo $mv -> products -> sorter -> displayLink('price', 'Сортировать по цене', $path, 'reverse');
Предыдущий раздел
Постраничная разбивка