我正在尝试覆盖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
。虽然这很好用,但我的感觉是正确的网址应该是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
- 与上述相同的疑问......
感谢任何花时间阅读这个长篇问题的人!!!
答案 0 :(得分:1)
我做了一些研究并尝试自己回答问题,至少在第一名我现在非常自信:
选项1(使用标准管理员名称(adminhtml路由器)而不是定义自定义路由器)是首选方式,正如Alan Storm here所解释的那样:
“尽管可以为管理路由器定义多个前端名称,但我建议不要这样做(尽管previous advice)。管理控制台应用程序的某些部分假设前面的名称admin。虽然页面将加载并使用备用管理员名称,但某些功能(例如富文本编辑器的媒体库集成)可能不会。
虽然可以解决这些特殊情况,但最好是slipping your module进入管理员前端名称/ adminhtml配置路由器节点,然后注意控制器名称和控制器名称之间没有重叠Mage_Adminhtml模块控制器名称。“
我仍然没有完全理解,为什么*/*/index
有效,重定向到www.mysite.com/index.php/admin/catalog_product/index,无论其他模块中定义的重写如何。但是它有效,所以我会留下它。