Сортировка
При выборки и выводе необходимых записей из таблицы модели можно сортировать результаты в нужном порядке. Если сортировка проводится только в одном направлении, то используется параметр, описанный в разделе Конструктор запросов.
//Сортировка по дате (вначале самые поздние) $rows = $mv -> events -> select(array("order->desc" => "date")); //Сортировка по дате (вначале самые ранние) $rows = $mv -> events -> select(array("order->asc" => "date")); //Самая ранняя запись $row = $mv -> events -> selectOne(array("order->asc" => "date", "limit->" => 1));
Динамическая сортировка
В случае, когда на странице сайта пользователь сам может сортировать результаты выборки (например товары каталога), необходимо запустить сортировщик. Процедурой сортировки управляет класс "Sorter", внутри модели объект данного класса создается при помощи метода "runSorter()".
Пример
class Vacancy extends Model { protected $name = "Вакансии"; protected $model_elements = array( array("Активировать", "bool", "active"), array("Название", "char", "name", array("required" => true, "min_max_length" => "2,40")), array("Дата создания", "date", "date"), array("Зарплата", "int", "salary", array("positive" => true)), array("Описание", "text", "desc")); } public function display($parent, $current_brand) { $rows = $this -> select(array("active" => 1)); $html = ""; foreach($rows as $row) { $html .= "<div>"; $html .= "<h3>".$row['name']."(".$row['salary'].")</h3>"; $html .= "<span>".I18n :: dateFormSQL($row['date'])."</span>"; $html .= "<p>".$row['desc']."</p>"; $html .= "</div>"; } return $html; } //Для сортировки данных в шаблоне добавляем запуск сортировщика по нужным нам полям $mv -> vacancy -> runSorter(array("date", "name", "salary")); //При запуске сортировщик ищет переданные параметры сортировки $_GET["sort-field"] и $_GET["sort-order"], //из которых берет значения для сортировки, если они не были найдены то можем задать изначальные параметры $mv -> vacancy -> runSorter(array("date", "name", "salary"), "date", "desc"); //Далее дополняем метод "display()" в модели "Vacancy" public function display($parent, $current_brand) { $rows = $this -> select(array("active" => 1, "order->".$this -> sorter -> getOrder() => $this -> sorter -> getField())); ... } //В шаблоне создаем ссылки для передачи GET параметров //Текущей активной ссылке будет присвоен класс "active-asc" либо "active-desc" <div class="sorting"> <? echo $mv -> vacancy -> sorter -> displayLink("date", "Дата"); echo $mv -> vacancy -> sorter -> displayLink("name", "Название вакансии"); echo $mv -> vacancy -> sorter -> displayLink("salary", "Зарплата"); ?> </div>
В примере создается одна ссылка на каждое поле для сортировки "в обе стороны". Можно создавать ссылку на каждый вид сортировки. Текущей ссылке будет присвоен класс "active". Также, по умолчанию в ссылках ставится только путь вида "?sort-field=name&sort-order=asc". Если мы хотим поставить в ссылку полный путь то нам его необходимо передать четвертым параметром (в методе displayLink третьим параметром).
$path = $mv -> root_path."jobs/".$job -> id."/"; if($current_section) $path .= "?section=".$current_section; $path = $mv -> vacancy -> pager -> addUrlParams($path); echo $mv -> vacancy -> sorter -> displaySingleLink("name", "asc", "Название А-Я", $path); echo $mv -> vacancy -> sorter -> displaySingleLink("name", "desc", "Название Я-А", $path); echo $mv -> vacancy -> sorter -> displaySingleLink("date", "asc", "Сначала более ранние", $path); echo $mv -> vacancy -> sorter -> displaySingleLink("date", "desc", "Сначала более поздние", $path); echo $mv -> vacancy -> sorter -> displaySingleLink("salary", "asc", "Возрастание зарплаты", $path); echo $mv -> vacancy -> sorter -> displaySingleLink("salary", "desc", "Убывание зарплаты", $path); //Аналогично передается параметр пути в метод displayLink echo $mv -> vacancy -> sorter -> displayLink("date", "Дата", $path); echo $mv -> vacancy -> sorter -> displayLink("name", "Название вакансии", $path); echo $mv -> vacancy -> sorter -> displayLink("salary", "Зарплата", $path, "reverse");
Методы объекта Sorter
- getField(), getOrder() - возвращают соответственно текущее поле сортировки и порядок сортировки
- 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]) - вывод ссылок сортировщика (описаны выше), опция $reverse описана в разделе "Дополнительная настройка" ниже, примеры использования выше.
- getParamsForSQL() - возвращает часть SQL запроса вида "ORDER BY `date` DESC" с текущими параметрами сортировки
Дополнительная настройка
При вызове метода "displayLink" mV формирует ссылку для сортировки по заданному полю "в обе стороны", т.е. если в текущий момент задана сортировка по возрастанию, то при повторном клике на данную ссылку произойдет сортировка по убыванию. Если в текущий момент сортировка идет не по переданному полю, или не задана вообще, то в ссылке будет выведен порядок для сортировки по умолчанию для данного поля.
Порядок сортировки по умолчанию зависит от типа данных и приведен ниже.
//Фрагмент кода из класса Sorter $initial_orders = array( 'id' => 'asc', 'bool' => 'desc', 'int' => 'desc', 'float' => 'desc', 'char' => 'asc', 'url' => 'asc', 'redirect' => 'asc', 'email' => 'asc', 'enum' => 'asc', 'parent' => 'desc', 'order' => 'asc', 'date' => 'desc', 'date_time' => 'desc', 'image' => 'desc', 'multi_images' => 'desc', 'file' => 'asc', 'many_to_one' => 'desc', 'many_to_many' => 'desc' );
В некоторых случаях изначальный порядок сортировки нужно изменить, например при сортировки по цене товаров в каталоге, чтобы при клике на ссылку "Сортировать по цене" более дешевые товары были вначале списка. По умолчанию для целочисленного поля (int) ставится сортировка по убыванию, чтобы сделать первичную сортировку по возрастанию, необходимо передать четвертый параметр в метод "displayLink" в виде "reverse".
$path = $mv -> root_path."catalog/34/"; echo $mv -> products -> sorter -> displayLink("price", "Сортировать по цене", $path, "reverse");
Предыдущий раздел
Постраничная разбивка