Битрикс — Как построить навигацию для разделов и подразделов

Из данной статьи вы узнаете как можно построить навигационную цепочку зная один лишь символьный код раздела.

Как по символьному коду раздела построить хлебные крошки в Битриксе

Перед прочтением данной статьи советую почитать Как добавить в хлебные крошки название. Прочитали? Тогда идем дальше.

В старых компонентах бывали случаи, когда в массиве хранится только символьный код раздела. Данная переменная называлась $arResult[‘VARIABLES’][‘SECTION_CODE’].

Если на вашем сайте символьные коды разделов уникальны (что рекомендуется всегда выставлять в настройках инфоблока), то проблем не будет. Для начала находим файл section.php вашего компонента.

$rsSect = CIBlockSection::GetList(
	array(),
	array('IBLOCK_ID' => $arParams["IBLOCK_ID"], '=CODE' => $arResult['VARIABLES']['SECTION_CODE']),
	false,
	array('ID', 'NAME', 'UF_TEXT_TOP', 'DEPTH_LEVEL', 'SECTION_PAGE_URL')
);
if ( $arSect = $rsSect->GetNext() ) {
	$SEC_LVL = $arSect['DEPTH_LEVEL'];
	$SEC_NAME = $arSect['NAME'];
	$SEC_URL = $arSect['SECTION_PAGE_URL'];
}

Обратите внимание на строчку ‘=CODE’ => $arResult[‘VARIABLES’][‘SECTION_CODE’]. Также, мы используем if, вместо привычного цикла while, т.к. нам нужны данные только по одному разделу.

Записываем 3 переменные, которые нам понадобятся:
— уровень вложенности, DEPTH_LEVEL
— имя, NAME
— ссылка на раздел, SECTION_PAGE_URL

ВАЖНО. Перед следующим этапом отключите в своем компоненте настройку «добавлять раздел\инфоблок в цепочку навигации»

В самом конце файла section.php добавляем код:

<?
if ($SEC_LVL >= 2) {
	$rsSect = CIBlockSection::GetList(
		array(),
		array('IBLOCK_ID' => $arParams["IBLOCK_ID"], '=CODE' => $arResult['VARIABLES']['SECTION_CODE']),
		false,
		array('ID', 'NAME', 'SECTION_PAGE_URL')
	);
	while ( $arSect2 = $rsSect->GetNext() ) {
		if (strstr($curSectionURL, $arSect2['SECTION_PAGE_URL'])) {
			$SEC_NAME = $arSect2['NAME'];
			$SEC_URL = $arSect2['SECTION_PAGE_URL'];
			break;
		}
	}
	$result = array();
	$ibsTreeResource = CIBlockSection::GetNavChain( false, $arSect2['ID'], array( "ID", "NAME") );
	$c = 0;
	while($sectionItem = $ibsTreeResource->Fetch()){
		$result[$c]['NAME'] = $sectionItem['NAME'];
		$res = CIBlockSection::GetByID($sectionItem["ID"]);
		if($ar_res = $res->GetNext()) {
			$url = $ar_res['SECTION_PAGE_URL'];
		}
		$result[$c]['URL'] = $url;
		$c++;
	}

	foreach ($result as $arItem) {
		$APPLICATION->AddChainItem($arItem['NAME'], $arItem['URL']);
	}
} else {
	$APPLICATION->AddChainItem($SEC_NAME, $SEC_URL);
}
?>

При помощи CIBlockSection::GetNavChain выстраиваем полный путь до родительского раздела (если это подраздел), и добавляем через цикл в цепочку навигации Название и Ссылку. Если эже это раздел 1-го уровня, то просто добавляем его Название и Ссылку.

Например, наш код равен armstrong. Полученный результат выглядит приблизительно следующим образом:
Каталог / Офисные светодиодные светильники / Светильники Армстронг

URL при этом имеет вид:

/catalog/ofisnye-svetilniki/armstrong/

Ссылка на Каталог проставляется сама.
Офисные светодиодные светильники — это главный раздел.
Светильники Армстронг — раздел, в котором мы сейчас находимся. Компонент хлебных крошек не ставит ссылку на него.

Вот и всё, надеюсь у вас всё получилось :). ПС код не идеален и применялся для старых проектов, его можно улучшить.

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

Какие услуги предоставляю:
- Создание сайтов, шаблонов и компонентов на 1С-Битрикс;
- Разработка функционала с нуля и доработка кода на уже созданных проектах;
- Адаптивная вёрстка макетов и натяжка на Битрикс;
- Парсинг файлов и выгрузка на сайт (форматы - CSV, XML, XLSX, JSON)
- Интеграции со сторонними сервисами по API;
- Многоязычные версии и многое другое.

Если у вас остались вопросы, свяжитесь со мной любым удобным для вас способом или оставьте комментарий внизу.
E-mail: dmitriyribka@gmail.com
Skype: cinemacreaterus

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *