bitrix:menu формирует навигационное меню из файловой
структуры сайта. В отличие от многих других компонентов, у него нет
привязки к инфоблоку — источником данных служит файл .menu.php,
который контент-менеджер может редактировать прямо из публичной части.
Базовое подключение
<$APPLICATION->IncludeComponent(
'bitrix:menu',
'top',
[
'ROOT_MENU_TYPE' => 'top',
'MENU_CACHE_TYPE' => 'A',
'MENU_CACHE_TIME' => 3600,
'MENU_CACHE_USE_GROUPS' => 'Y',
'MAX_LEVEL' => 2,
'USE_EXT' => 'N',
]
);?>
Второй параметр — имя шаблона компонента, но одновременно и суффикс
файла меню: значение top означает, что данные читаются
из файлов .top.menu.php, разложенных по разделам сайта.
Файл меню и его структура
Файл .top.menu.php лежит в корне сайта или в конкретном разделе:
<?php
$aMenuLinks = [
[
'Каталог', // текст пункта
'/catalog/', // ссылка
[], // дополнительные параметры
[], // зарезервировано
'', // класс или иконка
],
[
'О компании',
'/about/',
[],
[],
'',
],
[
'Контакты',
'/contacts/',
['SELECTED' => true], // принудительно активный пункт
[],
'',
],
];
Активный пункт меню компонент определяет сам — по совпадению текущего
адреса с URL пункта. Флаг SELECTED позволяет переопределить
это поведение вручную, когда автоматическое определение не подходит —
например, для страницы фильтра, которая должна подсвечивать пункт
родительского раздела каталога.
Нужна помощь с Битрикс?
Многоуровневое меню
Файлы меню разложены по структуре разделов сайта: .top.menu.php
в корне задаёт верхний уровень, а такой же файл внутри
/catalog/ задаёт подменю этого раздела. Параметр
MAX_LEVEL ограничивает глубину, до которой компонент
собирает вложенные уровни.
Динамическое меню из инфоблока
Если пункты меню должны формироваться не вручную, а из данных —
например, разделов каталога, — файл .menu.php можно
сделать не статичным массивом, а PHP-скриптом, который сам строит
структуру:
<?php
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$aMenuLinks = [];
$result = CIBlockSection::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => 5, 'ACTIVE' => 'Y', 'DEPTH_LEVEL' => 1]
);
while ($section = $result->GetNext()) {
$aMenuLinks[] = [
$section['NAME'],
'/catalog/' . $section['CODE'] . '/',
[],
[],
'',
];
}
Такой файл кешируется тем же механизмом, что и обычное статичное
меню, — параметр MENU_CACHE_TIME действует одинаково
для обоих случаев.
Права доступа в меню
Параметр MENU_CACHE_USE_GROUPS учитывает группы
пользователя при кешировании — это важно, если часть пунктов меню
видна не всем. Без этого параметра меню, закешированное для одного
пользователя, может показаться другому с неверным набором пунктов.
Кастомизация внешнего вида
Собственное оформление меню — либо через шаблон компонента, скопированный
в структуру шаблона сайта, либо параметром USE_EXT,
включающим расширенный режим с дополнительными полями для каждого пункта:
иконкой, описанием, классом CSS.
Частые ошибки
- Файл меню лежит не в том разделе. Подменю не появляется, потому что файл создан не там, где ожидает компонент.
-
Активный пункт определяется неверно. На страницах
фильтра или детального просмотра автоматическое определение не совпадает
с ожидаемым — нужен явный
SELECTED. -
MENU_CACHE_USE_GROUPSвыключен при закрытых для части пользователей пунктах меню. - Динамическое меню из инфоблока не сбрасывает кеш при добавлении нового раздела — если управляемый кеш не настроен на этот случай отдельно.
Итог
bitrix:menu строит меню из файлов .menu.php,
разложенных по структуре разделов сайта, — статичных или динамически
формируемых кодом. Многоуровневость достигается вложенностью файлов
меню по каталогам, а корректная работа с правами требует включённого
MENU_CACHE_USE_GROUPS, если разные пользователи должны
видеть разный набор пунктов.
