Перейти к содержанию

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

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

5 мин 52 Обновлено 22 июля Сложность: Базовая

TL;DR

  • Меню Битрикса собирается из файлов шаблона: статическое .menu.php и динамическое menu_ext.php.
  • Свой пункт добавляется в массив $aMenuLinksExt как массив из 5 элементов: название, ссылка, доп. URL, параметры, условие.
  • Параметр DEPTH_LEVEL задаёт уровень вложенности подпункта.
  • Позиция пункта регулируется порядком аргументов в array_merge().
  • После правки обязательно сбросьте кэш меню.

В 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 проще и не требует инфоблока.

Материалы по теме

Что почитать дальше по этой теме

Инструкция Отключить переходы по пунктам меню на мобильных Как на мобильных сделать так, чтобы клик по родительскому пункту меню раскрывал подменю, а не уводил на страницу раздела. Современное решение на чистом JS, matchMedia и с сохранением доступности. 5 мин 40 22 октября 2018 Инструкция Вывод блоков только на определённых страницах сайта Как в 1С-Битрикс показать баннер, форму или блок только на нужных страницах. Разбираем API $APPLICATION->GetCurPage и GetCurDir, разницу между физическим и SEF-адресом, проверку по разделу и типичные ошибки с ЧПУ. 7 мин 57 24 октября 2018 Инструкция Вывести количество элементов в разделе (Список новостей) Как в компоненте «Список новостей» 1С-Битрикс посчитать и вывести количество активных элементов внутри раздела инфоблока. Разбираем CIBlockSection::GetSectionElementsCount и учёт вложенных разделов. 7 мин 67 17 января 2017 Инструкция Новый шаблон постраничной навигации в Битрикс Как создать свой шаблон постраничной навигации для компонента «Новости» в 1С-Битрикс, подключить его к списку и результатам поиска через PAGER_TEMPLATE и сделать пагинацию доступной и семантичной. 6 мин 46 18 мая 2017