对于以重写 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