1

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>

ありがとうございました。

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 に答える