Документация для разработчиков

Конфигурация административного меню модуля

В данном разделе описывается управление главным административным меню.

Основная структура

Для каждого модуля параметры меню задаются файлом /bitrix/modules/каталог_модуля/admin/menu.php. Результатом работы этого файла должен стать описательный массив меню модуля. Возможности API позволяют создать древовидное меню с любым уровнем вложенности, а также, с динамической подгрузкой отдельных ветвей.

Файл menu.php должен вернуть ассоциативный массив следующей структуры:

Ключ Описание
parent_menu Идентификатор раздела меню. Имеет смысл только для элемента верхнего уровня дерева меню модуля. Может принимать одно из следующих значений:
  • global_menu_content - раздел "Контент"
  • global_menu_marketing - раздел "Маркетинг"
  • global_menu_store - раздел "Магазин"
  • global_menu_services - раздел "Сервисы"
  • global_menu_statistics - раздел "Аналитика"
  • global_menu_marketplace - раздел "Marketplace"
  • global_menu_settings - раздел "Настройки"
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;
?>

Динамическая подгрузка ветвей меню.

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

  1. установить у пункта меню, начинающего динамическую ветвь параметр "dynamic"=>true;
  2. установить у пункта меню, начинающего динамическую ветвь значение параметра "items_id" и идентификатор модуля;
  3. добавить проверку флага "группа элементов открыта" при создании элементов ветви, предполагающие динамическую подгрузку.

Последний пункт представляет собой проверку метода 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;
?>


Пользовательские комментарии

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

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2019, «1С-Битрикс», 2019
Наверх