Умный фильтр - настройка, свойства и адреса фильтрации
Настраиваем умный фильтр на витрине каталога и связываем его со списком товаров так, чтобы выборка менялась.
Решение
Включаем свойство в фильтрацию:
$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.
Правило адресов фильтрации не совпадает с настройками комплексного компонента. Каталог не узнаёт собранный адрес и отдаёт страницу не найдена.
Счётчики значений показывают нули.
Свойства у товаров не заполнены либо данные фильтра не пересчитаны. Количество считается по фактическим значениям элементов.
Частые вопросы
Как отфильтровать товары по наличию?
Наличие приходит из торгового каталога, а не из свойств инфоблока. В фильтре его включают отдельным параметром компонента, а не флагом свойства.
Можно ли вывести фильтр в пять колонок?
Да, это задача шаблона компонента: разметка формы целиком в нём. Логика фильтрации от оформления не зависит.
Почему фильтр не работает в корне каталога?
В корне нет раздела, и компонент собирает форму по всему инфоблоку. Правило адресов при этом должно допускать пустой путь раздела, иначе адрес не разбирается.
Работает ли умный фильтр вне комплексного компонента каталога?
Форму он построит, но адреса фильтрации собирать будет некому. Связывать фильтр со списком придётся вручную, а условия хранить в сессии или в параметрах запроса.
Смежное
-
Фильтр по цене и наличию: диапазон, валюта, склад - два самых частых условия фильтра
-
Умный фильтр - оглавление подтемы
-
Умный фильтр не применяется - разбор причин
-
Витрина каталога: список раздела, сортировка, фильтр - что выводит список товаров
-
Компоненты 2.0 - как компоненты обмениваются данными
-
Свойства-списки: значения, сортировка, значение по умолчанию - порядок значений в форме фильтра
-
Заголовки и метатеги каталога: шаблоны для разделов и товаров - заголовки страниц фильтрации
-
Количество товаров в фильтре: фасетный индекс и пустые значения - откуда берутся числа рядом со значениями
-
Шаблон сайта на практике: стили, скрипты, области - обвязка вокруг компонентов
-
Свой компонент: когда нужен и из чего состоит - когда шаблона уже мало
-
Поиск по сайту на практике: индекс, настройка, выдача - работа с индексом поиска
-
Фасетный индекс: зачем нужен и когда пересобирать - что делает фильтр быстрым
-
Фильтр по свойствам предложений: настройка, индекс, вывод - когда размер и цвет живут у предложений
-
Умный фильтр изнутри: от адреса до выборки товаров - что происходит между адресом и выборкой