Одной из возможностей динамического добавления пунктов меню в Битрикс является использование файлов с именем ".<тип+меню>.menu_ext.php".
Чаще всего в этом файле используется компонент bitrix:menu.section, возвращающий массив разделов заданного инфоблока. Однако встречаются задачи требующие добавить в это меню элементы или разделы из одного из инфоблоков или иного источника информации.
Покажу один из подходов на примере следующей задачи: Построить двухуровневое меню из разделов информационного блока с ID 2 (ИБ2), а для раздела "Информация" с символьным кодом 'info' добавить, в качестве подпунктов, все активные элементы инфоблока с ID 3 (ИБ3).
Первым этапом получаем два уровня пунктов из ИБ2.
$aMenuLinksExt=$APPLICATION->IncludeComponent("bitrix:menu.sections", "", array( "IS_SEF" => "Y", "SEF_BASE_URL" => "/", "SECTION_PAGE_URL" => "#SECTION_CODE#/", "DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE/#", "IBLOCK_TYPE" => "content", "IBLOCK_ID" => 3, "DEPTH_LEVEL" => "2", "CACHE_TYPE" => "A", "CACHE_TIME" => "3600000" ), false ); $aMenuLinksPre = array_merge($aMenuLinksExt, $aMenuLinks);
Далее в цикле ищем необходимые пункты и производим вставку (пример создания массива пунктов будет приведен ниже)
$aMenuLinks = []; // в этом массиве выстраивается новое меню foreach($aMenuLinksPre as $arItem) { // ищем по необходимым признакам родительский пункт if ($arItem[1] == '/info/') { // здесь должен идти код получения массива подпунктов $arSubItems if (count($arSubItems) > 0) { // если подпункты найдены указываем, что родительский пункт имеет подпункты $arItem[3]['IS_PARENT'] = 1; // добавляем родительский пункт в новую структуру $aMenuLinks[] = $arItem; // добавляем подпункты $aMenuLinks = array_merge($aMenuLinks, $arSubItems); } else { $aMenuLinks[] = $arItem; } } else { $aMenuLinks[] = $arItem; } }
В данном примере подпункты этого раздела полученные из ИБ2 будут идти после пунктов полученных из иных источников. Если необходимо иное, то логику необходимо внедрить после добавления родительского пункта в новую структуру.
Получение данных происходит стандартным образом, главное правильно заполнить структуру массива отдельного пункта:
[0] => заголовок пункта [1] => ссылка пункта [2] => массив дополнительных подсвечиваемых ссылок [ [0] => ссылка 1 [1] => ссылка 2 .... ] [3] => дополнительные параметры передаваемые в шаблон [ [ключ 1] => значение 1 [ключ 2] => значение 2 .... ] [4] => условие (если необходимо) отображения пункта (PHP выражение)
Пример кода
$arSubItems = []; $itItems = CIBlockElement::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => 3, 'ACTIVE' => 'Y'], false, false, ['NAME','DETAIL_PAGE_URL'] ); while($arSub = $itItems->GetNext()) { $arSubItems[] = [ $arSub['NAME'], $arSub['DETAIL_PAGE_URL'], [$arSub['DETAIL_PAGE_URL']], [ 'FROM_IBLOCK' => 3, 'IS_PARENT' => false, 'DEPTH_LEVEL' => 2 ] ]; }
Процедуру перестроения меню, вместе с получением дополнительных данных необходимо оснастить кэшированием для обеспечения максимального быстродействия