Magento重写控制器

重写--前端控制器

对于以重写 Mage_Checkout_CartController的indexAction()为例。
找到Mage/Checkout/CartController.php代码中的indexAction:

public function indexAction()
{
    echo "123";
    exit();
    $cart = $this->_getCart();
    if ($cart->getQuote()->getItemsCount()) {
        $cart->init();
        $cart->save();

        if (!$this->_getQuote()->validateMinimumAmount()) {
            $minimumAmount = Mage::app()->getLocale()->currency(Mage::app()->getStore()->getCurrentCurrencyCode())
                ->toCurrency(Mage::getStoreConfig('sales/minimum_order/amount'));

            $warning = Mage::getStoreConfig('sales/minimum_order/description')
                ? Mage::getStoreConfig('sales/minimum_order/description')
                : Mage::helper('checkout')->__('Minimum order amount is %s', $minimumAmount);

            $cart->getCheckoutSession()->addNotice($warning);
        }
    }

到前台访问xxxxx/checkout/cart/index:可以看到如图所示:
图片描述
那么要想重写这个控制器中的index方法,怎么办呢?
先找到Mage/Checkout模块中的etc/config.xml配置文件,找到如下代码:

<frontend>
......
        <routers>
            <checkout><!--这个就表示该模块的命名空间,也即是我们后面要复写该模块的所用到的地址标识符,先记下这个模块的标签名checkout-->
                <use>standard</use>
                <args>
                    <module>Mage_Checkout</module>
                    <frontName>checkout</frontName>
                </args>
            </checkout>
        </routers>
......
</frontend>    

接下来,就依次新建模块的目录结构:

App
|---Count
|   |---controllers
|   |    |---CartController.php
|   |---etc
|        |---config.xml

再新建etc/modules/App_Count.xml,加载新建的模块,

<?xml version="1.0"?>
<config>
    <modules>
        <App_Count>
            <active>true</active>
            <codePool>local</codePool>
        </App_Count>
    </modules>
</config>

就下来,我们就要配置config.xml文件来完成对Mage/Checkout/CartController.php的重写:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <App_Count>
            <version>0.1.0</version>
        </App_Count>      
    </modules>
    <frontend>
        <routers>
            <count>
                <use>standard</use>
                <args>
                    <module>App_Count</module>
                    <frontName>count</frontName>
                </args>
            </count>
            <!--rewrite controller-->
            <checkout><!--需要被重写模块的命名空间,这里是上面在Mage/Checkout/etc/config.xml找到的checkout标签-->
                <args>
                    <modules>
                        <App_Count before="Mage_Checkout">App_Count</App_Count>
                        <!--<App_Count>表示当前模块module的名字,before表示告诉magento当前模块中的控制器优先级高于Mage_Checkout模块下的控制器,App_Count是表示当前模块放controller的文件夹路径-->
                    </modules>
                </args>
            </checkout>
        </routers>
    </frontend>  
</config>

然后按照Mage/Checkout的文件目录新建App/Count/controllers/CartController.php:

require_once "Mage/Checkout/controllers/CartController.php";//这里需要注意,需要引入重写控制器的详细路径,不能省略
class App_Count_CartController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        echo "The controller has been rewritten";
    }

}

我们来重写刷新页面,看看有无变化:
图片描述
到此,前台控制器就已经重写成功了。

重写--后端控制器

重写后端控制器与重写前端控制器不同的是config.xml中的配置不一样,例如:

<?xml version="1.0"?>
<config>
    <modules>
        <App_Count>
            <version>0.1.0</version>
        </App_Count>
    </modules>
    <frontend>
        <routers>
            <cms>
                <args>
                    <modules>
                        <App_Count before="Mage_Cms">App_Count</App_Count>
                    </modules>
                </args>
            </cms>
        </routers>
    </frontend>
    <admin>
        <routers>
            <adminhtml><!--这里对应的是重写模块对应的后台命名空间-->
                <args>
                    <modules>
                        <App_Count before="Mage_Adminhtml">App_Count_Adminhtml</App_Count>
                    </modules>
                    <!--这里跟前台的原理一样,只是是重写的后端的控制器,所有优先级是相对于Mage_Adminhtml而言-->
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

对Magento的控制器进行复写,在对magento进行二次开发过程中,必须要掌握的技能,上一次记录了如何对magento中的block进行复写,这次记录下如何对magento中模块的控制器进行复写。
首先,对控制器的复写,需要分清是对Frontend Controller还是Backend Controller的复写;


denson
366 声望57 粉丝