Magento如何重寫控制器?

Magento重寫控制器

重寫--前端控制器

對於以重寫 Mage_Checkout_CartController的indexAction()爲例。
找到Mage/Checkout/CartController.php代碼中的indexAction:php

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配置文件,找到以下代碼:html

<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的重寫:app

<?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:frontend

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

}

咱們來重寫刷新頁面,看看有無變化:
圖片描述
到此,前臺控制器就已經重寫成功了。ui

重寫--後端控制器

重寫後端控制器與重寫前端控制器不一樣的是config.xml中的配置不同,例如:this

<?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的複寫;spa

相關文章
相關標籤/搜索