Конфигурация административного меню модуля
Описание
В данном разделе описывается управление главным административным меню.
Основная структура
Для каждого модуля параметры меню задаются файлом /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;
?>