Выводим названия разделов инфоблоков в Битриксе

1С-БитриксПоддержка и сопровождение сайта, помимо обычного добавления информации (новости, статьи и т.д.) на веб-ресурс, часто подразумевает изменение или добавление какого-либо функционала. Для сайта «Детский МИР (музей истории русской) открытки» возникла потребность разделения новостного раздела на разделы (подкатегории) и последующий вывод названий этих разделов на странице списка всех новостей.

Используем компонент «news.list»

Для вывода списка новостей используется стандартный компонент «news.list». Шаблон компонента находится по адресу: /bitrix/templates/site-template/components/bitrix/news/news-template/bitrix/news.list/.default/template.php. Соответственно, для реализации задачи нам потребуется его редактирование. Обратимся к интернету. На профильном форуме для разработчиков «1С-Битрикс» находим нужное нам решение «Вывод названия раздела инфоблока» (http://dev.1c-bitrix.ru/support/forum/forum6/topic9567/) и конкретно код:

<?  
$infoblock = ХХХ; // Инфоблок с ID ХХХ (необходимо установить ID нужного инфоблока)
$rs_Section = CIBlockSection::GetList(array('left_margin' => 'asc'), array('IBLOCK_ID' => $infoblock));
while ( $ar_Section = $rs_Section->Fetch() ) {
    $ar_Resu[] = array(  // собираем массив того, что нам нужно
        'ID' => $ar_Section['ID'], // id раздела
        'NAME' => $ar_Section['NAME'], // имя раздела (что нас, собственно, интересует)
        'IBLOCK_SECTION_ID' => $ar_Section['IBLOCK_SECTION_ID'],
        'LEFT_MARGIN' => $ar_Section['LEFT_MARGIN'],
        'RIGHT_MARGIN' => $ar_Section['RIGHT_MARGIN'],
        'DEPTH_LEVEL' => $ar_Section['DEPTH_LEVEL'],
    ); 
    print_r($ar_Resu); // смотрим, что у нас собралось в массив
}
foreach ($ar_Resu as $section) {
    echo $section["NAME"] . " "; // Выводим имена разделов
}
?>

Далее мы будем использовать переменную

$ar_Resu[$arItem["IBLOCK_SECTION_ID"]]["NAME"]

в нужном месте, которая будет выводит нам название раздела, к которому относится элемент инфоблока.

Если элемент входит в несколько разделов

Все бы ничего, но этот способ подходит только для случая, когда элемент инфоблока входит в состав одного раздела. В случае, если элементу необходимо вхождение в несколько разделов, указанный код выведет нам название только одного раздела с меньшим ID.

На упомянутом выше форуме находим еще одно решение «Список разделов элемента»: http://dev.1c-bitrix.ru/support/forum/forum6/topic34935/. Для вывода списка разделов используется функция CIBlockElement::GetElementGroups. Она возвращает группы, которым принадлежит элемент, по его коду ID:

<?
$db_old_groups = CIBlockElement::GetElementGroups($arResult['ID'], false);
while($ar_group = $db_old_groups->Fetch()) {
    echo $ar_group["NAME"];
}
?>

В нашем случае мы будем использовать следующий код, при этом arResult заменим на arItem:

<?
$temp=0;
$db_old_groups = CIBlockElement::GetElementGroups($arItem['ID'], false);
while($ar_group = $db_old_groups->Fetch()) {
	$temp++; // Проверим, к какому количеству разделов принадлежит элемент
}
if ($temp == 1) { // Если элемент принадлежит только к одному разделу
	$db_old_groups = CIBlockElement::GetElementGroups($arItem['ID'], false);
	while($ar_group = $db_old_groups->Fetch()) {
		echo 'Раздел: ' . $ar_group["NAME"];
	}
}
else { // Если элемент принадлежит более чем к одному разделу
	echo 'Разделы: ';
	$db_old_groups = CIBlockElement::GetElementGroups($arItem['ID'], false);
	while($ar_group = $db_old_groups->Fetch()) {
		echo $ar_group["NAME"] . ' ';
	}
}
?>

Готово! Теперь мы умеем узнавать название раздела, в который входит элемент инфоблока (функция, не предусмотренная стандартным функционалом Битрикс) и узнавать все названия разделов, если элемент инфоблока входит в состав более одного из них.