В Bitrix меню управляется через компонент menu, и для добавления подменю необходимо понимать его структуру и работу с файловой системой проекта. Основная точка входа – это папка /bitrix/templates/, где располагаются шаблоны сайта и соответствующие им файлы меню. Подменю создаются аналогично основному меню, но с указанием подкатегории и подключением нужного уровня вложенности.
Каждое меню в Битрикс привязано к определённому типу – left, top, bottom или кастомному, созданному администратором. Для корректной работы подменю нужно создать файл .menu.php внутри соответствующей папки раздела сайта, где требуется подменю. Структура массива меню должна точно соответствовать синтаксису, принятому в Bitrix: массив с вложенными подмассивами, каждый из которых описывает пункт меню.
Обратите внимание на параметр MAX_LEVEL в настройках компонента меню – он определяет, сколько уровней вложенности будет отображаться. Без его увеличения подменю может не отобразиться, даже если создано корректно. Также важно задать правильный флаг CHILD_MENU_TYPE, чтобы связать главное меню с его подменю.
Настройка кэширования компонента может мешать отображению свежих изменений. После редактирования файлов меню рекомендуется сбросить кэш вручную через административную панель или временно отключить кэш в настройках компонента при отладке. Это упростит тестирование и ускорит внедрение подменю в интерфейс сайта.
Подключение компонента меню в шаблоне сайта
Для отображения меню в шаблоне сайта используйте компонент bitrix:menu
. Вставьте следующий код в нужное место шаблона, обычно это header.php
:
<?$APPLICATION->IncludeComponent(
"bitrix:menu",
"horizontal_multilevel", // шаблон меню
array(
"ROOT_MENU_TYPE" => "top", // тип меню
"MAX_LEVEL" => "2", // уровень вложенности
"CHILD_MENU_TYPE" => "left", // тип подменю
"USE_EXT" => "Y", // использовать файлы .menu_ext.php
"MENU_CACHE_TYPE" => "A", // тип кэширования
"MENU_CACHE_TIME" => "3600",
"MENU_CACHE_USE_GROUPS" => "Y",
"MENU_CACHE_GET_VARS" => array()
),
false
);?>
Убедитесь, что в структуре сайта присутствуют файлы .menu.php
и при необходимости .menu_ext.php
с правильным объявлением массивов меню.
Типы меню настраиваются в административной панели: Контент → Меню. Названия типов должны совпадать с параметрами ROOT_MENU_TYPE
и CHILD_MENU_TYPE
.
При использовании собственного шаблона меню разместите его в директории /bitrix/templates/ваш_шаблон/components/bitrix/menu/название_шаблона/
. Название шаблона указывается во втором параметре IncludeComponent
.
Настройка уровней вложенности в параметрах компонента
Для корректного отображения подменю в компоненте меню Битрикс необходимо точно задать глубину вложенности. Это делается через параметр MAX_LEVEL в настройках компонента.
- Значение 1 – только основной уровень меню, без подменю.
- Значение 3 и выше – используются при сложной иерархии, но могут повлиять на производительность при большом количестве пунктов.
Параметр CHILD_MENU_TYPE должен совпадать с типом меню, в котором расположены подменю. Например, если основной тип – «top», то дочерний может быть «left» или «submenu», в зависимости от структуры.
При использовании шаблонов убедитесь, что в них реализована логика отображения вложенных уровней: вложенные <ul>
с рекурсивным вызовом компонента или вложенными циклами.
Если используется компонент bitrix:menu
в режиме шаблона сайта, проверьте, чтобы параметр USE_EXT был установлен в «Y». Это обеспечит загрузку файлов .menu_ext.php
, где обычно описываются вложенные пункты.
Важно: каждый уровень вложенности должен быть описан в соответствующем файле меню. Например:
/top.menu.php
– первый уровень/section/subsection/.left.menu.php
– второй и последующие уровни
Четко задавайте уровни вложенности, чтобы избежать лишней нагрузки и обеспечить корректную работу подменю в разных разделах сайта.
Создание структуры подменю в файле.menu.php
Для создания подменю необходимо вручную сформировать массив пунктов меню в файле .menu.php
, расположенном в соответствующей директории. Каждый элемент массива представляет собой массив из трех-четырёх значений.
Структура элемента подменю:
array("Название пункта", "Ссылка", array(), array("Дополнительные параметры"), "")
Пример подменю для раздела /catalog/
:
$aMenuLinks = array(
array("Смартфоны", "/catalog/smartfony/", array(), array("FROM_SUBMENU" => "Y"), ""),
array("Планшеты", "/catalog/planshety/", array(), array(), ""),
array("Аксессуары", "/catalog/aksessuary/", array(), array("ICON" => "icon-accessory"), "")
);
Файл должен находиться в каталоге, к которому относится подменю: например, /catalog/.menu.php
.
Ключ array()
на третьей позиции используется для указания дополнительных ссылок, которые считаются эквивалентами основного пути (например, с параметрами). Обычно оставляется пустым.
Четвёртый параметр массива используется для передачи произвольных свойств, таких как иконки, идентификаторы, флаги и пр. Эти параметры можно использовать в шаблоне меню.
Пятый параметр (если присутствует) может быть использован для указания условий отображения пункта меню, но чаще всего он пустой.
Подменю подключается автоматически, если в настройках компонента меню включена опция «многоуровневое меню», и структура директорий соблюдена.
Добавление ссылок подменю в административной панели
Для добавления собственных ссылок в подменю административной панели Битрикс необходимо создать файл .menu.php
в нужном разделе модуля или компонента. Файл должен возвращать массив, описывающий структуру меню.
Пример содержимого файла .menu.php
:
return [
[
"Название ссылки",
"/local/modules/ваш_модуль/admin/страница.php",
[],
["sort" => 100, "icon" => "default_page_icon"],
"CMain::IsAdmin()"
]
];
Путь в массиве должен быть абсолютным относительно корня сайта. Параметр sort
определяет порядок отображения. icon
– иконка пункта (указывается без расширения), размещается в директории /bitrix/images/ваш_модуль/
.
Если необходимо добавить ссылку в подменю существующего раздела (например, в bitrix/admin
), создайте файл /bitrix/admin/ваш_префикс_страница.php
, содержащий:
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/ваш_модуль/admin/страница.php");
После добавления файлов очистите кэш административного меню: удалите директорию /bitrix/admin/.menu.cache
. Изменения станут видны после обновления страницы.
Использование условий для отображения подменю в шаблоне
- Проверьте, активен ли пункт меню с помощью
$arItem["SELECTED"]
. Это полезно, если подменю должно отображаться только при переходе в соответствующий раздел. - Для вложенного меню убедитесь, что вы загружаете меню второго уровня, указав
$MENU_TYPE = "left"
иMAX_LEVEL = 2
при подключении компонента меню.
<?php
$APPLICATION->IncludeComponent(
"bitrix:menu",
"submenu",
array(
"ROOT_MENU_TYPE" => "left",
"MAX_LEVEL" => "2",
"CHILD_MENU_TYPE" => "left",
"USE_EXT" => "Y",
...
)
);
?>
<?php foreach ($arResult as $item): ?>
<li>
<a href="<?= $item["LINK"] ?>"><?= $item["TEXT"] ?></a>
<?php if ($item["SELECTED"] && !empty($item["CHILDREN"])): ?>
<ul>
<?php foreach ($item["CHILDREN"] as $subItem): ?>
<li><a href="<?= $subItem["LINK"] ?>"><?= $subItem["TEXT"] ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</li>
<?php endforeach; ?>
- Убедитесь, что массив
$arResult
содержит ключCHILDREN
. По умолчанию стандартный компонент меню его не формирует – требуется доработка вresult_modifier.php
. - Добавьте обработку вложенности в
result_modifier.php
, чтобы сгруппировать подменю вCHILDREN
соответствующего родителя.
// Пример доработки result_modifier.php
$parents = [];
foreach ($arResult as $key => $item) {
if ($item["DEPTH_LEVEL"] == 1) {
$parents[$key] = &$arResult[$key];
} elseif ($item["DEPTH_LEVEL"] == 2) {
end($parents)["CHILDREN"][] = $item;
unset($arResult[$key]);
}
}
Такой подход обеспечивает логичную структуру меню и минимизирует лишний HTML-код в шаблоне.
Настройка отображения подменю через CSS и шаблоны компонентов
Откройте файл template.php
скопированного шаблона. Убедитесь, что структура списка подменю вложена в родительский пункт. Пример корректной структуры:
<ul>
<li><a href="/section/">Раздел</a>
<ul>
<li><a href="/section/item1/">Пункт 1</a></li>
<li><a href="/section/item2/">Пункт 2</a></li>
</ul>
</li>
</ul>
Для скрытия и отображения подменю по наведению используйте следующий CSS:
ul ul {
display: none;
position: absolute;
left: 100%;
top: 0;
z-index: 1000;
}
ul li:hover > ul {
display: block;
}
Если требуется отображение подменю при клике, добавьте класс JavaScript-обработчику и уберите :hover
-логику. Для этого в template.php
добавьте условный класс, например:
<li class="menu-item has-submenu">
<a href="#" class="submenu-toggle">Раздел</a>
<ul class="submenu">...</ul>
</li>
Подключите скрипт, который будет управлять видимостью:
document.querySelectorAll('.submenu-toggle').forEach(toggle => {
toggle.addEventListener('click', function(e) {
e.preventDefault();
const submenu = this.nextElementSibling;
submenu.classList.toggle('visible');
});
});
CSS для скрытия и показа подменю по клику:
.submenu {
display: none;
}
.submenu.visible {
display: block;
}
При необходимости адаптируйте стили под мобильные устройства через медиазапросы и используйте flex
или grid
для контроля расположения.
Разделение меню на основные и подменю с помощью шаблонов
Для разделения основного меню и подменю в Битрикс применяется механизм шаблонов меню. В файле header.php вызывается компонент bitrix:menu дважды: один раз для основного меню, второй – для подменю.
Пример вызова основного меню:
$APPLICATION->IncludeComponent( "bitrix:menu", "main_menu", array( "ROOT_MENU_TYPE" => "top", "MENU_CACHE_TYPE" => "A", "MENU_CACHE_TIME" => "3600", "MENU_CACHE_USE_GROUPS" => "Y", "MENU_THEME" => "site", "MAX_LEVEL" => "1", "USE_EXT" => "N" ), false );?>
Для подменю используется отдельный шаблон и другой тип меню. Обычно это left или submenu:
$APPLICATION->IncludeComponent( "bitrix:menu", "sub_menu", array( "ROOT_MENU_TYPE" => "left", "MENU_CACHE_TYPE" => "A", "MENU_CACHE_TIME" => "3600", "MENU_CACHE_USE_GROUPS" => "Y", "MENU_THEME" => "site", "MAX_LEVEL" => "2", "USE_EXT" => "Y" ), false );?>
Шаблон sub_menu обрабатывает элементы второго уровня и ниже. Параметр USE_EXT => Y позволяет подключать файлы .menu_ext.php для динамического формирования подменю на уровне разделов сайта.
Создание двух разных шаблонов меню и их вызов в нужных местах шаблона сайта гарантирует четкое разделение навигации по уровням без дублирования структуры и потери гибкости.
Проверка корректной работы подменю на разных страницах сайта
После внедрения подменю в шаблон Битрикс необходимо удостовериться, что оно корректно отображается и функционирует на всех типах страниц. Тестирование охватывает не только главную и внутренние страницы, но и кастомные компоненты, динамические URL и страницы с разными шаблонами оформления.
Проверьте следующие параметры на каждой странице:
- наличие подменю в DOM-структуре;
- соответствие пунктов подменю выбранному разделу;
- активное состояние текущего пункта;
- корректность ссылок – они не должны вести на 404;
- реакция на адаптивные изменения (ширина экрана менее 768px);
- поведение при наведении и клике (если используется JavaScript);
- загрузка без задержек (проверяется через DevTools → Network);
- отсутствие конфликтов с другими компонентами;
- участие в кешировании (если применяется
cache
в компоненте меню); - правильное отображение при включенном режимe ЧПУ и при его отключении.
Для проверки используйте реальные URL-адреса из разных разделов сайта. Например:
- /catalog/tehnika/
- /about/contacts/
- /services/web-development/
- /news/2025/
Откройте каждый адрес в браузере, проверьте визуальное отображение и работоспособность пунктов. В консоли браузера исключите наличие JavaScript-ошибок. Для автотестов можно использовать Puppeteer или Cypress: они помогут валидации отображения подменю в автоматическом режиме по всем шаблонам и устройствам.
После внесения правок очистите кеш Битрикс через административную панель (/bitrix/admin/cache.php
) и убедитесь, что подменю отрисовывается из актуальных данных.
Вопрос-ответ:
Как создать подменю в Битрикс через административную панель?
Для создания подменю в Битрикс сначала нужно зайти в административную панель и перейти в раздел «Настройки» → «Пользовательские меню». Там выбирается нужный раздел, для которого требуется добавить подменю. После этого создаётся новый пункт меню с указанием родительского элемента. Важно правильно заполнить поля «Название», «Ссылка» и «Права доступа», чтобы подменю отображалось только для нужных пользователей. После сохранения изменений подменю появится в основном меню сайта.
Можно ли добавить подменю программно, без использования визуального интерфейса?
Да, создание подменю возможно и через код. Для этого в файле с описанием меню (например, .menu.php) добавляется новый элемент в массив пунктов меню. Каждый пункт описывается с помощью массива, где указывается текст пункта, ссылка, дополнительные параметры и, при необходимости, вложенные подменю. Такой способ полезен, если меню нужно автоматически обновлять или создавать динамические разделы. После внесения изменений меню нужно очистить кеш, чтобы увидеть обновления на сайте.
Какие ошибки часто встречаются при создании подменю в Битрикс и как их избежать?
Одной из распространённых ошибок является неправильное указание пути к файлам меню или ссылка на несуществующую страницу, из-за чего подменю не отображается. Также иногда забывают задать корректные права доступа, из-за чего пункты меню видны не всем пользователям. Ещё одна ошибка — отсутствие очистки кеша после изменений, что мешает увидеть новые пункты. Чтобы избежать этих проблем, нужно внимательно проверять все пути, использовать встроенные механизмы проверки, и не забывать сбрасывать кеш через административную панель.
Как настроить отображение подменю только для определённых групп пользователей в Битрикс?
В Битрикс можно ограничить видимость пунктов меню по группам пользователей, задавая соответствующие параметры в настройках меню. При создании или редактировании пункта меню указывается, каким группам разрешён доступ. Это делается в разделе «Права доступа», где можно выбрать одну или несколько групп. Таким образом, подменю будет видно только тем пользователям, которые входят в выбранные группы. Такая настройка помогает организовать удобную навигацию и скрыть ненужные разделы для разных категорий посетителей.