Фильтры списка
Блок фильтров списка объявляется до задания колонок списка посредством метода filters()
.
Значения полей фильтра доступны посредством метода value('field_key')
, на основе которых формируются параметры SQL запроса к базе данных в модели.
Рассмотрим доступные типы полей фильтров:
Текстовое поле (text)
$list->filters()->text(
# уникальный ключ поля input[name]
'query',
# название поля и placeholder (если не указан в extra[attr][placeholder])
'Поиск по тексту'
);
Пример обработчика фильтра:
$listFilters = $list->filters();
# получаем значение фильтра по заданному полю по его ключу
$query = $listFilters->value('query');
# формируем фильтр для выборки из базы данных
$filterDB = [];
if ( ! empty($query)) {
$filterDB['query'] = $query;
}
В дополнительных параметрах в массиве вида['attr' => [...]
можно задать атрибуты поля - placeholder, необходимый класс или стиль.
# дополнительные параметры
$list->filters()->text('field_key_1', 'Поиск по тексту', [
'attr' => [
'placeholder' => 'Введите фразу для поиска',
'class' => 'bold',
'style' => 'background:red;',
]
]
);
Также можно задавать дополнительные параметры для валидации поля, тип данных и длину строки.
$list->filters()->text('field_key_2', 'Поиск по тексту', [],
[ TYPE_NOTAGS, 'len' => 150 ]
);
Выпадающий список (select)
$list->filters()->select('cat_id',
'Категории', # название поля
[ # варианты выбора в формате ['id' => 'title']
'option_id_1' => 'option_title_1',
'option_id_2' => 'option_title_2',
...
'option_id_n' => 'option_title_n',
],
0 # значение по умолчанию
);
Обратим внимание, третьим параметром являются варианты выбора для выпадающего списка.
Они могут передаваться из метода модели или используя callback, возвращаемые данные должны быть в формате ['id' => 'title']
.
Обрабатываем фильтр аналогично в методе контроллера:
$cat_id = $list->filters()->value('cat_id');
if ( ! empty($cat_id)) {
$filterDB['cat_id'] = $cat_id;
}
Числовое поле (number)
$list->filters()
->number('viewes', # уникальный ключ поля input[name]
'Просмотров', # название поля
0, # значение по умолчанию
['size' => 'medium'], # $extra дополнительные параметры
);
В дополнительных параметрах можно указать желаемый размер поля по ключу 'size'
.
Обрабатываем фильтр:
$viewes = $list->filters()->value('viewes');
if ( ! empty($viewes)) {
$filterDB[':viewes'] = array('viewes >= :viewes', ':viewes' => $viewes)
}
Отметка (checkbox)
$list->filters()
->checkbox('is_public', # уникальный ключ поля input[name]
'Публичные', # название поля
);
Обрабатываем фильтр:
$public = $list->filters()->value('is_public');
if ( ! empty($public)) {
$filterDB['public'] = true;
}
Поле ввода даты
$list->filters()
->date('from', # уникальный ключ поля input[name]
'Дата:', # название поля
['attr' =>
[ # дополнительные параметры
'placeholder' => 'с',
]
]
)
->date('to', 'по')
Пример обработчика фильтров:
$listFilters = $list->filters();
$from = $listFilters->value('from');
$to = $listFilters->value('to');
# формируем фильтр для выборки из базы данных
$filterDB = [];
if (!empty($from)) {
$filterDB[':from'] = array('created >= :from', ':from' => date('Y-m-d 00:00:00', strtotime($from)));
}
if (!empty($to)) {
$filterDB[':to'] = array('created <= :to', ':to' => date('Y-m-d 23:59:59', strtotime($to)));
}
Поле с автозаполнением (autocomplete)
$list->filters()
->autocomplete(
'user_id', # уникальный ключ поля input[name]
'E-mail пользователя', # название поля или placeholder
false, # URL источника доступных вариантов
[], # suggest варианты выбора по умолчанию
[
'autocomplete' => function($q) { # callback_autocomplete для поиска значений
$result = array();
if (! empty($q)) {
$filter = array(
':q' => array('email LIKE :q', ':q' => '%'.$q.'%'),
);
$data = $this->model->usersByEmail($filter); # запрос к модели
foreach($data as $v) {
$result[] = array($v['user_id'], $v['email']);
}
}
return $result;
},
'width'=> 180
]
);
Для поиска подходящих вариантов при заполнении удобно использовать callback_autocomplete, параметром которого является строка поиска.
Возвращать callback должен массив в формате [[$id_1, $title_1], [$id_2, $title_2], ...]
.
Для фильтрации и выборки необходимых записей получаем выбранный вариант из поля фильтра по названию ключа 'user_id'
.
$user_id = $this->input->postget('user_id');
if ( ! empty($user_id)) {
$filter[':user_id'] = ['U.user_id = :user_id', ':user_id' => $user_id];
}
Компонент тегов Tags
В качестве автозаполняемого поля фильтра можно также осуществлять поиск по тегам, если такой компонент добавлен к объекту и является характеристикой записи.
В callback_autocomplete для поля автозаполнения компонента формы вызываем метод поиска совпадений компонента tagsAutocomplete(query)
.
Представляем данные совпадений по тегам в необходимом формате для автозаполнения.
$list->filters()
->autocomplete(
'tags',
'Теги',
false,
[],
[
# callback_autocomplete для формирования списка подходящих значений:
'autocomplete' => function($q) {
$result = array();
if (! empty($q)) {
$data = $tagsComponent->tagsAutocomplete($q);
foreach($data as $v) {
$result[] = array($v['id'], $v['tag']);
}
}
return $result;
},
'width' => 180,
]
);
Фильтр списка при помощи табов
Табы задаются и обрабатываются в методе контроллера. Рассмотрим простой пример работы с табами:
$list->tabs()
->add(0, 'Все')
->add(1, 'Опубликованные')
->add(2, 'Снятые с публикации')
//...
# формируем фильтр выборки и порядок сортировки по табу
$filterDB = [];
switch ($list->tab()) {
case 1: # Опубликованные
$filterDB['enabled'] = 1;
break;
case 2: # Снятые с публикации
$filterDB['enabled'] = 0;
break;
}