我正在尝试覆盖 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()
语句中的差异。
问题
哪些选项可确保与其他扩展更好地兼容?或者,还有更好的方法?
处理完操作后,我将在控制器类中重定向到哪里?这是我的简单控制器:
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
- 与上述相同的疑问......
感谢任何花时间阅读这个冗长问题的人!!!