Динамически изменяющийся пункт меню Magento adminhtml - PullRequest
5 голосов
/ 18 марта 2012

Я работаю над проектом "для удовольствия", который я надеюсь выпустить как проект "для удовольствия" с открытым исходным кодом.Я создал Arduino, уведомляющий о заказе, подключенный к сети, и создаю его интерфейс Magento adminhtml.Это может показаться слишком сложным для того, что я делаю, но у меня есть другие приложения, которые мне полезны, и я пытаюсь узнать что-то новое.

С учетом сказанного я создал новое "Arduino" adminhtmlпункт меню рядом с «Отчеты» в бэкэнде Magento.Есть определенные моменты, когда определенные отзывы от Arduino могут автоматически отключить модуль, и в этом случае моя цель состоит в том, чтобы удалить пункт меню со страницы, ЕСЛИ БЫЛИ другие элементы подменю, в этом случае я удаляю только те пункты меню, которые специфичны для моего модуля,Опять же, это может показаться не очень реалистичным для этого проекта, но в попытке сделать это как можно более «правильным», что является моей целью, оставить открытой возможность, что кто-то другой потенциально может добавить пункт меню «Arduino».

Теперь у меня есть этот работающий БОЛЬШОЙ, без проблем, ЕСЛИ кеширование отключено.Это еще один способ сказать: «это не работает, потому что, очевидно, у всех будет включен кеш».Тем не менее, вот код, с которого я начал:

/**
 * Used to disable the Arduino menu option dynamically.
 *
 * @param Varient_Event_Observer $observer
 */
public function controllerActionLayoutGenerateBlocksBefore(Varien_Event_Observer $observer)
{
    //We only want to disable the arduino menu if our module was specifically disabled in backend
    if(Mage::helper('mynamespace_myarduinomodule')->isDisabled())
    {
        /* @var $arduinoItems Varien_Simplexml_Element */
        /* @var $parent Varien_Simplexml_Element */
        $arduinoItems = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu/arduinomenu/children');
        $parent = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu');

        //If there are other menu options in the arduino menu option we only want to hide
        //the menu items related to our specific module, leaving the top level menu item alone
        if($arduinoItems->children()->count() > 1)
        {
            $parent->setNode("arduino/children/myarduinomodule", "", true);
        }
        //But, if not, then we want to hide the entire arduino tab
        else
        {
            $parent->setNode("arduino", "", true);
        }
    }

    return $this;

}

Это явно добавляет некоторые накладные расходы, но это только в разделе adminhtml.Теперь моя цель - найти «хорошее» решение, но я не уверен, что оно есть.Я прочитал это очень хорошее сообщение в блоге , и хотя я думаю, что что-то подобное может работать для моих целей (в обратном порядке), я бы предпочел создать модуль, который не использует переписывание классов, так что я не будуНе нужно беспокоиться о других модулях, переписывающих тот же класс.

У кого-нибудь есть какие-либо советы о том, как я могу подойти к этой проблеме?Является ли то же кеширование проблемой, если я должен был добавить свои пользовательские пункты меню в существующий «родительский» пункт меню (например, если бы я добавил свои параметры Arduino ниже «Система»)?

Спасибо за вашевремя и этот замечательный ресурс!

РЕДАКТИРОВАТЬ:

  • вход / выход из системы, похоже, "исправляет" мою существующую проблему и корректно обновляет меню.Конечно, я не хочу заставлять пользователя выходить из системы, но, может быть, где-то есть решение?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2014

Пример кода о том, как удалить элемент без оставления пустого текста в меню:

/**
 * Used to disable the Arduino menu option dynamically.
 *
 * @param Varient_Event_Observer $observer
 */
public function controller_action_layout_render_before(Varien_Event_Observer $observer)
{
    //We only want to disable the arduino menu if our module was specifically disabled in backend
    if(Mage::helper('mynamespace_myarduinomodule')->isDisabled())
    {
    $_config = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode();


    if($_config->menu->arduino->children){
        unset($_config->menu->arduino->children->myarduinomodule);
    }else{
        // hide the tab altogether
        unset($_config->menu->arduino);
    }
    Mage::getSingleton('admin/config')->getAdminhtmlConfig()->setXml($_config);

    return $this;

}
0 голосов
/ 19 октября 2012

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

Mage::app()->getCache()->clean(
    Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(Mage_Adminhtml_Block_Page_Menu::CACHE_TAGS)
);
...