Стандартное меню в Битрикс (.top.menu.php) статично — это просто массив ссылок.
Но часто нужно, чтобы в меню автоматически появлялись разделы каталога или свежие статьи.
Для этого используется механизм расширения меню через файлы .<тип_меню>.menu_ext.php.
Как это работает?
При построении меню Битрикс ищет в текущем разделе файл с суффиксом _ext.php.
Например, для верхнего меню (.top.menu.php) он будет искать .top.menu_ext.php.
Если файл найден, он выполняется.
Внутри этого файла вы должны сформировать массив $aMenuLinksExt и объединить его с основным меню.
Задача: Добавить разделы инфоблока «Каталог» в левое меню
Создадим файл .left.menu_ext.php в корне сайта (или в разделе каталога).
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
// Используем стандартный компонент для генерации меню из инфоблока
// Он уже умеет строить иерархию, учитывать права и кэшировать результат
$aMenuLinksExt = $APPLICATION->IncludeComponent(
"bitrix:menu.sections",
"",
array(
"IS_SEF" => "Y",
"SEF_BASE_URL" => "/catalog/", // Путь к каталогу
"SECTION_PAGE_URL" => "#SECTION_CODE#/",
"DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE#",
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "5", // ID инфоблока
"DEPTH_LEVEL" => "2", // Глубина вложенности
"CACHE_TYPE" => "A",
"CACHE_TIME" => "3600"
),
false
);
// Объединяем стандартное меню с нашим динамическим
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
?>Важные моменты:
- $aMenuLinks: Это глобальная переменная, в которой хранится текущее меню. Мы должны слить её с новым массивом.
- Порядок слияния: array_merge($aMenuLinksExt, $aMenuLinks) поставит разделы каталога перед статическими пунктами. Если поменять аргументы местами, каталог будет в конце.
- Компонент menu.sections: Не обязательно писать свои запросы CIBlockSection::GetList. Стандартный компонент делает это лучше, сразу возвращая массив в нужном формате для меню.
Свой алгоритм генерации
Если нужно добавить что-то нестандартное, формируйте массив вручную:
$aMenuLinksExt = [];
$aMenuLinksExt[] = [
"Моя динамическая ссылка", // Название
"/my-link/", // Ссылка
[], // Доп. ссылки для подсветки
["FROM_IBLOCK" => true], // Параметры (PARAMS)
"" // Условие PHP (обычно пусто)
];
$aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);Вывод:
Файлы .menu_ext.php — это единственный правильный способ сделать меню динамическим. Используйте компонент bitrix:menu.sections для инфоблоков или пишите свою логику, не забывая про кэширование внутри генерации.
меню битрикс, .menu_ext.php, динамическое меню, CMenu, GetList, разделы инфоблока в меню, навигация.