控制器覆盖Magento(现有方法未被覆盖)

时间:2012-12-04 10:01:13

标签: php magento magento-1.7

我正在尝试覆盖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>

谢谢。

1 个答案:

答案 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;
            }
        }
    }

所以答案就是简单地覆盖管理员控制器