如何正确添加Magento管理路由器以避免扩展之间的冲突

时间:2013-03-11 21:46:59

标签: magento magento-1.7

我正在尝试覆盖Mage_Adminhtml_Catalog_Product以添加功能,以便将某些操作添加到“管理产品”页面的网格中。我想知道如何正确获取路由器和重定向以防止与其他扩展冲突(例如增强型管理产品网格)。

我想出了两个选项,两个都有效,但我不确定其含义。

选项1

使用标准的adminhtml / catalog_product路由器,只需添加我的模块即可。这将POST新的网格操作www.mysite.com/index.php/admin/catalog_product/example

摘自config.xml

<config>
   ...
   <admin>
      <routers>
         <adminhtml>
            <args>
               <modules>
                  <mymodule before="Mage_Adminhtml">MyCompany_MyModule</mymodule>
               </modules>
            </args>
         </adminhtml>
      </routers>
   </admin>
</config>

观察者向网格添加动作:

class MyCompany_MyModule_Model_Observer {

   public function addExampleAction($observer) {
      $block = $observer->getEvent()->getBlock();
      if(get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
         && $block->getRequest()->getControllerName() == 'catalog_product') {
         $block->addItem('example', array(
             'label' => 'execute exampleAction',
             'url' => $block->getUrl('adminhtml/*/example')
         ));
      }
   }

请注意,adminhtml被指定为$block->getUrl()语句的第一部分。使用*/*/example时,该模块将无法使用“增强的管理产品网格”,因为它会POSTwww.mysite.com/index.php/enhancedgrid/catalog_product/example - 这不存在。 (我想所有模块都会出现这个问题......重写路由?)

选项2

向我的模块添加新路线。这将POST新的网格操作www.mysite.com/index.php/myrouter/catalog_product/example

摘自config.xml

<config>
   ...
   <admin>
      <routers>
         <myroute>
            <use>admin</use>
            <args>
               <module>MyCompany_MyModule</module>
               <frontName>myroute</frontName>
            </args>
         </myroute>
      </routers>
   </admin>
</config>

观察者向网格添加动作:

class MyCompany_MyModule_Model_Observer {

   public function addExampleAction($observer) {
      $block = $observer->getEvent()->getBlock();
      if(get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
         && $block->getRequest()->getControllerName() == 'catalog_product') {
         $block->addItem('example', array(
             'label' => 'execute exampleAction',
             'url' => $block->getUrl('myroute/*/example')
         ));
      }
   }

请注意$block->getUrl()语句中的差异。

问题

  1. 哪些选项可确保与其他扩展程序更好地兼容?或者有更好的方法吗?

  2. 处理完操作后,我会在控制器类中重定向到哪里?这是我简单的控制器:

    class MyCompany_MyModule_Catalog_ProductController 
          extends Mage_Adminhtml_Catalog_ProductController {
    
        public function exampleAction() {
           ... do stuff ...
           $this->_redirect('*/*/index');
        }
    }
    

    我们假设也安装了增强型管理产品网格。使用选项1,*/*/index重定向到www.mysite.com/index.php/admin/catalog_product/index。虽然这很好用,但我的感觉是正确的网址应该是www.mysite.com/index.php/enhancedgrid/catalog_product/index。但是我不知道它是否真的重要,如果我不知道安装了哪些其他扩展,该怎么做。

    使用选项2,*/*/index重定向到www.mysite.com/index.php/myrouter/catalog_product/index,这会导致空页面,因为MyCompany_MyModule_Catalog_ProductController没有indexAction()。所以我必须使用adminhtml/*/index而不是重定向到www.mysite.com/index.php/admin/catalog_product/index - 与上述相同的疑问......

  3. 感谢任何花时间阅读这个长篇问题的人!!!

1 个答案:

答案 0 :(得分:1)

我做了一些研究并尝试自己回答问题,至少在第一名我现在非常自信:

  1. 选项1(使用标准管理员名称(adminhtml路由器)而不是定义自定义路由器)是首选方式,正如Alan Storm here所解释的那样:

    “尽管可以为管理路由器定义多个前端名称,但我建议不要这样做(尽管previous advice)。管理控制台应用程序的某些部分假设前面的名称admin。虽然页面将加载并使用备用管理员名称,但某些功能(例如富文本编辑器的媒体库集成)可能不会。

    虽然可以解决这些特殊情况,但最好是slipping your module进入管理员前端名称/ adminhtml配置路由器节点,然后注意控制器名称和控制器名称之间没有重叠Mage_Adminhtml模块控制器名称。“

  2. 我仍然没有完全理解,为什么*/*/index有效,重定向到www.mysite.com/index.php/admin/catalog_product/index,无论其他模块中定义的重写如何。但是它有效,所以我会留下它。