Caching 动态更改Magento';管理员的HTML菜单选项

Caching 动态更改Magento';管理员的HTML菜单选项,caching,magento,menu,adminhtml,Caching,Magento,Menu,Adminhtml,我正在做一个“为了好玩”的项目,我希望它能作为一个“为了好玩”的开源项目发布。我已经构建了一个Arduino网络连接订单通知程序,并且正在构建它的Magento adminhtml界面。对于我正在做的事情来说,这似乎过于复杂,但这有其他对我有用的应用程序,我正在尝试学习一些新的东西 说到这里,我在Magento后端的“Reports”旁边创建了一个新的“Arduino”adminhtml菜单项。有时,Arduino的特定反馈可能会自动禁用模块,在这种情况下,我的目标是从页面中删除菜单项,除非有其

我正在做一个“为了好玩”的项目,我希望它能作为一个“为了好玩”的开源项目发布。我已经构建了一个Arduino网络连接订单通知程序,并且正在构建它的Magento adminhtml界面。对于我正在做的事情来说,这似乎过于复杂,但这有其他对我有用的应用程序,我正在尝试学习一些新的东西

说到这里,我在Magento后端的“Reports”旁边创建了一个新的“Arduino”adminhtml菜单项。有时,Arduino的特定反馈可能会自动禁用模块,在这种情况下,我的目标是从页面中删除菜单项,除非有其他子菜单项,在这种情况下,我只删除模块特定的菜单项。同样,对于这个项目来说,这似乎不太现实,但为了尽可能做到“正确”,这是我的目标,让其他人有可能添加“Arduino”菜单项

现在,如果缓存被关闭,我可以很好地工作,没有问题。这是另一种说法,“这不起作用,因为显然每个人都会打开缓存。”也就是说,下面是我开始使用的代码:

/**
*用于动态禁用Arduino菜单选项。
*
*@param变量事件观察者$Observer
*/
公共功能控制器动作布局生成前锁定(变量事件观察者$Observer)
{
//我们只想禁用arduino菜单,如果我们的模块在后端被特别禁用
if(Mage::helper('mynamespace\u myarduinomodule')->isDisabled())
{
/*@var$Varien\u Simplexml\u元素*/
/*@var$parent Varien\u Simplexml\u元素*/
$arduinoItems=Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu/arduinomenu/children');
$parent=Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu');
//如果arduino菜单选项中有其他菜单选项,我们只想隐藏
//与特定模块相关的菜单项,只保留顶级菜单项
如果($ARDUINOTEMS->children()->count()>1)
{
$parent->setNode(“arduino/children/myarduinomodule”,true);
}
//但是,如果没有,那么我们想隐藏整个arduino标签
其他的
{
$parent->setNode(“arduino”,true);
}
}
退还$this;
}
这显然增加了一些开销,但这只是在adminhtml部分。现在,我的目标是有一个“好”的解决方案,但我不确定是否有。我已经读过了,虽然我认为类似的东西可能适合我的目的(相反),但我更愿意创建一个不使用类重写的模块,这样我就不需要担心其他模块重写同一个类

有人对我如何处理这个问题有什么建议吗?如果我将自定义菜单项添加到现有的“父”菜单项(例如,如果我将Arduino选项添加到“系统”下),是否会出现相同的缓存问题

感谢您的时间和宝贵的资源

编辑:

  • 登录/退出似乎“修复”了我现有的问题并正确更新了菜单。当然,我不想强迫用户注销,但也许在某个地方有一个解决方案

看来,让它工作的唯一方法是每次进行更改时都清理菜单缓存。您可以使用下一个代码执行此操作:

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;

}

我开始认为我的解决方案对于我的特定情况是可以接受的,我可以简单地将用户重定向回仪表板,或者如果他们试图访问我的一个自定义后端页面/控制器,则显示适当的消息。不过,我还是希望在用户从后端注销之前自动删除我的菜单选项。如果我没有弄错的话,您可以这样做:比方说,您有许多扩展,您希望在菜单下收集这些扩展,这些扩展取决于扩展。如果客户购买了扩展并安装了系统,则扩展选项应显示在菜单中。对吗?还有,你到底有什么问题?如果你需要隐藏东西,我会使用一些jQuery或Prototype来动态隐藏元素。让页面在数据库(或其他地方)中查找一个字段,然后从那里开始。你需要在缓存中打一个洞,这里有一个很好的解读:记住,你安装的大多数插件都会要求你注销并再次登录,所以它们的所有更改都会反映出来,所以我想也可以要求用户这样做。