На данный момент компонент "Меню"(bitrix:menu) позволяет выводить кнопки на административную панель только для управления "Типом меню для первого уровня", указанного в настройках самого компонента. Это оправдано при довольно распространённой структуре: меню раздела выводится отдельно в другом компоненте "Меню"(bitrix:menu), в настройках которого указывается как "Тип меню для первого уровня" и редактируется при переходе непосредственно в этот раздел.
Но не редко используется только одно меню и становится весьма затруднительно редактировать вложенное меню из публичной части сайта, приходится переходить в административную часть.
В этой статье рассмотрим решение, позволяющее обойти это ограничение.
[spoiler]
Параметр "SHOW_LAST_LEVEL_BUTTONS".
Думаю, сначала следует упомянуть о параметре "SHOW_LAST_LEVEL_BUTTONS", описания которого нет в документации.
Этот параметр позволяет выводить кнопки на административную панель не для типа меню, указанного в настройках компонента в параметре "Тип меню для первого уровня", а для "Типа меню для остальных уровней".
Только следует обратить внимание, что в массиве $arResult появятся два новых ключа: "initMenuDir" и "initMenuType" и потребуется учитывать это при построении пунктов меню, чтобы не обрабатывать в цикле эти ключи как пункты меню.
Параметр "SHOW_LAST_LEVEL_BUTTONS" необходимо указывать непосредственно в параметрах вызова компонента со значением "Y" при редактировании в режиме PHP-кода. При визуальном редактировании параметров компонента он не доступен.
Вывод кнопок программно в файле component_epilog.php шаблона компонента.
Если же необходимо выводить кнопки управления как "Типом меню для первого уровня", так и "Типом меню для остальных уровней", то создаём файл "" в папке шаблона компонента, который Вы используете.
В коде компонента, практически в самом конце, ищем следующие строчки(приведено с некоторыми упущениями):
и копируем их в файл "" шаблона компонента. Далее потребуется внести 2 небольшие правки.
Во-первых, заменим строчку:
на
чтобы не добавлялись второй раз кнопки на административную панель для того же самого типа меню.
Во-вторых, необходимо явно указать тип меню, для которого будем добавлять кнопки, т.е. "Тип меню для остальных уровней":
а также определим переменные с путями для добавления файлов меню, их редактирования или удаления:
Эти строчки следует указать сразу после:
Все сделанные нами изменения в скопированном коде будут выглядеть так:
Но не редко используется только одно меню и становится весьма затруднительно редактировать вложенное меню из публичной части сайта, приходится переходить в административную часть.
В этой статье рассмотрим решение, позволяющее обойти это ограничение.
[spoiler]
Параметр "SHOW_LAST_LEVEL_BUTTONS".
Думаю, сначала следует упомянуть о параметре "SHOW_LAST_LEVEL_BUTTONS", описания которого нет в документации.
Этот параметр позволяет выводить кнопки на административную панель не для типа меню, указанного в настройках компонента в параметре "Тип меню для первого уровня", а для "Типа меню для остальных уровней".
Только следует обратить внимание, что в массиве $arResult появятся два новых ключа: "initMenuDir" и "initMenuType" и потребуется учитывать это при построении пунктов меню, чтобы не обрабатывать в цикле эти ключи как пункты меню.
Параметр "SHOW_LAST_LEVEL_BUTTONS" необходимо указывать непосредственно в параметрах вызова компонента со значением "Y" при редактировании в режиме PHP-кода. При визуальном редактировании параметров компонента он не доступен.
Вывод кнопок программно в файле component_epilog.php шаблона компонента.
Если же необходимо выводить кнопки управления как "Типом меню для первого уровня", так и "Типом меню для остальных уровней", то создаём файл "" в папке шаблона компонента, который Вы используете.
В коде компонента, практически в самом конце, ищем следующие строчки(приведено с некоторыми упущениями):
if($USER->IsAuthorized())
{
$menuExists = ($menuDir <> '');
$bFileman = $USER->CanDoOperation('fileman_add_element_to_menu') && $USER->CanDoOperation('fileman_edit_menu_elements');
$bMenuAdd = $bFileman && ($curDir != $menuDir || !$menuExists); // fm_create_new_file is checked later
$bMenuEdit = $bFileman && $menuExists && $USER->CanDoFileOperation('fm_edit_existent_file', array(SITE_ID, $menuDir.".".$menuType.".menu.php"));
$bMenuDelete = $bFileman && $curDir == $menuDir && $USER->CanDoFileOperation('fm_delete_file', array(SITE_ID, $menuDir.".".$menuType.".menu.php"));
if($bMenuAdd || $bMenuEdit || $bMenuDelete)
{
// ...
}
if ($bMenuAdd)
{
// ...
}
$arIcons = array();
if($bMenuEdit)
{
// ...
}
if ($bMenuAdd)
{
// ...
}
if ($bMenuDelete)
{
// ...
}
if($bMenuAdd || $bMenuEdit || $bMenuDelete)
$this->AddIncludeAreaIcons($arIcons);
} |
Во-первых, заменим строчку:
if($USER->IsAuthorized()) |
if($USER->IsAuthorized() && ($arParams["SHOW_LAST_LEVEL_BUTTONS"] != "Y" || $arParams['CHILD_MENU_TYPE'] != $arParams['ROOT_MENU_TYPE'])) |
Во-вторых, необходимо явно указать тип меню, для которого будем добавлять кнопки, т.е. "Тип меню для остальных уровней":
$menuType = $arParams['CHILD_MENU_TYPE']; |
$curDir = $APPLICATION->GetCurDir(); $menu = new CMenu($menuType); $menu->Init($curDir); $menuDir = $menu->MenuDir; |
if($USER->IsAuthorized() && ($arParams["SHOW_LAST_LEVEL_BUTTONS"] != "Y" || $arParams['CHILD_MENU_TYPE'] != $arParams['ROOT_MENU_TYPE'])) |
if($USER->IsAuthorized() && ($arParams["SHOW_LAST_LEVEL_BUTTONS"] != "Y" || $arParams['CHILD_MENU_TYPE'] != $arParams['ROOT_MENU_TYPE']))
{
$menuType = $arParams['CHILD_MENU_TYPE'];
$curDir = $APPLICATION->GetCurDir();
$menu = new CMenu($menuType);
$menu->Init($curDir);
$menuDir = $menu->MenuDir; |