Можно Ли Переместить Узел Меню Администратора?
Мы используем модуль всплеска атрибутов Fishpig, который вставляет узел "Всплеск" на верхнем уровне меню администратора. Однако мы бы предпочли, чтобы он жил в меню каталога. Вот исходный XML, который модуль использует для вставки узла меню (в adminhtml.xml ):
<menu>
<attributeSplash translate="title" module="attributeSplash">
<title>Splash</title>
<sort_order>31</sort_order>
<children>
<pages translate="title">
<title>Manage Pages</title>
<action>attributeSplash_admin/adminhtml_page</action>
<sort_order>11</sort_order>
</pages>
<groups translate="title">
<title>Manage Groups</title>
<action>attributeSplash_admin/adminhtml_group</action>
<sort_order>6</sort_order>
</groups>
</children>
</attributeSplash>
</menu>
Я создал отдельный модуль со следующим в нем adminhtml.xml . Это отключает исходный узел меню и создает новый с теми же дочерними элементами в каталоге меню:
<menu>
<!-- Disable default menu node -->
<attributeSplash>
<disabled>1</disabled>
</attributeSplash>
<!-- Create replacement -->
<catalog>
<children>
<attribute_splash translate="title" module="attributeSplash">
<title>Attribute Splash (Brands)</title>
<sort_order>100</sort_order>
<children>
<pages translate="title">
<title>Manage Pages</title>
<action>attributeSplash_admin/adminhtml_page</action>
</pages>
<groups translate="title">
<title>Manage Groups</title>
<action>attributeSplash_admin/adminhtml_group</action>
</groups>
</children>
</attribute_splash>
</children>
</catalog>
</menu>
<!-- Access control nodes so non-administrators can be given access -->
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<attribute_splash translate="title" module="attributeSplash">
<title>Attribute Splash (Brands)</title>
<sort_order>100</sort_order>
<children>
<pages translate="title">
<title>Manage Pages</title>
</pages>
<groups translate="title">
<title>Manage Groups</title>
</groups>
</children>
</attribute_splash>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
Пока это будет работать нормально, но если модуль всплеска атрибутов Fishpig будет обновлен с помощью разных узлов меню, мне нужно будет обязательно изменить этот xml, чтобы он соответствовал. Что мне интересно, знает ли кто-нибудь о более чистом решении. Есть ли способ просто переместить узел меню, а не отключать его и создавать новый? Я бы не слишком удивился, если бы этого не было, но если есть, я хотел бы знать об этом, так как это было бы немного более устойчиво к обновлению.
3 answers
Насколько я знаю, это самое чистое и лучшее решение для этого. Я пробовал это по-разному, но все это требует "жестко закодированных" значений на каком-то уровне.
Просто небольшой совет, когда вы меняете расположение пункта меню, вы должны проверить метод _isAllowed
в контроллере adminhtml. Вероятно, там есть строка кода типа
return Mage::getSingleton('admin/session')->isAllowed('admin/attributesplash');
Это должно быть изменено на
return Mage::getSingleton('admin/session')->isAllowed('admin/catalog/attributesplash');
Чтобы разрешить пользователям, которые не являются суперадминистраторами, доступ к нему.
Нет, я не верю, что есть способ переместить узел меню иным способом, кроме как отключить и воссоздать его. Я сам использовал эту технику несколько раз.
Редактировать: На самом деле, одним из способов, которым вы могли бы сделать перемещение, было бы перегрузить Mage_Adminhtml_Block_Page_Menu::getMenuArray()
и изменить содержимое массива меню после его создания из базового XML.
Я не думаю, что это очень чистое решение, но это вариант. Если бы вы это сделали, вам пришлось бы вручную изменить параметр level
для узла меню, а также для его дочерних элементов, как только вы его переместили.
Для завершения ответа @Sander Mangel вам также следует проверить _setActiveMenu
в контроллере, а также некоторые файлы блоков.
Иногда вы можете отображать или скрывать некоторые кнопки (сохранять/редактировать /удалять) в зависимости от разрешений.
Так что регистрируйтесь /Блоки/Adminhtml/Сетка, Редактируйте, Форма, Вкладки,...