Меню в 1С Bitrix
Само по себе меню, как и везде, это элемент дизайна, при помощи которого мы упрощаем навигацию по сайту. Их может быть множество типов, верхнее, нижнее, левое и т.д., но в системе используются по умолчанию два, левое и правое меню, и это не мешает добавлять нам остальные типы при их необходимости. Давайте в этой статье рассмотрим:
- ТИП меню и его виды
- Статическое меню, файл с массивом
$aMenuLinks
- Динамическое меню, файл с приставкой
_ext.php
Что такое меню в 1С Битрикс
Меню разделяется на основное и второстепенное. Основное меню соответствует самому верхнему уровню, второстепенное меню содержит ссылки на подразделы и документы текущего раздела.
Основной момент, меню в системе наследуется. То есть, если выбираем в компоненте определенный тип меню, то это меню будет отображаться, ниже на все разделы и страницы сайта, до момента пока в нем не создадим собственное меню.
Тип меню
Тип меню это определенные настройки в модуле управления структуры, который находится по адресу Настройки -> Настройки продукта -> Настройки модулей -> Управление структурой
. Сам тип будет использован как префикс файла с шаблоном меню, а также он по этому префиксу идентифицируется самой системой. Как пример можно рассмотреть свой тип меню верхнего уровня top
. После сохраннения у нас будет возможность выбирать в компоненте Меню верхнего уровня
, а
также выбирать этот тип в момент формирования раздела.
Отображение меню
Теперь давайте подробно разберемся, каким образом меню отображается. Любое меню в 1С Битрикс строится на основе двух составляющих:
- Файла с массивом данных
$aMenuLinks
, в нем определяется состав меню, где задаем название пунктов, его ссылки, по нажатию на которые переходим по структуре сайта. Все управление массивом осуществляется через административный раздел - И вторая составляющая, это компонент, который является шаблоном внешнего представления меню. Он представлен в виде 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
элементов:
- Название пункта меню
- Адрес пункта меню
- Массив дополнительных адресов, на которых описываемый пункт меню будет выделен, например
- Массив произвольных параметров, здесь это ассоциативный массив:
'ключ'=>'значение'
. Очень удобное решение, этот массив можно заполнять через админку. Далее эти параметры можно использовать в шаблоне меню, по своему усмотрению - Условие, при котором пункт меню будет отображен, 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);