對於以重寫 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