覆盖Magento行动

时间:2011-04-18 14:51:58

标签: php magento override

有很多次我想要做的就是覆盖控制器上的特定动作,而不是整个事情。在大多数情况下,我只是覆盖整个控制器,但我想知道是否有更好的方法? Magento是否有办法在控制器中覆盖单个动作,而原始控制器和其他动作保持不变?

示例:

class Mage_Core_AwesomeController extends Mage_Core_Controller_Front_Action {

    //has url of awesome/index
    public function indexAction(){
        //Some Awesome code
    }

    //has url of awesome/torewrite
    public function torewriteAction(){
        //Some Awesome code
    }

}

class Local_Core_AwesomeController extends Mage_Core_AwesomeController {

    //has url of awesome/torewrite
    public function torewriteAction(){
        //Some Awesome Override code
    }

}

所以url awesome / torewrite将转到Local_Core_AwesomeController,但url awesome / index将转到Mage_Core_AwesomeController。

这个例子显然是捏造的,它仅仅是为了表明理论上我想要的东西。所以请不要试图纠正这个例子,只是展示一下覆盖一个动作的最佳方法。

我认为重要的是要注意我不想重写网址,只是覆盖操作。如果没有重写网址,这可能是不可能的?只是当重写url时,布局中的标签会发生变化,我宁愿保持它们不变。

1 个答案:

答案 0 :(得分:6)

Local/Core/etc/config.xml中,在路由器中定义要覆盖的控制器。

<config>
    ...
    <frontend> // Use <admin> for backend routers
        <routers>
            <core> // <-- this is the router name
                <args>
                    <modules>
                        <local_core before="Mage_Core">Local_Core</local_core>
                    </modules>
                </args>
            </core>
        </routers>
    </frontend>
    ...
</config>

Magento现在会在Local/Core/controllers之前检查Mage/Core/controllers以查找以core开头的路径名(路由器名称)。上面的PHP类已经正确了。

这只是在this page大约一半处轻轻暗示的地方:

  

从Magento 1.3开始,您只需将模块添加到前端路由器即可。重写不再是必要的。