Фильтрация
При выводе списков данных из моделей фильтрация осуществляется на основании параметров из раздела Конструктор запросов. Для запуска фильтров по полям модели используется класс Filter и его объект, доступный из объекта модели.
class Furniture extends Model
{
protected $name = 'Мебель';
protected $model_elements = [
['Активен', 'bool', 'active', ['on_create' => true]],
['Изображения', 'multi_images', 'images'],
['Описание', 'text', 'description'],
['Цена', 'int', 'price'],
['Площадь комнаты', 'int', 'square'],
['Расположение', 'enum', 'location', ['empty_value' => true,
'values_list' => [
'bedroom' => 'В спальне',
'livingroom' => 'В гостиной',
'childrenroom' => 'В детской',
'corridor' => 'В коридоре']]]
];
}
Нас интересуют поля price, square и location, по которым мы будем делать фильтрацию товаров. В файле шаблона создадим объект класса Filter, который может принимать GET параметры со значениями фильтров в виде ‘price-from=12000&square-to=50&location=livingroom’.
При запуске объекта Filter поиск нужных GET параметров запускается автоматически.
<?
//Файл шаблона
$mv -> furniture -> runFilter(['price', 'square', 'location']);
?>
<form method='get' action='<? echo $mv -> root_path; ?>furniture'>
<? echo $mv -> furniture -> filter -> display(); ?>
<button>Найти</button>
</form>
В модели в методе вывода списка товаров добавляем параметры фильтрации.
class Furniture extends Model
{
...
public function display()
{
//Массив условий заданных фильтров
$conditions = $this -> filter -> getConditions();
//Дополнительны условия
$conditions['active'] = 1;
$rows = $this -> select($conditions);
...
}
}
При отображении фильтров в шаблонах можно использовать различные методы и параметры.
//Запуск объекта фильтра для модели
$mv -> furniture -> runFilter(['price', 'square', 'location']);
//Вывод полей всех запущенных фильтров
echo $mv -> furniture -> filter -> display();
//Вывод выборочных фильтров в нужной последовательности
echo $mv -> furniture -> filter -> display(['location', 'price']);
//Вывод одного фильтра
echo $mv -> furniture -> filter -> display('square');
Методы объекта Filter
- display() - выводит HTML код для полей фильтров или одного поля
- displayCheckbox($field) - выводит HTML код для полей типа bool, image, file, multi_images в виде элемента checkbox (по умолчанию выводится тэг select с вариантами да, нет, не задан). В случае с checkbox значение 'нет' не определяется
- getConditions() - возвращает массив значений переданных фильтров, в формате Конструктора запросов
- getUrlParams() - возвращает список GET параметров значений фильтров для URL
- addUrlParams($path) - добавляет значения (GET параметры) установленных фильтров к переданному URL
- hasParams() - проверяет установлен ли хотя бы один фильтр, если да, то вернет true
- getValue($field, [$condition]) - возвращает значение фильтра если оно передано в GET, второй необязательный параметр нужен для полей типа date, date_time, int, float, order, в которых значения передаются как интервалы. Параметр принимает значения 'from' и 'to'.
- setValue($field, $value, [$condition]) - позволяет вставить значение для фильтра, принимает в качестве аргументов название поля и значение. Необязательный параметр нужен для передачи параметров для интервальных фильтров, аналогично предыдущему методу.
- addFilter($caption, $type, $name, [$extra_params]) - добавляет новый фильтр в объект filter, аргументы аналогичны типам данных
- removeFilter($field) - удаляет фильтр по названию поля
- setCaption($field, $caption) - устанавливает название (подпись) поля в списке фильтров
- setEnumEmptyValueTitle($field, $title) - для полей типа enum можно менять подпись пустого значения (используется в случаях когда в самом теге select нужно поставить его название). Для данного элемента модели изначальна должна быть задана опция 'empty_value' => true
- displaySingleField($field) - для полей типа date, date_time, int, float, order по умолчанию выводятся 2 окна input с целью задания интервала значений от и до. Если интервал не нужен и необходим вывод только одного элемента формы, то нужно использовать данный метод.
- filterValuesList($field, $params) - для полей типа enum с внешним ключом, parent и many_to_many есть возможность фильтрации списка значений, используя параметры в формате Конструктора запросов, $field - название поля, $params - массив параметров для фильтрации и/или упорядочивания.
- addOptionToValuesList($field, $value, $title) - для полей типа enum и parent дает возможность добавить значение в список опций
- setDisplaySingleField($field) - для полей типа date, date_time, int, float, order задает опцию, при которой поле будет выведено как как одно текстовое поле, а не интервал из двух полей. Также, фильтр будет принимать значение в виде единственного GET параметра, вместо интервальных значений 'from' и 'to'.
- setDisplayCheckbox($field) - для полей типа bool, image, file, multi_images задает опцию отображения в виде элемента checkbox, в результате вызова функции display()
- setDisplayEnumRadio($field, $columns) - для полей типа enum задает опцию вывода html кода в виде таблицы с кнопками radio, параметр $columns задает количество колонок в таблице.
- setDisplayEnumCheckboxes($field, $columns, [$empty_checkbox]) - для поля типа enum задает возможность отображения списка значений в виде таблицы с чекбоксами. Параметры $field - название поля, $columns - количество колонок в таблице, $empty_checkbox - необязательный параметр, показывающий надо ли отображать первым в списке чекбокс с пустым значением (например для производителей 'Все производители'). Выводит html таблицу с полями checkbox. Таким образом можно организовать множественный выбор. Фильтр для данного поля в таком случает отдаст значение вида '2,7,24'.
- setDisplayCheckboxTable($field, $columns) - для полей типа many_to_many задает отображение в виде таблицы с чекбоксами аналогично предыдущему методу
- setManyToManyEmptyValueTitle($field, $title) - для полей типа many_to_many задает подпись для пустого значения, когда фильтр отображается тэгом select.
//Получение значений фильтров
$mv -> furniture -> filter -> getValue('location');
$mv -> furniture -> filter -> getValue('price', 'from');
$mv -> furniture -> filter -> getValue('price', 'to');
//Добавление параметров фильтрации к URL
$path = $mv -> root_path.'search/?page=3';
$path = $mv -> furniture -> filter -> addUrlParams($path);
//Если хотя бы один фильтр установлен
if($mv -> furniture -> filter -> hasParams())
{
...
}
//Задание подписи для пустого значения поля 'enum'
$mv -> furniture -> filter -> setEnumEmptyValueTitle('location', 'Выберите расположение');
echo $mv -> furniture -> filter -> display('location');
//Сделаем возможность множественного выбора для поля 'Расположение'
$mv -> furniture -> filter -> setDisplayEnumCheckboxes('location', 2);
//Зададим отображение поля в виде radio кнопок в 3 столбца
$mv -> furniture -> filter -> setDisplayRadio('location', 3);
//Поле 'Активен' будем выводить как checkbox
$mv -> furniture -> filter -> setDisplayCheckbox('active');
//Поле цены выводим как одиночное поле для задания значения без интервала
$mv -> furniture -> filter -> setDisplaySingleField('price');
//Выводим все поля фильтра со всеми заданными опциями
echo $mv -> furniture -> filter -> display();
Примечания и рекомендации
- В результате вызова метода getConditions() возвращается набор условий, которые конструктор запросов свяжет между собой через И, при этом если для полей типа enum и many_to_many задается множественный выбор в виде таблицы с чекбоксами, то вернется конструкция вида 'field->in' => '8,25,87', что говорит о связи для данного поля через 'ИЛИ'.
- Поля типа date, date_time, int, float, order фильтруют по интервалам 'от' и 'до'. При вызове метода display() для такого поля возвращается 2 текстовых поля формы для задания интервала ('from', 'to'). Например в модели Furniture для поля price будут выведены поля с именами 'price-from' и 'price-to'. Если нужно вывести одно общее поле без интервалов, то используется метод displaySingleField().
- Поле вида Многие ко многим изначально будет отображаться в результате вызова метода display() в виде элемента select с возможностью выбора одного значения. Если же для поля задано отображение в виде чекбоксов методом setDisplayCheckboxTable($field, $columns), то будет отображаться список чекбоксов с возможностью множественного выбора.
- Для полей типа image, file, multi_images метод getConditions() возвращает конструкцию 'field->like' => '.', что при SQL запросе будет являться проверкой на наличие пути файла в ячейке SQL таблицы, при этом если необходимо проверить наличие реального файла на диске, нужно использовать функции php для работы с файловой системой.
Предыдущий раздел
Сортировка