我正在开发一个“for fun”项目,我希望将其作为“有趣”的开源项目发布。我已经建立了一个Arduino网络连接订单通知程序,我正在构建它的Magento adminhtml接口方面。对于我正在做的事情,这可能看起来过于复杂,但是这有其他对我有用的应用程序,我正在尝试学习新的东西。
话说回来,我在Magento后端的“Reports”旁边创建了一个新的“Arduino”adminhtml菜单项。有些时候Arduino的特定反馈可能会自动禁用模块,在这种情况下,我的目标是从页面中删除菜单项,除非有其他子菜单项,在这种情况下我只删除模块特定的菜单项。同样,对于这个项目来说,这似乎不太现实,但是为了尽可能“正确”这样做,这是我的目标,让其他人可以添加“Arduino”菜单项的可能性开放。
现在,我有这个工作伟大,没有问题,如果关闭IF缓存。这是另一种说法,“这不起作用,因为显然每个人都会打开缓存。”也就是说,这是我开始使用的代码:
/**
* 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部分。现在,我的目标是拥有一个“好”的解决方案,但我不确定是否有一个。我已经阅读了this very good blog post,虽然我认为这样的事情可能适用于我的目的(反过来),我宁愿创建一个不使用类重写的模块,这样我就不需要担心了与其他模块重写相同的类。
有人对我如何解决这个问题有任何建议吗?如果我将自定义菜单项添加到现有的“父”菜单项(例如,如果我要在“系统”下面添加我的Arduino选项),则缓存是一个问题吗?
感谢您抽出宝贵的时间和精力!
编辑:
答案 0 :(得分:0)
似乎让它工作的唯一方法是每次进行更改时清理菜单缓存。您可以使用下一个代码来完成:
Mage::app()->getCache()->clean(
Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(Mage_Adminhtml_Block_Page_Menu::CACHE_TAGS)
);
答案 1 :(得分:0)
关于如何删除项目的代码示例,无需在菜单上留下空文本:
/**
* 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;
}