Yandex Metrika
sanches.free 1 просмотр

Подборки товаров и умный фильтр 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 дней гарантии