重写控制器magento


12

我需要从Controller覆盖名为_initAction的操作:

/app/code/core/Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php

到我自己的模块和控制器中:

/app/code/local/Qbikz/ToolTip/controllers/Adminhtml/Catalog/Product/AttributeController.php

我已经尝试了不同的方法来解决它:第一种方法where <from><to>我尝试了不同的组合(未显示404页):

 <rewrite>
     <qbikz_tooltip_adminhtml_catalog_product_attribute>
         <from><![CDATA[#^/adminpanel/catalog_product_attribute/edit/#]]></from>
         <to>/tooltip/adminhtml_catalog_product_attribute/init/</to>
     </qbikz_tooltip_adminhtml_catalog_product_attribute>
</rewrite>

+

 <frontend>
        <routers>
            <qbikz_tooltip>
                <use>admin</use>
                <args>
                    <module>Qbikz_ToolTip</module>
                    <frontName>catalog_product_attribute</frontName>
                </args>
            </qbikz_tooltip>
        </routers>
    </frontend>

第二种方法(页面显示忽略我的规则):

<admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <Qbikz before="Mage_Adminhtml_Catalog_Product">Qbikz_ToolTip_Adminhtml_Catalog_Product</Qbikz>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>

在我的控制器中,我放置了die(“ ok”); 但是它没有出现。也许有人可以帮忙?谢谢。


您还记得清除缓存吗?特别是配置缓存?
Benubird

“重塑控制器”?那是什么?
Buttle Butkus

是的,如果关闭了我的缓存。
塞子

覆盖可以吗?对不起,我的英语=)
塞子

Answers:


15

使用第二种方法,但稍作修改。您的XML应该如下所示:

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <Qbikz_ToolTip before="Mage_Adminhtml">Qbikz_ToolTip_Adminhtml</Qbikz_ToolTip>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

现在创建Qbikz/ToolTip/controllers/Adminhtml/Catalog/Product/AttributeController.php具有以下内容的文件:

<?php 
require_once 'Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php';
class Qbikz_ToolTip_Adminhtml_Catalog_Product_AttributeController extends Mage_Adminhtml_Catalog_Product_AttributeController {
   protected function _initAction(){
       //your magic here
   }
}

@Marius什么是最好的方式,以您的方式或require_once(Mage :: getModuleDir('controllers','Mage_Adminhtml')。DS.'Catalog'.DS.'Product'.DS.'AttributeController.php'); 另外,我想知道我们是否可以在单个模块中重写块和控制器,还是必须编写单独的模块才能写入块和控制器。
阿德南

两种方法具有相同的结果。但是,如果您想在政治上100%正确,请使用您提到的方法。您也可以使用相同的模块来重写块和控制器。
马吕斯

尝试覆盖Mage_Checkout :: CartController.php的indexAction()时,这似乎不起作用。
马克斯

在1.9.4.2中,这为我抛出了一个错误。控制器抛出404。也许现在有另外一种方法可以做到?覆盖结帐控制器时,发生在我身上
gabtzi

0

在我的onestepcheckout扩展程序中,配置文件:app / code / local / Gurutheme / Onestepcheckout / etc / config.xml

<frontend>
        <routers>
             <checkout>
                <args>
                    <modules>
                        <Gurutheme_Onestepcheckout before="Mage_Checkout">Gurutheme_Onestepcheckout</Gurutheme_Onestepcheckout>
                    </modules>
                </args>
            </checkout>
        </routers>
</frontend>

我添加了一个控制器

app/code/local/Gurutheme/Onestepcheckout/controllers/OnepageController.php

用于覆盖Onepage核心控制器

app/code/core/Mage/Checkout/controllers/OnepageController.php

这是该上位控制器的基本源代码:

require_once("Mage/Checkout/controllers/OnepageController.php");

class Gurutheme_Onestepcheckout_OnepageController extends Mage_Checkout_OnepageController {

}

重写magento控制器时,主要的事情是,我们应该包括原始控制器并对其进行扩展,它可以在所有预建功能起作用之前帮助所有本机行为。


仅当您在重写的操作中依赖原始类的其他(受保护)方法时。控制器中所有丢失的动作将由原始控制器处理。请注意,从技术上讲,您无需重写控制器,而是添加到名称的处理程序列表中
Fabian Schmengler,2016年

完全同意,我们实际上对其进行了重新路由,但应该将原始代码扩展为继承任何现有代码
phanvugiap

-1

我改写了企业愿望清单控制器。

在我的 config.xml

<frontend>
    <routers>
        <wishlist>
            <args>
                <modules>
                    <namespace_modulename before="Enterprise_Wishlist">Namespace_Modulename</namespace_modulename>
                </modules>
                <module>Namespace_Modulename</module>
                <frontName>shoppinglist</frontName>
            </args>
        </wishlist>
    </routers>
</frontend>

在我的IndexController添加以下行中:

require_once 'Enterprise/Wishlist/controllers/IndexController.php';

//before

class Namespace_Modulename_IndexController extends Enterprise_Wishlist_IndexController{}

您也可以像这样重写帮助程序:https : //magento.stackexchange.com/a/91474/33509

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.