How to overload a controller,magento controller rewrite,重写
How to overload a controller
(Magento 1.3.0: For those having problems overloading controllers and/or users of LKC_ModularRouters by Lee Saferite, see this forum post.)
In this example we’re overloading Mage_Checkout_CartController::indexAction()
.
1. Create your module folders and files |
-
app/code/local/MyNameSpace/MyModule/etc/config.xml
-
app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
-
app/etc/modules/MyNameSpace_All.xml
2. Edit /etc/config.xml |
Create app/code/local/MyNameSpace/MyModule/etc/config.xml
with the following content:
-
<?xml version="1.0"?>
-
<config>
-
<modules>
-
<MyNameSpace_MyModule>
-
<version>0.1.0</version>
-
</MyNameSpace_MyModule>
-
</modules>
-
<global>
-
<!-- This rewrite rule could be added to the database instead -->
-
<rewrite>
-
<!-- This is an identifier for your rewrite that should be unique -->
-
<!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER -->
-
<mynamespace_mymodule_checkout_cart>
-
<from><![CDATA[#^/checkout/cart/#]]></from>
-
<!--
-
- mymodule matches the router frontname below
-
- checkout_cart matches the path to your controller
-
-
Considering the router below, "/mymodule/checkout_cart/" will be
-
"translated" to "/MyNameSpace/MyModule/controllers/Checkout/CartController.php" (?)
-
-->
-
<to>/mymodule/checkout_cart/</to>
-
</mynamespace_mymodule_checkout_cart>
-
</rewrite>
-
</global>
-
<!--
-
If you want to overload an admin controller this tag should be <admin> instead,
-
or <adminhtml> if youre overloading such stuff (?)
-
-->
-
<frontend>
-
<routers>
-
<mynamespace_mymodule>
-
<!-- should be set to "admin" when overloading admin stuff (?) -->
-
<use>standard</use>
-
<args>
-
<module>MyNameSpace_MyModule</module>
-
<!-- This is used when "catching" the rewrite above -->
-
<frontName>mymodule</frontName>
-
</args>
-
</mynamespace_mymodule>
-
</routers>
-
</frontend>
-
</config>
Note: The above didn’t work for me when I override catalog/product controller. I had to use:
-
<from><![CDATA[#^catalog/product/#]]></from>
-
<to>mymodule/mycontroller</to>
(notice the missing leading slash)
Since Magento 1.3 you can simply add your module to the frontend router. Rewrites are not neccessary any more:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<config>
-
<modules>
-
<MyNameSpace_MyModule>
-
<version>0.1.0</version>
-
</MyNameSpace_MyModule>
-
</modules>
-
-
<frontend>
-
<routers>
-
<checkout>
-
<args>
-
<modules>
-
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>
-
</modules>
-
</args>
-
</checkout>
-
</routers>
-
</frontend>
-
</config>
Please note that before=”Mage_Checkout”
will load your controller first if available and fall back to Magento’s if not.
If the controller is in another folder, you’ll have to modify the code: app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
. Replace
-
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>
with
-
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule>
3. Edit ''controllers/Checkout/CartController.php'' |
Create app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
with the following content: (the only change to indexAction()
is adding an error_log()
call):
-
<?php
-
# Controllers are not autoloaded so we will have to do it manually:
-
require_once 'Mage/Checkout/controllers/CartController.php';
-
class MyNameSpace_MyModule_Checkout_CartController extends Mage_Checkout_CartController
-
{
-
# Overloaded indexAction
-
public function indexAction() {
-
# Just to make sure
-
error_log('Yes, I did it!');
-
parent::indexAction();
-
}
-
}
4. Edit ''app/etc/modules/MyNameSpace_All.xml'' |
(This is to activate your module)
-
<?xml version="1.0"?>
-
<config>
-
<modules>
-
<MyNameSpace_MyModule>
-
<active>true</active>
-
<codePool>local</codePool>
-
</MyNameSpace_MyModule>
-
</modules>
-
</config>
5. Edit ''app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml'' |
Add the following to use the same update handle as before:
-
<mynamespace_mymodule_checkout_cart_index>
-
<update handle="checkout_cart_index"/>
-
</mynamespace_mymodule_checkout_cart_index>
(Note that these tags seem to be case sensitive. Try using all lowercase if this isn’t working for you)
[by Hendy: When I override catalog/product/view using the method described in this Wiki or here, I didn’t have to do the above. However, when using the 'cms way', I had to update the handle manually.]
The above item did not work for me (2009-02-19 by Jonathan M Carvalho)
I discovered that the file to change is app/design/frontend/[myinterface]/[mytheme]/layout/mymodule.xml
Add the following lines:
-
<mynamespace_mymodule_checkout_cart_index>
-
<update handle="checkout_cart_index"/>
-
</mynamespace_mymodule_checkout_cart_index>
7. Point your browser to /checkout/cart/ |
In your PHP error log, you should find ‘Yes, I did it!’.
You need to be extra precise with the rewrite regular expression because errors are very hard to find.
<from><![CDATA[#^/checkout/cart/#]]></from>
from:http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/how_to_overload_a_controller