Подборки товаров и умный фильтр Bitrix: предфильтр PREFILTER_NAME
В чём несостыковка
Вы сверстали основной каталог: разделы, умный фильтр, связка со списком товаров. Затем появились промо-страницы, которые не являются узлом дерева категорий: фиксированный список позиций, линейки по значению одного свойства, «новинки» по признаку. Для bitrix:catalog.section вы давно задаёте глобальный массив фильтра и передаёте его имя через FILTER_NAME, и выдача сужается предсказуемо.
С публичным компонентом bitrix:catalog.smart.filter исторически было иначе: он не понимал, что вы уже отрезали лишнее, поэтому в блоке параметров торчали варианты «для всего каталога», а число подходящих товаров в счётчиках не совпадало с тем, что реально доступно пользователю на этой странице. Отсюда либо сторонние решения по фильтрации, либо обходные ветви вёрстки.
Что поменялось в коде платформы
С версии модуля информационных блоков 18.6.200 фильтру можно указать второй источник условий. Параметр PREFILTER_NAME задаёт имя глобального массива (аналогично тому, как вы пробрасываете FILTER_NAME): до пользовательских кликов по facet-ам накладывается этот базовый набор ограничений. В результате остаются только релевантные значения свойств и корректные счётчики в рамках подборки.
Пример со списком идентификаторов
Нужно собрать витрину из товаров с заранее известными ID. Перед подключением компонентов объявляете глобал и массив, затем одинаково называете его в параметре умного фильтра как PREFILTER_NAME и синхронизируете фильтр списка через FILTER_NAME.
global $catalogShelfPrefilter;
$catalogShelfPrefilter = [
"ID" => [842, 917, 1003],
];
$APPLICATION->IncludeComponent(
"bitrix:catalog.smart.filter",
".default",
[
"IBLOCK_TYPE" => $arParams["CATALOG_IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["CATALOG_IBLOCK_ID"],
"SECTION_ID" => $arParams["LANDING_SECTION_ID"],
"FILTER_NAME" => "arrShelfFilter",
"PREFILTER_NAME" => "catalogShelfPrefilter",
],
$component,
["HIDE_ICONS" => "Y"],
);
$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
".default",
[
"IBLOCK_TYPE" => $arParams["CATALOG_IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["CATALOG_IBLOCK_ID"],
"SECTION_ID" => $arParams["LANDING_SECTION_ID"],
"FILTER_NAME" => "arrShelfFilter",
],
$component,
["HIDE_ICONS" => "Y"],
);После сборки фильтра в $GLOBALS["arrShelfFilter"] оказываются и пользовательские условия из facet-виджета, и базовый список ID: на странице видны только позиции из подборки, а свойства фильтра отражают ту же ограниченную совокупность.
Выборка по признаку
Для сценария «только маркетинговая метка» достаточно положить в предфильтр условие по свойству инфоблока; используйте тот символьный код, который задан у вас для флага «новинки» или «хиты».
$catalogShelfPrefilter = [
"PROPERTY_MARKET_LAUNCH_Y" => 1,
];На что смотреть при внедрении
- Глобал с именем из
PREFILTER_NAMEдолжен существовать к моменту вызоваIncludeComponentумного фильтра. - Строковое имя общего фильтра
FILTER_NAMEзадаёт один и тот же массив и для умного фильтра, и для секции каталога, чтобы условия накапливались в одной точке шаблона. - Обновление модуля
iblockдо указанной ветки — обязательное условие, иначе параметр просто будет проигнорирован типовым кодом без явной ошибки.
Итог
PREFILTER_NAME сводит умный фильтр и искусственные подборки в одну логическую модель: facet-виджет и счётчики считаются в пределах той же узкой выборки, что видит клиент рядом в списке товаров, без отдельного кастомного фильтрующего приложения.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии