В 1С-Битрикс меню собирается не из инфоблока, а из обычных PHP-файлов шаблона. Иногда нужно добавить в подменю всего один пункт – ссылку на лендинг, внешний ресурс или служебный раздел – и делать ради этого отдельный инфоблок избыточно. Разберём, как аккуратно дописать пункт руками, не сломав активность и вложенность остального меню.
Как устроено меню в Битриксе
Компонент bitrix:menu читает два вида файлов из папки шаблона:
- Статическое меню – файл вида
.<тип>.menu.php(например.left.menu.php). В нём лежит массив$aMenuLinksс готовыми пунктами. - Динамическое меню – файл
<тип>.menu_ext.php(напримерleft.menu_ext.php). Он выполняется на лету и формирует массив$aMenuLinksExt. Подключается, только если у компонента включён параметрUSE_EXT = "Y".
Именно menu_ext.php и нужен, когда пункты добавляются программно: например, компонент bitrix:menu.sections строит подменю по разделам инфоблока, а вам надо дописать к ним ещё одну «ручную» ссылку.
Структура одного пункта меню
Каждый пункт – это массив из пяти элементов в строгом порядке:
array(
"Каталог", // 1. Название пункта
"/catalog/", // 2. Ссылка
array(), // 3. Доп. ссылки, при которых пункт считается активным
array( // 4. Параметры пункта
"DEPTH_LEVEL" => 1,
),
"" // 5. Условие показа (PHP-выражение в виде строки)
)
Ключевой параметр здесь – DEPTH_LEVEL: он задаёт уровень вложенности. У пунктов верхнего уровня это 1, у подпунктов – 2 и так далее. Если ошибиться с уровнем, пункт «выпадет» из своего подменю.
Добавляем свой подпункт
Создаём (или открываем) файл динамического меню, например left.menu_ext.php, выводим в нём нужный компонент, а сразу после – дописываем свой пункт в массив:
$aMenuLinksExt[] = array(
"Новинки",
"/catalog/new/", // ссылка нового подпункта
array(),
array(
"DEPTH_LEVEL" => 2,
),
""
);
По умолчанию новый пункт встанет в конец списка подпунктов. Порядок задаётся тем, в какой последовательности вы объединяете массивы через array_merge():
// Свой пункт ПОСЛЕ остальных
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinksNew);
// Свой пункт ПЕРЕД остальными
$aMenuLinks = array_merge($aMenuLinksNew, $aMenuLinksExt);
Битрикс агрессивно кэширует меню. После правок сбросьте кэш меню (или весь кэш компонентов) в админке, иначе изменений вы не увидите и решите, что «код не работает».
Частые ошибки
- Пункт не появляется. В параметрах компонента
bitrix:menuне включёнUSE_EXT, либо имя файла не совпадает с типом меню (left,topи т.д.). - Пункт есть, но не подсвечивается активным. Добавьте в третий элемент массива дополнительные URL раздела – тогда пункт будет активен и на вложенных страницах.
- Ломается вёрстка подменю. Проверьте
DEPTH_LEVEL: подпункт должен быть на уровень глубже родителя.
Доступность меню (a11y)
Раз уж вы правите навигацию, заодно проверьте её доступность в шаблоне компонента:
- Оборачивайте меню в
<nav aria-label="Основное меню">, чтобы скринридер отличал его от других списков ссылок. - Текущему пункту добавляйте
aria-current="page"– Битрикс отдаёт признак активности в$arResult, его достаточно проверить в шаблоне. - Не делайте единственной «ссылкой» пункт без текста – у каждого пункта должно быть читаемое название.
Если подменю строится по разделам инфоблока, посмотрите смежные заметки: вывод количества элементов в разделе и вывод блоков только на определённых страницах. А для мобильной версии меню пригодится приём из статьи отключить переходы по пунктам меню на мобильных.