Умный фильтр не применяется - разбор причин
Форма фильтра отрисована, значения выбираются, а список товаров остаётся прежним. Разбираем причины в порядке убывания частоты.
С чего начать
Смотрим, что вообще попало в переменную фильтра:
// в шаблоне списка товаров, до вызова компонентаecho '<pre>', print_r($GLOBALS['arrFilter'] ?? 'переменной нет', true), '</pre>';Пустая переменная означает, что список и форма разговаривают на разных именах. Заполненная переменная при неизменившемся списке означает, что фильтр до выборки доходит, но выборка его не учитывает.
Проверяем, какие свойства объявлены фильтруемыми:
$res = CIBlockProperty::GetList([], ['IBLOCK_ID' => 5, 'SMART_FILTER' => 'Y']);while ($prop = $res->Fetch()) { printf("%-20s %-10s тип показа=%s\n", $prop['CODE'], $prop['PROPERTY_TYPE'], $prop['DISPLAY_TYPE']);}В форму попадают только свойства из этого списка. Пустой результат объясняет пустую форму фильтра лучше любых настроек компонента.
Проверяем выборку по свойству без участия фильтра:
// та же выборка, что делает список товаров, но с условием прямо в коде$res = CIBlockElement::GetList([], [ 'IBLOCK_ID' => 5, 'ACTIVE' => 'Y', 'PROPERTY_MATERIAL_VALUE' => 'дерево',], false, false, ['ID', 'NAME']);printf("товаров с этим значением: %d\n", $res->SelectedRowsCount());Ноль здесь снимает вопрос к фильтру: значения у товаров просто нет. Ненулевой результат при пустом списке на витрине означает, что условие до выборки не доезжает, и разбираться надо с параметрами компонентов.
Сбрасываем кэш и повторяем запрос:
# кэш компонентов лежит отдельным каталогом, его удаление безопасноrm -rf /home/bitrix/www/bitrix/cache/s1/catalog/ls /home/bitrix/www/bitrix/managed_cache/ | head
# сколько места занимал кэш каталога до сбросаdu -sh /home/bitrix/www/bitrix/cache/s1/ 2>/dev/nullИзменившийся после сброса результат означает, что список отдавался из кэша. Ключ кэша собирается по параметрам компонента, и условия фильтра в него попадают не всегда.
Причины
-
У фильтра и списка разные имена переменной примерно 40% случаев
ПризнакФорма собирается, счётчики считаются, список товаров не меняется вовсе.
ПроверкаСверяем параметр с именем фильтра у обоих компонентов и печатаем саму переменную.
Что делатьПриводим имя к одному значению у формы и у списка: другой связи между ними нет.
-
Свойство не участвует в умном фильтре примерно 25% случаев
ПризнакФорма пустая или в ней нет части свойств, хотя у товаров они заполнены.
ПроверкаВыбираем свойства инфоблока с включённым участием в фильтре выборкой выше.
Что делатьСтавим флаг участия и тип отображения у нужных свойств в настройках инфоблока.
-
Фильтр стоит вне комплексного компонента каталога примерно 15% случаев
ПризнакФильтр на странице новостей или в своём разделе, адреса фильтрации не собираются.
ПроверкаСмотрим, каким компонентом выводится список: у новостей своя выборка и свой фильтр.
Что делатьПереносим фильтр в каталог либо связываем его со списком вручную через переменную фильтра.
-
Список отдаётся из кэша примерно 12% случаев
ПризнакПервый запрос фильтрации работает, последующие возвращают ту же выборку.
ПроверкаСбрасываем кэш компонента и повторяем запрос: если результат изменился, причина в нём.
Что делатьВключаем учёт параметров фильтра в ключе кэша или отключаем кэширование списка на время отладки.
-
Правило адресов фильтрации не совпадает с настройками примерно 8% случаев
ПризнакВыбор значения в форме приводит на страницу 404 вместо отфильтрованного списка.
ПроверкаСверяем шаблон адреса фильтрации в параметрах комплексного компонента с правилом обработки адресов.
Что делатьПриводим шаблоны к одному виду и пересохраняем страницу каталога, чтобы правило перезаписалось.
Частые вопросы
Почему фильтр работает в разделе, но не в корне каталога?
В корне нет раздела, и правило адресов должно допускать пустой путь раздела. Иначе адрес фильтрации не разбирается, и каталог отдаёт страницу не найдена.
Можно ли фильтровать список новостей умным фильтром?
Компонент рассчитан на каталог: он опирается на данные торгового каталога и на адреса комплексного компонента. Для новостей проще собрать свою форму и передать условия в переменную фильтра.
Фильтр применяется, но товаров ноль - это ошибка?
Не обязательно: у товаров может не быть выбранных значений. Проверяют это выборкой по свойству без участия компонента.
Почему после сброса фильтра список остаётся отфильтрованным?
Условия сохраняются в сессии, а не только в адресе. Отключают сохранение в сессии, чтобы состояние фильтра целиком определялось адресом страницы.
Смежное
- Фильтр по цене и наличию: диапазон, валюта, склад - почему товар со скидкой не попал в отрезок
- Умный фильтр - оглавление подтемы
- Умный фильтр: настройка, свойства и адреса фильтрации - как настраивается штатно
- Витрина каталога: список раздела, сортировка, фильтр - выборка списка товаров
- Компоненты 2.0 - параметры и кэш компонентов
- Количество товаров в фильтре: фасетный индекс и пустые значения - откуда берутся числа рядом со значениями
- Умный фильтр изнутри: от адреса до выборки товаров - где в цепочке теряются условия отбора