0

我正在尝试覆盖 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,该模块将无法与“增强型管理产品网格”一起使用,因为它会POST-www.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. 虽然这很好用,但我的感觉是正确的 url 应该是www.mysite.com/index.php/enhancedgrid/catalog_product/index. 但是如果我不知道安装了哪些其他扩展,我不知道它是否真的很重要以及如何去做。

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

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

4

1 回答 1

1

我做了一些研究并试图自己回答这些问题,至少对于第 1 点,我现在非常有信心:

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

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

    虽然可以解决这些特殊情况,但最好将模块滑入 admin front name/adminhtml config router 节点,然后注意控制器名称和 Mage_Adminhtml 模块控制器名称之间没有重叠。”

  2. 我仍然没有彻底理解,为什么*/*/index有效,它重定向到 www.mysite.com/index.php/admin/catalog_product/index 而不管其他模块中定义的重写。但它有效,所以我会留下它。

于 2013-03-14T21:55:47.120 回答