Как вывести элементы всех подразделов на одной странице в 1С-Битрикс
Иногда возникает задача вывести на одной странице не только информацию о текущем разделе, но и все элементы его подразделов. Например, есть раздел «Цветы», внутри которого находятся подразделы «Розы», «Тюльпаны», «Пионы» и другие.
Стандартный компонент bitrix:news.list умеет выводить элементы только одного раздела. Но если требуется сформировать страницу, на которой подряд отображаются все подразделы вместе со своими элементами, придется сделать это самостоятельно.
Ниже рассмотрим один из наиболее удобных способов реализации.
Получаем ID текущего раздела
Если код размещается внутри шаблона комплексного компонента bitrix:news, идентификатор текущего раздела уже находится в массиве $arResult["VARIABLES"].
Дополнительно получать его через CIBlockFindTools::GetSectionID() нет необходимости.
$sectionId = $arResult["VARIABLES"]["SECTION_ID"];
Получаем список подразделов
Теперь необходимо выбрать все дочерние разделы текущего раздела.
$arFilter = [
"SECTION_ID" => $sectionId
];
$rsSect = CIBlockSection::GetList(
["SORT" => "ASC"],
$arFilter,
false,
[
"ID",
"NAME",
"SECTION_PAGE_URL",
"UF_PRE"
]
);
В примере дополнительно выбирается пользовательское поле UF_PRE, которое содержит краткое описание раздела.
Выводим подразделы
Теперь можно пройтись по найденным подразделам и вывести для каждого из них собственный заголовок, описание и список элементов.
<?while ($arSect = $rsSect->GetNext()):?>
<div class="service-section-block">
<h2><?=$arSect["NAME"]?></h2>
<?if ($arSect["UF_PRE"]):?>
<p><?=$arSect["UF_PRE"]?></p>
<?endif;?>
...
здесь будет компонент news.list
...
</div>
<?endwhile;?>
Подключаем news.list
Внутри каждого подраздела остается подключить компонент bitrix:news.list, передав ему ID текущего подраздела.
Самое главное здесь — параметр PARENT_SECTION.
"PARENT_SECTION" => $arSect["ID"]
Благодаря этому компонент автоматически выведет элементы только нужного подраздела, используя все остальные настройки родительского компонента.
Остальные параметры можно оставить такими же, как у основного компонента bitrix:news.
Использование разных шаблонов
При необходимости отдельным подразделам можно назначить собственные шаблоны вывода.
$template = "";
if ($arSect["ID"] == 50)
{
$template = "roses_more";
}
После этого достаточно передать переменную в качестве имени шаблона при подключении компонента.
$APPLICATION->IncludeComponent(
"bitrix:news.list",
$template,
$arParams,
$component
);
Преимущества подхода
- каждый подраздел выводится отдельным блоком;
- сохраняется стандартная сортировка элементов;
- можно использовать разные шаблоны оформления;
- работают все настройки компонента
news.list; - не требуется создавать отдельные запросы к элементам вручную.
Такой подход удобно использовать для каталогов, услуг, медицинских направлений, справочников и любых других проектов, где необходимо вывести сразу несколько подразделов вместе с их содержимым на одной странице. Благодаря повторному использованию компонента bitrix:news.list сохраняются все стандартные возможности Битрикса: кэширование, сортировка, фильтрация и постраничная навигация.
Комментарии
Будем рады вашему мнению и вопросам по статье.