Вывести информацию, только на первом уровне раздела каталога, в 1С-Битрикс

Просмотров: 7456

Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента подключены в файле section.php комплексного шаблона. Соотвественно, оба фильтра отображаются во всех разделах и подразделах каталога, не зависимо, от грубины вроженности. Нужно отобразить верхний фильтр- только на первых уровнях.

Соответственно, оба фильтра отображаются во всех разделах и подразделах каталога, не зависимо, от глубины врожености. Нужно отобразить верхний фильтр- только на первых уровнях.

Вывести информацию, только на первом уровне раздела каталога, в 1С-Битрикс

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

Нам нужно определить, является ли текущий раздел, в котором находится пользователь, корневым. Для этого воспользуемся методом 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;}

Такой проверки достаточно: в любом подразделе, этого раздела - не зависимо от глубины вложенности, фильтр показываться не будет.

barder 20.03.2022
Что то так сложно все.
Я сделал проще:
Код
if ($APPLICATION->GetCurPage() == $arParams['IBLOCK_URL']){echo "Мы в корне"}
Михаил Базаров 20.03.2022
Цитата
barder пишет:
if ($APPLICATION->GetCurPage() == $arParams['IBLOCK_URL']){echo "Мы в корне"}

Тут немножко сложнее все)
Не в корне каталога, а в корневом разделе - без учета подразделов.