Перейти к содержанию
Инструкция

Как вручную добавить подпункт в подменю Битрикса

Как добавить свой пункт в меню 1С-Битрикс без правки инфоблока: статические файлы .menu.php, динамические .menu_ext.php, структура массива aMenuLinks и управление позицией пункта через array_merge.

Обновлено 22 июля 5 минут чтения

В 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, его достаточно проверить в шаблоне.
  • Не делайте единственной «ссылкой» пункт без текста – у каждого пункта должно быть читаемое название.

Если подменю строится по разделам инфоблока, посмотрите смежные заметки: вывод количества элементов в разделе и вывод блоков только на определённых страницах. А для мобильной версии меню пригодится приём из статьи отключить переходы по пунктам меню на мобильных.

Частые вопросы

Чем отличается .menu.php от menu_ext.php?

.menu.php – статический файл с готовым массивом $aMenuLinks. menu_ext.php выполняется динамически и формирует $aMenuLinksExt; он подключается только при включённом параметре USE_EXT у компонента bitrix:menu.

Почему добавленный пункт не появляется в меню?

Чаще всего не включён параметр USE_EXT, имя файла не совпадает с типом меню (left, top) или не сброшен кэш. Проверьте все три пункта.

Как поставить свой пункт в начало подменю, а не в конец?

Управляйте порядком в array_merge: поместите массив со своим пунктом первым аргументом – тогда он встанет перед остальными.

За что отвечает DEPTH_LEVEL?

Это уровень вложенности пункта. Пункты верхнего уровня имеют DEPTH_LEVEL = 1, подпункты – 2 и глубже. Ошибка в уровне выбивает пункт из его подменю.

Нужно ли ради одного пункта создавать инфоблок?

Нет. Для единичных статических ссылок ручное добавление в menu_ext.php проще и не требует инфоблока.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.