Перейти к содержимому

Умный фильтр - настройка, свойства и адреса фильтрации

Настраиваем умный фильтр на витрине каталога и связываем его со списком товаров так, чтобы выборка менялась.

Решение

Включаем свойство в фильтрацию:

$prop = new CIBlockProperty();
$prop->Update($propertyId, [
'SMART_FILTER' => 'Y', // без этого флага свойства в форме не будет
'DISPLAY_TYPE' => 'F', // F - флажки, A - ползунок, P - выпадающий
// тип отображения меняют только вместе с пересборкой фасетного индекса
]);

Флаг живёт у свойства инфоблока, а не в параметрах компонента. Тип отображения задаётся там же и определяет, чем свойство будет в форме: набором флажков, ползунком диапазона или списком.

Ставим компонент фильтра:

$APPLICATION->IncludeComponent('bitrix:catalog.smart.filter', '', [
'IBLOCK_TYPE' => 'catalog',
'IBLOCK_ID' => 5,
'SECTION_ID' => $sectionId,
'FILTER_NAME' => 'arrFilter', // это же имя получит список товаров
'PRICE_CODE' => ['BASE'], // типы цен, по которым строится ползунок
'SEF_MODE' => 'Y',
]);

Имя переменной фильтра - единственная связь между формой и списком. Компонент кладёт собранные условия в переменную с этим именем, и больше ничего о списке не знает.

Связываем фильтр со списком товаров:

$APPLICATION->IncludeComponent('bitrix:catalog.section', '', [
'IBLOCK_ID' => 5,
'FILTER_NAME' => 'arrFilter', // ровно то же имя, что у фильтра
'SECTION_ID' => $sectionId,
]);

Разные имена у двух компонентов - самая частая причина «фильтр не применяется». Форма при этом работает как ни в чём не бывало, счётчики считаются правильно, а список товаров выбирает записи без всяких условий фильтрации.

Настраиваем адреса фильтрации:

'SEF_MODE' => 'Y',
'SEF_RULE' => '/catalog/#SECTION_CODE_PATH#/filter/#SMART_FILTER_PATH#/',
'SAVE_IN_SESSION' => 'N', // условия живут в адресе, а не в сессии

Условия фильтра, попавшие в адрес страницы, переживают перезагрузку и передаются обычной ссылкой другому человеку. Кириллические названия свойств превращаются при этом в длинные коды: чтобы адрес читался, свойствам задают латинские символьные коды.

Включаем мгновенную фильтрацию:

'INSTANT_RELOAD' => 'Y', // пересчёт счётчиков на каждое изменение формы
'AJAX_MODE' => 'Y',
'CACHE_TIME' => 36000,

Мгновенный режим обновляет список без перезагрузки страницы и сразу показывает, сколько товаров останется. Каждое изменение формы при этом уходит отдельным запросом на сервер.

Мгновенная фильтрация требует, чтобы фильтр и список стояли на одной странице внутри одного каталога. Пересчёт счётчиков идёт отдельным запросом на каждое изменение формы, поэтому на большом каталоге режим заметно нагружает базу.

Порядок настройки всегда один: сначала свойства, потом компоненты, потом адреса. Настроенный фильтр над непроставленными свойствами показывает пустую форму, а настроенные адреса без совпадающего правила каталога дают 404 на первом же запросе фильтрации.

Типичные проблемы

Фильтр показывается, но список не меняется.

У фильтра и списка разные имена переменной фильтра. Связь между компонентами держится только на этом имени.

Нужного свойства нет в форме фильтра.

У свойства не включено участие в умном фильтре. Параметры компонента этот флаг не заменяют.

Адрес фильтрации состоит из кириллических кодов.

У свойств и их значений нет латинских символьных кодов. В адрес подставляется то, что есть, и он становится нечитаемым.

После фильтрации открывается 404.

Правило адресов фильтрации не совпадает с настройками комплексного компонента. Каталог не узнаёт собранный адрес и отдаёт страницу не найдена.

Счётчики значений показывают нули.

Свойства у товаров не заполнены либо данные фильтра не пересчитаны. Количество считается по фактическим значениям элементов.

Частые вопросы

Как отфильтровать товары по наличию?

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

Можно ли вывести фильтр в пять колонок?

Да, это задача шаблона компонента: разметка формы целиком в нём. Логика фильтрации от оформления не зависит.

Почему фильтр не работает в корне каталога?

В корне нет раздела, и компонент собирает форму по всему инфоблоку. Правило адресов при этом должно допускать пустой путь раздела, иначе адрес не разбирается.

Работает ли умный фильтр вне комплексного компонента каталога?

Форму он построит, но адреса фильтрации собирать будет некому. Связывать фильтр со списком придётся вручную, а условия хранить в сессии или в параметрах запроса.

Смежное

Первоисточник