6  /  36

Размещение модуля в административном меню

Просмотров: 42180
Дата последнего изменения: 07.02.2024
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5

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

  Иконки

В качестве параметра иконки для страницы и пункта меню класс CSS.

"icon" => "mnu_my_module",
"page_icon" => "my_module",

Стили прописываются в файле /local/modules/my_module/install/themes/.default/my_module.css

Пример файла:
/*Menu icon*/
#fcmch_menu_icon {background-image:url(icons/my_module/mnu_my_module.gif);}
#fcmch_page_icon {background-image:url(icons/my_module/my_module.gif);}

Сами иконки необходимо загрузить в папку модуля /local/modules/my_module/install/themes/.default/icons/my_module/. При установке модуля содержимое папки /themes модуля должно быть скопировано в папку /local/themes/ и удалено оттуда при деинсталяции модуля.

  Кастомизация меню с помощью Событий

Вариант кастомизации административного меню - это создать свой обработчик события OnBuildGlobalMenu. Так можно вставить новые разделы, пункты или секции с подпунктами. Или изменить что угодно в уже сформированном меню. Обработчик можно прописать например в файл /local/php_interface/init.php.

Пример:
// DOC: http://dev.1c-bitrix.ru/api_help/main/events/onbuildglobalmenu.php
AddEventHandler("main", "OnBuildGlobalMenu", "DoBuildGlobalMenu");

function DoBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu) {

   // пример формирования меню можно подсмотреть: /bitrix/modules/[module]/admin/menu.php
   // системные варианты parent_menu: global_menu_desktop, global_menu_content, global_menu_services, 
   //global_menu_store, global_menu_statistics, global_menu_marketplace, global_menu_settings

   // это на случай добавления новых пунктов или секций с подпунктами
   $aModuleMenu[] = array(
      "parent_menu" => "global_menu_settings", 
      "icon" => "default_menu_icon",
      "page_icon" => "default_page_icon",
      "sort"=>"900",
      "text"=>"APC Opcode Cache",
      "title"=>"APC INFO",
      "url"=>"/local/admin/apc.php",
      "more_url"=>array(),
   );

   // а это на случай вклинивания в уже существующей секции
   foreach($aModuleMenu as $key => $menu) :

      // наверно достаточно идентифицировать только по $menu["items_id"]
      if ($menu["parent_menu"] == "global_menu_settings" && $menu["section"]=="TOOLS" && $menu["items_id"]=="menu_util") :
         // пункт добавится в конец списка существующих пунктов в секции
         $aModuleMenu[$key]["items"][] = array(
            "text" => "APC Opcode Cache",
            //"title" => "APC INFO",
            "url" => "/bitrix/admin/apc.php",
            "more_url" => array(),
         );
      endif;
      
   endforeach;


   /*
   // пример своего глобального раздела меню

   // нужен хотя бы один пункт в глобальном разделе, иначе раздел не появится
   $aModuleMenu[] = array(
      "parent_menu" => "global_menu_custom",
      "icon" => "default_menu_icon",
      "page_icon" => "default_page_icon",
      "sort"=>"100",
      "text"=>"Custom Item Text",
      "title"=>"Custom Item Tille",
      "url"=>"/bitrix/admin/custom_item.php",
      "more_url"=>array(),
   );

   // если нужно добавить глобальный раздел меню, то его можно отдать тут или заранее выше добавить в $aGlobalMenu
   $arRes = array(
      "global_menu_custom" => array(
         "menu_id" => "custom",
         "page_icon" => "services_title_icon",
         "index_icon" => "services_page_icon",
         "text" => "Custom text",
         "title" => "Custom title",
         "sort" => 900,
         "items_id" => "global_menu_custom",
         "help_section" => "custom",
         "items" => array()
      ),
   );

   return $arRes;
   */

} // function DoBuildGlobalMenu

  Сохранение настроек модуля

Код сохранения настроек модуля, передаваемый в запросе, должен располагаться перед кодом вывода формы полей настроек модуля. Иначе параметры модуля не выведутся сразу после сохранения. Пример, код:

<?//Save form
if($request->isPost() && $request["save"] && check_bitrix_sessid()){
    foreach($aTabs as $aTab){
        if(count($aTab['OPTIONS'])) {
            __AdmSettingsSaveOptions($module_id, $aTab["OPTIONS"]);
        }
    }
}?>

должен стоять перед выводом формы:

<!-- FORM TAB -->
<?php
$tabControl = new CAdminTabControl("tabControl", $aTabs);
?>
<? $tabControl->Begin(); ?>
<form method="post" action="<?=$APPLICATION->GetCurPage();?>?mid=<?=htmlspecialcharsbx($request["mid"]);?>&lang=<?=LANGUAGE_ID?>" name="<?=$module_id;?>">
    <? $tabControl->BeginNextTab(); ?>
        <?
        foreach ($aTabs as $aTab)
        {
            if(count($aTab['OPTIONS'])) {
                //$tabControl->BeginNextTab();
                __AdmSettingsDrawList($module_id, $aTab['OPTIONS']);
            }
        }
        ?>

    <? $tabControl->BeginNextTab(); ?>

        <?require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/admin/group_rights.php");?>

    <? $tabControl->Buttons(array('btnApply' => false, 'btnCancel' => false, 'btnSaveAndAdd' => false)); ?>

    <?=bitrix_sessid_post(); ?>
</form>
<? $tabControl->End(); ?>
<!-- X FORM TAB --> 

18
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии