1. Классификация навигационных элементов
Навигационная система в 1С-Битрикс реализуется через иерархию типов меню, где каждый тип определяется:
- Позиционированием (вертикальное/горизонтальное)
- Уровнем вложенности
- Источником данных
- Логикой отображения
Базовые типы (left, right) могут быть расширены через механизм кастомных типов в разделе: Настройки продукта → Настройки модулей → Управление структурой
2. Статическая конфигурация меню
2.1. Структура файла .тип.menu.php
Файлы статического меню содержат массив $aMenuLinks со строго типизированной структурой:
global $USER;
$aMenuLinks = array(
array(
'TEXT' => 'Создание сайтов',
'LINK' => '/services/create-sites/',
'SELECTED' => array('/current/path/'),
'PARAMS' => array(
'IBLOCK_META' => 1,
'DEPTH_LEVEL' => 1,
'CSS_CLASS' => 'nav-parent'
),
'CONDITION' => '$USER->IsAuthorized()' // показываем пункт только авторизованному пользователю
// или показываем пункт только пользователю из группы 9
'in_array(9, CUser::GetUserGroup(\$GLOBALS[\"USER\"]->GetID()))'
)
);
Элементы массива:
- Текст пункта (string)
- Абсолютный/относительный URL (string)
- Массив URL-масок для активации пункта (array)
- Пользовательские параметры (key-value array)
- PHP-выражение для условного отображения (eval)
2.2. Пример структуры массива с подпунктами
.тип.menu.php
<?php
$aMenuLinks = array(
// Родительский пункт меню
array(
"Создание сайтов",
"/services/create-sites/",
array("/services/create-sites/"),
array(
"FROM_IBLOCK" => 1,
// Пункт является родительским
"IS_PARENT" => 1,
// Уровень вложенности 1
"DEPTH_LEVEL" => 1
),
""
),
// Дочерний подпункт
array(
"Создание Landing Page",
"/services/create-sites/landing-page/",
array("/services/create-sites/landing-page/"),
array(
"FROM_IBLOCK" => 1,
// Пункт не является родительским
"IS_PARENT" => 0,
// Уровень вложенности 2
"DEPTH_LEVEL" => 2
),
""
),
array(
"Виды услуг",
"/services/optimization/",
array(),
array(),
""
)
);
2.3. Механизм наследования
Система использует каскадную модель наследования:
/bitrix/php_interface/тип.menu.php
→ /local/php_interface/тип.menu.php
→ /section_dir/тип.menu.php
Приоритет имеет файл из текущего раздела. Для переопределения необходимо создать локальную копию с последующей модификацией.
3. Динамическая генерация меню
3.1. Файлы _ext.php
Динамические меню реализуются через файлы .тип.menu_ext.php, которые:
- Подключаются при активации опции "Использовать динамическое меню"
- Модифицируют глобальный массив \$aMenuLinks
- Поддерживают кеширование через API Битрикс
Пример интеграции с инфоблоками:
$aMenuLinksExt = $APPLICATION->IncludeComponent(
"bitrix:menu.sections",
"",
array(
"IBLOCK_TYPE" => "content",
"IBLOCK_ID" => 18,
"DEPTH_LEVEL" => 3,
"CACHE_TIME" => 3600,
"SECTION_URL" => "/catalog/#SECTION_CODE#/",
"SEF_MODE" => "Y"
)
);
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
3.2. Генерация из элементов инфоблока
$rsElements = CIBlockElement::GetList(
["SORT" => "ASC"],
["IBLOCK_ID" => 24, "ACTIVE" => "Y"],
false,
false,
["ID", "NAME", "DETAIL_PAGE_URL"]
);
while ($arElement = $rsElements->Fetch()) {
$aMenuLinksExt[] = array(
$arElement['NAME'],
$arElement['DETAIL_PAGE_URL'],
array(),
array("ELEMENT_ID" => $arElement['ID']),
""
);
}
4. Расширенные сценарии использования
4.1. Контекстно-зависимое меню
$currentSection = CIBlockSection::GetByID($SECTION_ID)->Fetch();
if ($currentSection['DEPTH_LEVEL'] == 2) {
$aMenuLinks = CustomMenuBuilder::getNestedMenu($SECTION_ID);
}
4.2. Мультиязычная поддержка
$aMenuLinks = array(
array(
GetMessage('MENU_ITEM_1'),
LANG_DIR.'/services/',
array(),
array(),
""
)
);
Данная реализация обеспечивает гибкое управление навигацией с поддержкой сложных бизнес-сценариев, сохраняя высокий уровень производительности за счет встроенных механизмов кеширования и оптимизации запросов.