Полный цикл в digital

Меню в 1С Bitrix

Само по себе меню, как и везде, это элемент дизайна, при помощи которого мы упрощаем навигацию по сайту. Их может быть множество типов, верхнее, нижнее, левое и т.д., но в системе используются по умолчанию два, левое и правое меню, и это не мешает добавлять нам остальные типы при их необходимости. Давайте в этой статье рассмотрим:

  • ТИП меню и его виды
  • Статическое меню, файл с массивом $aMenuLinks
  • Динамическое меню, файл с приставкой _ext.php

Что такое меню в 1С Битрикс

Меню разделяется на основное и второстепенное. Основное меню соответствует самому верхнему уровню, второстепенное меню содержит ссылки на подразделы и документы текущего раздела.

Основной момент, меню в системе наследуется. То есть, если выбираем в компоненте определенный тип меню, то это меню будет отображаться, ниже на все разделы и страницы сайта, до момента пока в нем не создадим собственное меню.

Тип меню

Тип меню это определенные настройки в модуле управления структуры, который находится по адресу Настройки -> Настройки продукта -> Настройки модулей -> Управление структурой. Сам тип будет использован как префикс файла с шаблоном меню, а также он по этому префиксу идентифицируется самой системой. Как пример можно рассмотреть свой тип меню верхнего уровня top. После сохраннения у нас будет возможность выбирать в компоненте Меню верхнего уровня, а также выбирать этот тип в момент формирования раздела.

Отображение меню

Теперь давайте подробно разберемся, каким образом меню отображается. Любое меню в 1С Битрикс строится на основе двух составляющих:

  1. Файла с массивом данных $aMenuLinks, в нем определяется состав меню, где задаем название пунктов, его ссылки, по нажатию на которые переходим по структуре сайта. Все управление массивом осуществляется через административный раздел
  2. И вторая составляющая, это компонент, который является шаблоном внешнего представления меню. Он представлен в виде PHP кода, в нем обрабатывается массив данных, выдавая на выходе готовую HTML страничку

Структура массива

<?php
global $USER;
$aMenuLinks = array(
    array(
        // 1 пункт
        'Личный кабинет',
        // 2 пункт
        '/personal/',
        // 3 пункт
        array(
            '/articles1/',
            '/articles2/',
            '/articles3/',
        ),
        // 4 пункт
        array(
            'target' => '_blank',
            'fon-color' => '#123456',
        ),
        // 5 пункт
        // показываем пункт только авторизованному пользователю
        '$USER->IsAuthorized()'
        // показываем пункт только пользователю из группы 9
        'in_array(9, CUser::GetUserGroup(\$GLOBALS[\"USER\"]->GetID()))'
    ),
);

В переменной $aMenuLinks задается массив пунктов меню. Каждый пункт описывается массивом из 5 элементов:

  1. Название пункта меню
  2. Адрес пункта меню
  3. Массив дополнительных адресов, на которых описываемый пункт меню будет выделен, например
  4. Массив произвольных параметров, здесь это ассоциативный массив: 'ключ'=>'значение'. Очень удобное решение, этот массив можно заполнять через админку. Далее эти параметры можно использовать в шаблоне меню, по своему усмотрению
  5. Условие, при котором пункт меню будет отображен, PHP выражение, которое должно вернуть true. Так, например, для авторизованных пользователей можно показывать пункт Личный кабинет, а для не авторизованных Вход

Статическое меню

Все данные по каждому типу меню хранятся в отдельном файле, имя этого файла будет содержать: .(тип меню).menu.php. Если открыть структуру файлов в административной части сайта, мы видим в главной директории присутствует несколько типов меню, в нашем случае Меню верхнего уровня.

Любое меню наследуется, то есть все разделы отображают его в том виде, в котором оно находится в главной директории. Если необходимо изменить пункты меню в определенном разделе, для этого достаточно скопировать этот файл с определенным типом, в раздел где по иному меню должно отображаться, и далее его можно отредактировать в визуальной части сайта. После этого оно применится к текущем разделу и его подразделам.

Пример структуры массива без подпунктов $aMenuLinks:

.(тип меню).menu.php<?php
$aMenuLinks = array(
    array(
        "Создание сайтов",
        "/services/create-sites/",
        array(),
        array(),
        ""
    ),
    array(
        "Виды услуг",
        "/services/optimization/",
        array(),
        array(),
        ""
    )
);

Пример структуры массива с подпунктами $aMenuLinks:

.(тип меню).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(),
        ""
    )
);

Динамическое меню

Система Bitrix Framework позволяет создавать меню динамического типа. Т.е. массив данных таких меню генерируется автоматически на основании некоторых данных, получаемых с помощью программного кода. Данный код должен храниться в папке соответствующего раздела сайта в файле с именем .(тип меню).menu_ext.php. Основная задача подобных файлов — это манипуляция массивом $aMenuLinks.

Чтобы файл .(тип меню).menu_ext.php мог изменять массив $aMenuLinks, надо в настройках компонента «Меню» отметить checkbox «Подключать файлы с именами вида .тип.menu_ext.php».

Пример файла .(тип меню).menu_ext.php для вывода разделов инфоблока:

.(тип меню).menu_ext.php<?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" => "/blog/", 
        // ID раздела
        "SECTION_PAGE_URL" => "#SECTION_ID#/", 
        // полный путь к элементу инфоблока
        "DETAIL_PAGE_URL" => "#SECTION_ID#/#ELEMENT_ID#.html", 
        // ID типа инфоблока из которого выводим
        "IBLOCK_TYPE" => "company", 
        // ID инфоблока из которого выводим
        "IBLOCK_ID" => "5", 
        // уровень вложенности
        "DEPTH_LEVEL" => "3", 
        // включение кеша
        "CACHE_TYPE" => "A", 
        // время кеша
        "CACHE_TIME" => "36000000" 
    ),
    false
);
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);

Пример файла .(тип меню).menu_ext.php для вывода элементов инфоблока:

.(тип меню).menu_ext.php<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
global $APPLICATION;
if (CModule::IncludeModule("iblock")) {
    $IBLOCK_ID = 11; //здесь необходимо указать ID инфоблока
    $arOrder = array("SORT" => "ASC");
    $arSelect = array("ID", "NAME", "IBLOCK_ID", "DETAIL_PAGE_URL");
    $arFilter = array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y");
    $res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);
    while ($ob = $res->GetNextElement()) {
        $arFields = $ob->GetFields();
        $aMenuLinksExt[] = array(
            $arFields['NAME'],
            $arFields['DETAIL_PAGE_URL'],
            array(),
            array(),
            ""
        );
    }
}
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг