Поддержка и сопровождение сайта, помимо обычного добавления информации (новости, статьи и т.д.) на веб-ресурс, часто подразумевает изменение или добавление какого-либо функционала. Для сайта «Детский МИР (музей истории русской) открытки» возникла потребность разделения новостного раздела на разделы (подкатегории) и последующий вывод названий этих разделов на странице списка всех новостей.
Используем компонент «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"] . ' '; } } ?>
Готово! Теперь мы умеем узнавать название раздела, в который входит элемент инфоблока (функция, не предусмотренная стандартным функционалом Битрикс) и узнавать все названия разделов, если элемент инфоблока входит в состав более одного из них.