Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента подключены в файле section.php комплексного шаблона. Соотвественно, оба фильтра отображаются во всех разделах и подразделах каталога, не зависимо, от грубины вроженности. Нужно отобразить верхний фильтр- только на первых уровнях.
Соответственно, оба фильтра отображаются во всех разделах и подразделах каталога, не зависимо, от глубины врожености. Нужно отобразить верхний фильтр- только на первых уровнях.
Получение самого верхнего родительского раздела инфоблока
Нам нужно определить, является ли текущий раздел, в котором находится пользователь, корневым. Для этого воспользуемся методом CIBlockSection::GetNavChain - возвращает путь по дереву от корня до раздела SECTION_ID
$navChain = CIBlockSection::GetNavChain(
$arParams["IBLOCK_ID"],
$arResult['VARIABLES']['SECTION_ID']
);
while ($arNav = $navChain->Fetch()) {
var_dump($arNav);
}
Передали параметры из комплексного шаблона ID инфоблока и ID текущего раздела. В var_dump получим всю цепочку разделов, с основными параметрами разделов- начиная с корневого.
Далее: нужно получить ID корневого раздела и сопоставить с текущим. Просто оборвем цикл while на первой итерации, сопоставим разделы и создадим переменную для дальнейшего сравнения.
$navChain = CIBlockSection::GetNavChain(
$arParams["IBLOCK_ID"],
$arResult['VARIABLES']['SECTION_ID']
);
while ($arNav = $navChain->Fetch()) {
if ($arResult['VARIABLES']['SECTION_ID'] == $arNav['ID']) {
$itMainSection = true;
}
break;}
Здесь мы создали переменную $itMainSection при условии если текущий раздел совпал с корневым. Дальше, просто, обворачиваем фильтр в условие.
if ($itMainSection) {
$APPLICATION->IncludeComponent(
"bitrix:catalog.smart.filter",
...
Компонент фильтра
...
);
}
Если переменная $itMainSection существует, значит пользователь находится в корневом разделе и выводится умный фильтр.
Дополнительные поля раздела.
Расширение первоначальной задачи: нужно показывать фильтр во всех разделах, но в некоторых его нужно скрыть. При этом, в пользовательском поле указывается Показывать фильтр Да/Нет. Что бы не проходиться по всем вложенным, достаточно указать этот параметр только у корневого раздела.
В примере выше, метод CIBlockSection::GetNavChain не возвращает пользовательские поля, если нужно выполнить двойную проверку, например: корневой ли раздел и заполнено ли его пользовательское поле. Нужно добавить метод CIBlockSection::GetList получив пользовательские поля.
В примере ниже, выполняется проверка: корневой ли раздел и установлено ли пользовательское поле раздела UF_TOP_FILTER.
$navChain = CIBlockSection::GetNavChain($arParams["IBLOCK_ID"], $arResult['VARIABLES']['SECTION_ID']);
while ($arNav = $navChain->GetNext()) {
$db_list = CIBlockSection::GetList(array($by => $order),
$arFilter = array("IBLOCK_ID" => $arParams["IBLOCK_ID"], "ID" => $arNav["ID"]), true,
$arSelect = array('ID', 'UF_TOP_FILTER'));
while ($ar_result = $db_list->GetNext()) {
if ($ar_result['UF_TOP_FILTER'] == true) {
$itMainSection = true;
}
}
break;}
Такой проверки достаточно: в любом подразделе, этого раздела - не зависимо от глубины вложенности, фильтр показываться не будет.