Динамически изменяющийся пункт меню Magento adminhtml

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

С учетом вышесказанного я создал новый пункт adminhtml-меню "Arduino" рядом с "Отчеты" в бэкэнде 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 ответа

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

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

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

/**
 * 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;

}
Другие вопросы по тегам