Блог Горошко Андрея 1C-Битрикс Динамическое меню в Битрикс: Файлы .menu_ext.php

Динамическое меню в Битрикс: Файлы .menu_ext.php

Средний рейтинг
Еще нет оценок

Стандартное меню в Битрикс (.top.menu.php) статично — это просто массив ссылок.

Но часто нужно, чтобы в меню автоматически появлялись разделы каталога или свежие статьи.

Для этого используется механизм расширения меню через файлы .<тип_меню>.menu_ext.php.

Как это работает?

При построении меню Битрикс ищет в текущем разделе файл с суффиксом _ext.php.

Например, для верхнего меню (.top.menu.php) он будет искать .top.menu_ext.php.

Если файл найден, он выполняется.

Внутри этого файла вы должны сформировать массив $aMenuLinksExt и объединить его с основным меню.

Задача: Добавить разделы инфоблока «Каталог» в левое меню

Создадим файл .left.menu_ext.php в корне сайта (или в разделе каталога).

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

global $APPLICATION;

// Используем стандартный компонент для генерации меню из инфоблока
// Он уже умеет строить иерархию, учитывать права и кэшировать результат
$aMenuLinksExt = $APPLICATION->IncludeComponent(
    "bitrix:menu.sections", 
    "", 
    array(
        "IS_SEF" => "Y",
        "SEF_BASE_URL" => "/catalog/", // Путь к каталогу
        "SECTION_PAGE_URL" => "#SECTION_CODE#/",
        "DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE#",
        "IBLOCK_TYPE" => "catalog",
        "IBLOCK_ID" => "5", // ID инфоблока
        "DEPTH_LEVEL" => "2", // Глубина вложенности
        "CACHE_TYPE" => "A",
        "CACHE_TIME" => "3600"
    ),
    false
);

// Объединяем стандартное меню с нашим динамическим
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
?>

Важные моменты:

  1. $aMenuLinks: Это глобальная переменная, в которой хранится текущее меню. Мы должны слить её с новым массивом.
  2. Порядок слияния: array_merge($aMenuLinksExt, $aMenuLinks) поставит разделы каталога перед статическими пунктами. Если поменять аргументы местами, каталог будет в конце.
  3. Компонент menu.sections: Не обязательно писать свои запросы CIBlockSection::GetList. Стандартный компонент делает это лучше, сразу возвращая массив в нужном формате для меню.

Свой алгоритм генерации

Если нужно добавить что-то нестандартное, формируйте массив вручную:

$aMenuLinksExt = [];
$aMenuLinksExt[] = [
    "Моя динамическая ссылка",   // Название
    "/my-link/",                 // Ссылка
    [],                          // Доп. ссылки для подсветки
    ["FROM_IBLOCK" => true],     // Параметры (PARAMS)
    ""                           // Условие PHP (обычно пусто)
];

$aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);

Вывод:
Файлы .menu_ext.php — это единственный правильный способ сделать меню динамическим. Используйте компонент bitrix:menu.sections для инфоблоков или пишите свою логику, не забывая про кэширование внутри генерации.

меню битрикс, .menu_ext.php, динамическое меню, CMenu, GetList, разделы инфоблока в меню, навигация.

Мой рейтинг:

Добавить комментарий

Related Post

Сериализация в D7 ORM: Хранение массивов и объектов в базе с save_data_modificationСериализация в D7 ORM: Хранение массивов и объектов в базе с save_data_modification

Средний рейтинг Еще нет оценок Часто возникает задача сохранить в одном поле базы данных сложную структуру: массив настроек, JSON-объект или список ID. D7 ORM позволяет автоматизировать процесс «упаковки» данных при

Слайдер Битрикс (SidePanel): Открытие компонентов и страниц в боковой панелиСлайдер Битрикс (SidePanel): Открытие компонентов и страниц в боковой панели

Средний рейтинг Еще нет оценок Боковая панель (слайдер) — это стандарт де-факто в интерфейсах Битрикс24. Она позволяет открывать формы редактирования, детальные карточки и отчеты «поверх» текущей страницы, не теряя контекст.

Валидация данных в D7 ORM: Встроенные и кастомные валидаторыВалидация данных в D7 ORM: Встроенные и кастомные валидаторы

Средний рейтинг Еще нет оценок Валидация — это процесс проверки данных на корректность перед их сохранением. D7 ORM предоставляет мощный механизм валидаторов, который описывается прямо в getMap() вашей сущности. Это позволяет держать