Фильтр main.ui.filter

main.ui.filter выводит строку поиска и набор полей фильтрации. Используйте компонент на страницах со списками, отчетами и таблицами, где пользователь должен выбрать условия, сохранить пресет и применить фильтр к данным.

Компонент отвечает только за интерфейс фильтра и сохранение пользовательских настроек. Серверный код страницы получает выбранные значения через Bitrix\Main\UI\Filter\Options или через слой Bitrix\Main\Filter\Filter, а затем сам применяет условия к ORM-запросу, массиву данных или другому источнику.

Если фильтр работает вместе с таблицей main.ui.grid, передайте один и тот же идентификатор в FILTER_ID и GRID_ID. Тогда фильтр сможет обновлять связанный грид после применения условий.

Вывести фильтр

Передайте в компонент идентификатор фильтра и массив полей. Минимальное поле содержит id и name; если type не указан, поле работает как строковое.

<?php

$filterId = 'orders_filter';

$APPLICATION->IncludeComponent(
    'bitrix:main.ui.filter',
    '',
    [
        'FILTER_ID' => $filterId,
        'FILTER' => [
            [
                'id' => 'FIND',
                'name' => 'Поиск',
            ],
            [
                'id' => 'STATUS',
                'name' => 'Статус',
                'type' => 'list',
                'items' => [
                    '' => 'Любой',
                    'new' => 'Новый',
                    'done' => 'Выполнен',
                ],
            ],
            [
                'id' => 'DATE_CREATE',
                'name' => 'Дата создания',
                'type' => 'date',
            ],
        ],
        'ENABLE_LABEL' => true,
    ]
);

Основные параметры вызова:

Параметр Тип Описание
FILTER_ID string Обязательный идентификатор фильтра. Используйте уникальное значение для каждой страницы или логического списка, потому что по нему сохраняются пользовательские настройки
GRID_ID string Идентификатор грида. Передавайте его, если фильтр должен обновлять таблицу main.ui.grid
FILTER array Обязательный массив полей фильтра. Компонент преобразует поля в данные для интерфейса
FILTER_PRESETS array Массив пресетов фильтра
ENABLE_LABEL bool true включает подписи полей

Настроить поведение

Компонент поддерживает настройки интерфейса, которые влияют на внешний вид и сценарий работы.

Параметр Тип Значение Описание
DISABLE_SEARCH bool true Отключает строку поиска
ENABLE_LIVE_SEARCH bool true Применяет фильтр по мере ввода
ENABLE_FIELDS_SEARCH string 'Y' Включает поиск по названиям полей в настройках фильтра
ENABLE_LABEL bool true Показывает подписи полей
RESET_TO_DEFAULT_MODE bool true Возвращает фильтр к начальному состоянию при сбросе
VALUE_REQUIRED_MODE bool true Включает режим, в котором фильтр может требовать значение
COMPACT_STATE bool true Включает компактное состояние фильтра
HEADERS_SECTIONS array Непустой массив Группирует поля по секциям. Поле привязывается к секции через sectionId
RENDER_FILTER_INTO_VIEW string Идентификатор области Встраивает фильтр в указанную область
RENDER_FILTER_INTO_VIEW_SORT int Число сортировки Задает сортировку фильтра внутри области
MESSAGES array Массив текстов Заменяет пользовательские тексты интерфейса. Компонент использует только ключи, которые начинаются с MAIN_UI_FILTER__
LIMITS array Массив с TITLE, DESCRIPTION и BUTTONS Показывает ограничение. Если задан заголовок ограничения, компонент отключает строку поиска
RESTRICTED_FIELDS array Непустой массив Задает список ограниченных полей

Получить значения

После отправки формы получите значения фильтра на сервере и примените их к выборке.

<?php

use Bitrix\Main\UI\Filter\Options;

$filterId = 'orders_filter';
$filterFields = [
    ['id' => 'FIND', 'name' => 'Поиск'],
    ['id' => 'STATUS', 'name' => 'Статус', 'type' => 'list'],
    ['id' => 'DATE_CREATE', 'name' => 'Дата создания', 'type' => 'date'],
];

$filterOptions = new Options($filterId);
$filter = $filterOptions->getFilter($filterFields);

if (!empty($filter['STATUS']))
{
    $ormFilter['=STATUS'] = $filter['STATUS'];
}

if (!empty($filter['DATE_CREATE_from']))
{
    $ormFilter['>=DATE_CREATE'] = $filter['DATE_CREATE_from'];
}

if (!empty($filter['DATE_CREATE_to']))
{
    $ormFilter['<=DATE_CREATE'] = $filter['DATE_CREATE_to'];
}

if (!empty($filter['FIND']))
{
    $ormFilter['%TITLE'] = $filter['FIND'];
}

Метод Options::getFilter() возвращает значения, которые пользователь выбрал в интерфейсе. Для полей с диапазоном компонент добавляет служебные ключи, например _from, _to, _datesel и _numsel. Используйте только те ключи, которые нужны вашему запросу.

Метод getValue() класса Bitrix\Main\Filter\Filter удаляет служебные поля интерфейса и вызывает подготовку значений у провайдера. Используйте его, если страница уже построена на серверном слое Bitrix\Main\Filter\Filter. Для объекта фильтра нужен провайдер данных, поэтому не создавайте его только ради чтения значений из обычного компонента.

Что возвращает фильтр:

Тип поля Ключи в результате Когда использовать
string ID_поля Для точного значения или поиска по строке
textarea ID_поля Для многострочного значения
list ID_поля Для выбранного значения списка. При множественном выборе значение обрабатывайте как набор выбранных вариантов
number ID_поля, ID_поля_from, ID_поля_to, ID_поля_numsel Для точного числа или диапазона
date ID_поля_from, ID_поля_to, ID_поля_datesel Для выбранного периода или ручного диапазона дат
custom_date ID_поля_days, ID_поля_months, ID_поля_years Для произвольного выбора дней, месяцев и лет
entity_selector ID_поля Для идентификатора выбранного объекта. Если включен addEntityIdToResult, значение содержит тип объекта и идентификатор элемента

Связать с гридом

Для связки с таблицей main.ui.grid используйте один идентификатор для фильтра и таблицы. Фильтр только возвращает выбранные значения; серверный код сам преобразует их в условия выборки и строки грида.

В примере $orders — массив записей. В рабочем коде замените его выборкой из своего источника данных с учетом $ormFilter.

<?php

use Bitrix\Main\UI\Filter\Options;

$gridId = 'orders_grid';
$filterFields = [
    ['id' => 'FIND', 'name' => 'Поиск'],
    ['id' => 'STATUS', 'name' => 'Статус', 'type' => 'list'],
];

$filterOptions = new Options($gridId);
$filter = $filterOptions->getFilter($filterFields);
$ormFilter = [];

if (!empty($filter['STATUS']))
{
    $ormFilter['=STATUS'] = $filter['STATUS'];
}

if (!empty($filter['FIND']))
{
    $ormFilter['%TITLE'] = $filter['FIND'];
}

$orders = [
    [
        'ID' => 1,
        'TITLE' => 'Заказ на доставку',
        'STATUS' => 'Новый',
    ],
];

$rows = [];
foreach ($orders as $order)
{
    $rows[] = [
        'id' => $order['ID'],
        'data' => [
            'ID' => $order['ID'],
            'TITLE' => $order['TITLE'],
            'STATUS' => $order['STATUS'],
        ],
    ];
}

$APPLICATION->IncludeComponent(
    'bitrix:main.ui.filter',
    '',
    [
        'FILTER_ID' => $gridId,
        'GRID_ID' => $gridId,
        'FILTER' => $filterFields,
    ]
);

$APPLICATION->IncludeComponent(
    'bitrix:main.ui.grid',
    '',
    [
        'GRID_ID' => $gridId,
        'COLUMNS' => [
            ['id' => 'ID', 'name' => 'ID', 'default' => true],
            ['id' => 'TITLE', 'name' => 'Название', 'default' => true],
            ['id' => 'STATUS', 'name' => 'Статус', 'default' => true],
        ],
        'ROWS' => $rows,
    ]
);

Описать поля

Основные ключи поля:

Ключ Тип Описание
id string Обязательный идентификатор поля. По нему значение возвращается в массиве фильтра
name string Обязательная подпись поля в интерфейсе
type string Тип поля. Если ключ не указан, используется строковое поле. Передавайте значение в нижнем регистре
default bool true показывает поле в фильтре по умолчанию
items array Варианты для списков. Для поля list передайте массив, где ключ станет значением фильтра, а значение массива — подписью в интерфейсе
params array Дополнительные параметры поля. Для списков в нем задают множественный выбор
exclude array Список подтипов даты, которые нужно убрать из выбора
sectionId string Идентификатор секции, если поля сгруппированы через HEADERS_SECTIONS

