Конфигурация административного меню модуля
Описание
В данном разделе описывается управление главным административным меню.
Основная структура
Для каждого модуля параметры меню задаются файлом /bitrix/modules/каталог_модуля/admin/menu.php
. Результатом работы этого файла должен стать описательный массив меню модуля. Возможности API позволяют создать древовидное меню с любым уровнем вложенности, а также, с динамической подгрузкой отдельных ветвей.
Файл menu.php должен вернуть ассоциативный массив следующей структуры:
Ключ | Описание |
---|---|
parent_menu | Идентификатор раздела меню. Имеет смысл только для элемента верхнего уровня дерева меню модуля. Может принимать одно из следующих значений:
|
sort | Относительный "вес" пункта меню для сортировки. |
url | Ссылка пункта меню. При переходе пользователем на страницу с таким URL данный пункт меню будет подсвечен. |
more_url | Список дополнительных URL, по которым данный пункт меню должен быть подсвечен. |
text | Текст ссылки пункта меню. |
title | Текст всплывающей подсказки пункта меню. |
icon | CSS-класс иконки пункта меню. |
page_icon | CSS-класс иконки пункта меню для вывода на странице индекса (класс увеличенной иконки). |
module_id | Идентификатор модуля, к которому относится меню. |
dynamic | Флаг, показывающий, должна ли ветвь, начинающаяся с текущего пункта, подгружаться динамически. |
items_id | Идентификатор ветви меню. Используется для динамического обновления ветви. |
items | Список дочерних пунктов меню. Представляет собой массив, каждый элемент которого является ассоциативным массивом аналогичной структуры. |
Пример использования
Листинг файла menu.php модуля Веб-форм (простое меню без динамической подгрузки).
<? IncludeModuleLangFile(__FILE__); // в menu.php точно так же можно использовать языковые файлы if($APPLICATION->GetGroupRight("form")>"D") // проверка уровня доступа к модулю веб-форм { // сформируем верхний пункт меню $aMenu = array( "parent_menu" => "global_menu_services", // поместим в раздел "Сервис" "sort" => 100, // вес пункта меню "url" => "form_list.php?lang=".LANGUAGE_ID, // ссылка на пункте меню "text" => GetMessage("FORM_MENU_MAIN"), // текст пункта меню "title" => GetMessage("FORM_MENU_MAIN_TITLE"), // текст всплывающей подсказки "icon" => "form_menu_icon", // малая иконка "page_icon" => "form_page_icon", // большая иконка "items_id" => "menu_webforms", // идентификатор ветви "items" => array(), // остальные уровни меню сформируем ниже. ); // далее выберем список веб-форм и добавим для каждой соответствующий пункт меню require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/form/include.php"); $z = CForm::GetMenuList(array("LID"=>LANGUAGE_ID)); while ($zr=$z->GetNext()) { if (strlen($zr["MENU"]) > 0) { // массив каждого пункта формируется аналогично $aMenu["items"][] = array( "text" => $zr["MENU"], "url" => "form_result_list.php?lang=".LANGUAGE_ID."&WEB_FORM_ID=".$zr["ID"], "icon" => "form_menu_icon", "page_icon" => "form_page_icon", "more_url" => array( "form_view.php?WEB_FORM_ID=".$zr["ID"], "form_result_list.php?WEB_FORM_ID=".$zr["ID"], "form_result_edit.php?WEB_FORM_ID=".$zr["ID"], "form_result_print.php?WEB_FORM_ID=".$zr["ID"], "form_result_view.php?WEB_FORM_ID=".$zr["ID"] ), "title" => GetMessage("FORM_RESULTS_ALT") ); } } // если нам нужно добавить ещё пункты - точно так же добавляем элементы в массив $aMenu["items"] // ............ // вернем полученный список return $aMenu; } // если нет доступа, вернем false return false; ?>
Динамическая подгрузка ветвей меню.
Как уже было сказано выше, возможно реализовать меню с динамической подгрузкой ветвей. Для этого нужно сделать следующие шаги:
- установить у пункта меню, начинающего динамическую ветвь параметр
"dynamic"=>true
; - установить у пункта меню, начинающего динамическую ветвь значение параметра
"items_id"
и идентификатор модуля; - добавить проверку флага "группа элементов открыта" при создании элементов ветви, предполагающие динамическую подгрузку.
Последний пункт представляет собой проверку метода CAdminMenu::IsSectionActive()
. Поскольку скрипт, формирующий меню, выполняется в контексте экземпляра класса CAdminMenu, то достаточно осуществить проверку $this->IsSectionActive()
, в качестве параметра указав значение параметра "items_id"
требуемой ветви.
Приведем в качестве примера то же самое меню модуля Веб-форм, но уже с динамической подгрузкой списка форм:
<? IncludeModuleLangFile(__FILE__); // в menu.php точно так же можно использовать языковые файлы if($APPLICATION->GetGroupRight("form")>"D") // проверка уровня доступа к модулю веб-форм { // верхний пункт меню оставим без изменений $aMenu = array( "parent_menu" => "global_menu_services", // поместим в раздел "Сервис" "sort" => 100, // вес пункта меню "url" => "form_list.php?lang=".LANGUAGE_ID, // ссылка на пункте меню "text" => GetMessage("FORM_MENU_MAIN"), // текст пункта меню "title" => GetMessage("FORM_MENU_MAIN_TITLE"), // текст всплывающей подсказки "icon" => "form_menu_icon", // малая иконка "page_icon" => "form_page_icon", // большая иконка "items_id" => "menu_webforms", // идентификатор ветви "items" => array(), // остальные уровни меню сформируем ниже. ); // сформируем пункты меню, которые будут подгружаться динамически $arFormsList = array(); if ( method_exists($this, "IsSectionActive") // для поверки совместимости && $this->IsSectionActive("menu_webforms_list") // если активна секция меню с идентфикатором "menu_webforms_list" || // можно также добавить любые свои условия. например, показывать эту ветвь на всех страницах, // где определена константа FORM_MENU_OPEN со значением 1 defined('FORM_MENU_OPEN') && FORM_MENU_OPEN == 1) { // далее выполним ту же самую выборку, что и в простом варианте, но элементы будем сохранять в отдельный массив. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/form/include.php"); $z = CForm::GetMenuList(array("LID"=>LANGUAGE_ID)); while ($zr=$z->GetNext()) { if (strlen($zr["MENU"]) > 0) { // массив каждого пункта формируется аналогично $arFormsList[] = array( "text" => $zr["MENU"], "url" => "form_result_list.php?lang=".LANGUAGE_ID."&WEB_FORM_ID=".$zr["ID"], "icon" => "form_menu_icon", "page_icon" => "form_page_icon", "more_url" => array( "form_view.php?WEB_FORM_ID=".$zr["ID"], "form_result_list.php?WEB_FORM_ID=".$zr["ID"], "form_result_edit.php?WEB_FORM_ID=".$zr["ID"], "form_result_print.php?WEB_FORM_ID=".$zr["ID"], "form_result_view.php?WEB_FORM_ID=".$zr["ID"] ), "title" => GetMessage("FORM_RESULTS_ALT") ); } } } // теперь сформируем корень динамической ветви меню. обратите внимание на выделенные параметры. $aMenu["items"][] = array( "text" => GetMessage("FORM_RESULTS_ALL"), "url" => "form_result_list.php?lang=".LANGUAGE_ID, "title" => GetMessage("FORM_RESULTS_ALL_ALT"), "dynamic" => true, // !!!!!!!!!!!!!!!!!!!!!!!!! "module_id" => "form", // !!!!!!!!!!!!!!!!!!!!!!!!! "items_id" => "menu_webforms_list", // !!!!!!!!!!!!!!!!!!!!!!!!! "items" => $arFormsList, // !!!!!!!!!!!!!!!!!!!!!!!!! ); // если нам нужно добавить ещё пункты - точно так же добавляем элементы в массив $aMenu["items"] // ............ // вернем полученный список return $aMenu; } // если нет доступа, вернем false return false; ?>