1

我正在尝试覆盖 Magento 社区模块中的 Ajax 控制器。问题是我的控制器只有在方法不存在时才会被调用。我不能覆盖任何被覆盖的控制器方法。

这是我的代码

配置.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>

谢谢你。

4

1 回答 1

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

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

于 2012-12-07T09:52:03.303 回答