Одной из возможностей динамического добавления пунктов меню в Битрикс является использование файлов с именем ".<тип+меню>.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
]
];
}
Процедуру перестроения меню, вместе с получением дополнительных данных необходимо оснастить кэшированием для обеспечения максимального быстродействия