Задача: В каталоге выводится умный фильтр, нужно сделать так чтобы он применялся не
только к товарам но и к компоненту "Список разделов" (catalog.section.list),
что бы оставались только подразделы в которых содержатся найденные товары.
Находим разделы в которых встречаются найденные товары
Суть умного фильтра заключается в том, что наполняет глобальный фильтр индетификаторами найденных товаров. Дальше, просто, применяет его для компонента "Список товаров раздела" - сatalog.section
Мы может передать этот фильтр в параметры компонента "Список разделов"- catalog.section.list. Для этого добавляем к вызову этого компонента параметр 'SMART_FILTER_NAME' => $arParams["FILTER_NAME"],
$sectionListParams = array(
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
"SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TIME" => $arParams["CACHE_TIME"],
"CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
"COUNT_ELEMENTS" => $arParams["SECTION_COUNT_ELEMENTS"],
"TOP_DEPTH" => $arParams["SECTION_TOP_DEPTH"],
"SECTION_URL" => $arResult["FOLDER"] . $arResult["URL_TEMPLATES"]["section"],
"VIEW_MODE" => $arParams["SECTIONS_VIEW_MODE"],
"SHOW_PARENT_NAME" => $arParams["SECTIONS_SHOW_PARENT_NAME"],
"HIDE_SECTION_NAME" => (isset($arParams["SECTIONS_HIDE_SECTION_NAME"]) ? $arParams["SECTIONS_HIDE_SECTION_NAME"] : "N"),
'SMART_FILTER_NAME' => $arParams["FILTER_NAME"], // Передаем глобальный фильтр в компонент
"ADD_SECTIONS_CHAIN" => (isset($arParams["ADD_SECTIONS_CHAIN"]) ? $arParams["ADD_SECTIONS_CHAIN"] : '')
);
if ($sectionListParams["COUNT_ELEMENTS"] === "Y") {
$sectionListParams["COUNT_ELEMENTS_FILTER"] = "CNT_ACTIVE";
if ($arParams["HIDE_NOT_AVAILABLE"] == "Y") {
$sectionListParams["COUNT_ELEMENTS_FILTER"] = "CNT_AVAILABLE";
}
}
$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list",
"list_with_pictures",
$sectionListParams,
$component,
array("HIDE_ICONS" => "Y")
);
unset($sectionListParams);
Теперь в этом компоненте мы знаем какие ID товаров нашел умный фильтр. И зная эти ID можем получить ID разделов в которых они встречаются. Для этого создаем в шаблоне catalog.section.list файл result_modifier.php с содержимым:
if (!empty($GLOBALS[$arParams["SMART_FILTER_NAME"]])) {
$resSections = CIBlockElement::GetList(
false,
$GLOBALS[$arParams["SMART_FILTER_NAME"]],
false,
false,
array(
"IBLOCK_SECTION_ID",
)
);
while ($getSections = $resSections->Fetch()) {
$noSkipSections[] = $getSections['IBLOCK_SECTION_ID'];
}
if (!empty($noSkipSections)) {
foreach ($arResult['SECTIONS'] as $k => $arSection) {
if (!in_array($arSection['ID'], $noSkipSections)) {
unset($arResult['SECTIONS'][$k]); // Убираем не нужные разделы
}
}
}
}
С помощью метода CIBlockElement::GetList, передав в его фильтрацию ID товаров глобального фильтра, наполнили массив $noSkipSection в котором содержаться ID разделов с найденными товарами.
Далее обошли массив с разделами и если ID конкретного раздела не встречается в массиве $noSkipSection удаляем его из массива $arResult['SECTIONS']
Таким образом, в шаблоне catalog.section.list останутся только разделы с найденными товарами.