我正在尝试覆盖Magento社区模块中的Ajax控制器。问题是只有在方法不存在的情况下才会调用我的控制器。我无法覆盖任何被覆盖的控制器方法。
这是我的代码
config.xml中:
<frontend>
<routers>
<overriden_module>
<args>
<modules>
<My_Module before="Overriden_Module">My_Module</My_Module>
</modules>
</args>
</overriden_module>
</routers>
</frontend>
我正在覆盖ajax控制器 - AjaxController.php:
<?php
require_once (Mage::getModuleDir('controllers', 'Overriden_Module') . DS .'AjaxController.php');
class My_Module_AjaxController extends Overriden_Module_AjaxController {
//This is an overridden method and no hit
public function streetAction() {
die('FOO');
}
// This action is not overridden and gets called
public function otherAction(){
die('BAR')
}
}
根据要求,这是我重写的模块中的路由器部分:
<routers>
<module_name>
<use>standard</use>
<args>
<module>Module_name</module>
<frontName>frontname</frontName>
</args>
</module_name>
<checkout>
<args>
<modules>
<Module_Name before="Mage_Checkout">Module_Name_Checkout</Module_Name>
</modules>
</args>
</checkout>
</routers>
谢谢。
答案 0 :(得分:0)
好了一些调试后我发现了导致问题的原因。 我重写的模块也定义了与前端同名的管理路由器。当Magento搜索路由器匹配以进行调度时,它将首先检查管理路由器,从而运行模块的管理控制器,甚至不检查前端路由器。
如果你在下面的代码中转储$this->_routers
,你会看到我正在谈论的内容。
app/code/core/Mage/Core/Controller/Varien/Front.php line 174:
while (!$request->isDispatched() && $i++<100) {
foreach ($this->_routers as $router) {
if ($router->match($this->getRequest())) {
break;
}
}
}
所以答案就是简单地覆盖管理员控制器