Строка и текст

Тип string подходит для короткого значения или поиска по части текста.

<?php

$field = [
    'id' => 'TITLE',
    'name' => 'Название',
    'type' => 'string',
    'default' => true,
];

Тип textarea используйте для многострочного значения. Оба типа возвращают значение по ключу поля.

Список

Тип list показывает выпадающий список. В items передайте массив вариантов, где ключ станет значением фильтра, а значение массива — подписью в интерфейсе.

<?php

$field = [
    'id' => 'STATUS',
    'name' => 'Статус',
    'type' => 'list',
    'items' => [
        '' => 'Любой',
        'new' => 'Новый',
        'done' => 'Выполнен',
    ],
];

Для множественного выбора передайте ключ multiple со значением 'Y' в массиве params.

<?php

$field = [
    'id' => 'STATUS',
    'name' => 'Статус',
    'type' => 'list',
    'params' => [
        'multiple' => 'Y',
    ],
    'items' => [
        'new' => 'Новый',
        'progress' => 'В работе',
        'done' => 'Выполнен',
    ],
];

Число

Тип number поддерживает точное значение и диапазон. При выборе диапазона фильтр возвращает ключи с постфиксами _from и _to.

<?php

$field = [
    'id' => 'PRICE',
    'name' => 'Сумма',
    'type' => 'number',
];

Дата

Тип date показывает готовые варианты периода и ручной ввод диапазона. Подтипы даты определены в Bitrix\Main\UI\Filter\DateType.

<?php

use Bitrix\Main\UI\Filter\DateType;

$field = [
    'id' => 'DATE_CREATE',
    'name' => 'Дата создания',
    'type' => 'date',
    'exclude' => [
        DateType::LAST_60_DAYS,
        DateType::LAST_90_DAYS,
    ],
];

Если нужно выбирать время вместе с датой, передайте time.

<?php

$field = [
    'id' => 'DATE_CREATE',
    'name' => 'Дата создания',
    'type' => 'date',
    'time' => true,
];

Тип custom_date используется для произвольного выбора дней, месяцев и лет. Компонент возвращает значения с постфиксами _days, _months и _years.

Выбор объектов

Тип entity_selector подключает интерфейс выбора объектов через ui.entity-selector. Передайте настройки диалога в params.dialogOptions.

<?php

$field = [
    'id' => 'RESPONSIBLE_ID',
    'name' => 'Ответственный',
    'type' => 'entity_selector',
    'params' => [
        'multiple' => 'Y',
        'dialogOptions' => [
            'context' => 'orders_filter',
            'entities' => [
                [
                    'id' => 'user',
                ],
            ],
        ],
    ],
];

Если в одном поле доступны объекты разных типов, передайте ключ addEntityIdToResult со значением 'Y' в массиве params. Тогда значение сохранит идентификатор типа объекта и идентификатор выбранного элемента.

Без этого параметра фильтр возвращает идентификатор выбранного элемента.

Тип dest_selector подходит для выбора пользователей, подразделений и других адресатов через прежний селектор. Используйте его в существующих интерфейсах, где уже настроены параметры этого селектора.

Используйте тип custom_entity, если поле обрабатывает выбор своим JavaScript-кодом и само подставляет подпись выбранного значения. Если новый интерфейс может работать через ui.entity-selector, выбирайте entity_selector.

Добавить пресеты

Пресет задает сохраненный набор значений фильтра. Передайте массив FILTER_PRESETS, где ключ — идентификатор пресета.

<?php

$presets = [
    'active_orders' => [
        'name' => 'Активные заказы',
        'default' => true,
        'fields' => [
            'STATUS' => 'new',
            'DATE_CREATE_datesel' => 'CURRENT_MONTH',
        ],
    ],
];

Основные ключи пресета:

Ключ Тип Описание
name string Обязательное название в меню пресетов
default bool true делает пресет выбранным по умолчанию
fields array Обязательные значения полей. Ключи должны совпадать с id полей или служебными ключами диапазонов
disallow_for_all bool Запрещает применять пресет для всех пользователей, если сценарий поддерживает общие пресеты

Пользовательские настройки фильтра сохраняются по FILTER_ID. Если изменить идентификатор, ранее сохраненные пресеты и выбранные поля не применятся к новому фильтру.