Фильтры списка

Блок фильтров списка объявляется до задания колонок списка посредством метода 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;
}