Главная » Разработка Битрикс » Компоненты » bitrix:menu: кастомизация меню в Битрикс

bitrix:menu: кастомизация меню в Битрикс

Схема меню в Битрикс: компонент bitrix:menu читает структуру из файла .menu.php по разделам сайта

bitrix:menu формирует навигационное меню из файловой структуры сайта. В отличие от многих других компонентов, у него нет привязки к инфоблоку — источником данных служит файл .menu.php, который контент-менеджер может редактировать прямо из публичной части.

Базовое подключение

<$APPLICATION->IncludeComponent(
    'bitrix:menu',
    'top',
    [
        'ROOT_MENU_TYPE' => 'top',
        'MENU_CACHE_TYPE' => 'A',
        'MENU_CACHE_TIME' => 3600,
        'MENU_CACHE_USE_GROUPS' => 'Y',
        'MAX_LEVEL'      => 2,
        'USE_EXT'        => 'N',
    ]
);?>

Второй параметр — имя шаблона компонента, но одновременно и суффикс файла меню: значение top означает, что данные читаются из файлов .top.menu.php, разложенных по разделам сайта.

Файл меню и его структура

Файл .top.menu.php лежит в корне сайта или в конкретном разделе:

<?php
$aMenuLinks = [
    [
        'Каталог',           // текст пункта
        '/catalog/',         // ссылка
        [],                  // дополнительные параметры
        [],                  // зарезервировано
        '',                  // класс или иконка
    ],
    [
        'О компании',
        '/about/',
        [],
        [],
        '',
    ],
    [
        'Контакты',
        '/contacts/',
        ['SELECTED' => true], // принудительно активный пункт
        [],
        '',
    ],
];

Активный пункт меню компонент определяет сам — по совпадению текущего адреса с URL пункта. Флаг SELECTED позволяет переопределить это поведение вручную, когда автоматическое определение не подходит — например, для страницы фильтра, которая должна подсвечивать пункт родительского раздела каталога.

Нужна помощь с Битрикс?





    Многоуровневое меню

    Файлы меню разложены по структуре разделов сайта: .top.menu.php в корне задаёт верхний уровень, а такой же файл внутри /catalog/ задаёт подменю этого раздела. Параметр MAX_LEVEL ограничивает глубину, до которой компонент собирает вложенные уровни.

    Динамическое меню из инфоблока

    Если пункты меню должны формироваться не вручную, а из данных — например, разделов каталога, — файл .menu.php можно сделать не статичным массивом, а PHP-скриптом, который сам строит структуру:

    <?php
    
    use Bitrix\Main\Loader;
    
    Loader::includeModule('iblock');
    
    $aMenuLinks = [];
    
    $result = CIBlockSection::GetList(
        ['SORT' => 'ASC'],
        ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y', 'DEPTH_LEVEL' => 1]
    );
    
    while ($section = $result->GetNext()) {
        $aMenuLinks[] = [
            $section['NAME'],
            '/catalog/' . $section['CODE'] . '/',
            [],
            [],
            '',
        ];
    }

    Такой файл кешируется тем же механизмом, что и обычное статичное меню, — параметр MENU_CACHE_TIME действует одинаково для обоих случаев.

    Права доступа в меню

    Параметр MENU_CACHE_USE_GROUPS учитывает группы пользователя при кешировании — это важно, если часть пунктов меню видна не всем. Без этого параметра меню, закешированное для одного пользователя, может показаться другому с неверным набором пунктов.

    Кастомизация внешнего вида

    Собственное оформление меню — либо через шаблон компонента, скопированный в структуру шаблона сайта, либо параметром USE_EXT, включающим расширенный режим с дополнительными полями для каждого пункта: иконкой, описанием, классом CSS.

    Частые ошибки

    • Файл меню лежит не в том разделе. Подменю не появляется, потому что файл создан не там, где ожидает компонент.
    • Активный пункт определяется неверно. На страницах фильтра или детального просмотра автоматическое определение не совпадает с ожидаемым — нужен явный SELECTED.
    • MENU_CACHE_USE_GROUPS выключен при закрытых для части пользователей пунктах меню.
    • Динамическое меню из инфоблока не сбрасывает кеш при добавлении нового раздела — если управляемый кеш не настроен на этот случай отдельно.

    Итог

    bitrix:menu строит меню из файлов .menu.php, разложенных по структуре разделов сайта, — статичных или динамически формируемых кодом. Многоуровневость достигается вложенностью файлов меню по каталогам, а корректная работа с правами требует включённого MENU_CACHE_USE_GROUPS, если разные пользователи должны видеть разный набор пунктов.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний