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

Умный фильтр не применяется - разбор причин

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

С чего начать

Смотрим, что вообще попало в переменную фильтра:

// в шаблоне списка товаров, до вызова компонента
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

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

Причины

  1. У фильтра и списка разные имена переменной примерно 40% случаев

    ПризнакФорма собирается, счётчики считаются, список товаров не меняется вовсе.

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

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

  2. Свойство не участвует в умном фильтре примерно 25% случаев

    ПризнакФорма пустая или в ней нет части свойств, хотя у товаров они заполнены.

    ПроверкаВыбираем свойства инфоблока с включённым участием в фильтре выборкой выше.

    Что делатьСтавим флаг участия и тип отображения у нужных свойств в настройках инфоблока.

  3. Фильтр стоит вне комплексного компонента каталога примерно 15% случаев

    ПризнакФильтр на странице новостей или в своём разделе, адреса фильтрации не собираются.

    ПроверкаСмотрим, каким компонентом выводится список: у новостей своя выборка и свой фильтр.

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

  4. Список отдаётся из кэша примерно 12% случаев

    ПризнакПервый запрос фильтрации работает, последующие возвращают ту же выборку.

    ПроверкаСбрасываем кэш компонента и повторяем запрос: если результат изменился, причина в нём.

    Что делатьВключаем учёт параметров фильтра в ключе кэша или отключаем кэширование списка на время отладки.

  5. Правило адресов фильтрации не совпадает с настройками примерно 8% случаев

    ПризнакВыбор значения в форме приводит на страницу 404 вместо отфильтрованного списка.

    ПроверкаСверяем шаблон адреса фильтрации в параметрах комплексного компонента с правилом обработки адресов.

    Что делатьПриводим шаблоны к одному виду и пересохраняем страницу каталога, чтобы правило перезаписалось.

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

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

В корне нет раздела, и правило адресов должно допускать пустой путь раздела. Иначе адрес фильтрации не разбирается, и каталог отдаёт страницу не найдена.

Можно ли фильтровать список новостей умным фильтром?

Компонент рассчитан на каталог: он опирается на данные торгового каталога и на адреса комплексного компонента. Для новостей проще собрать свою форму и передать условия в переменную фильтра.

Фильтр применяется, но товаров ноль - это ошибка?

Не обязательно: у товаров может не быть выбранных значений. Проверяют это выборкой по свойству без участия компонента.

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

Условия сохраняются в сессии, а не только в адресе. Отключают сохранение в сессии, чтобы состояние фильтра целиком определялось адресом страницы.

Смежное

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