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的复写;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。