How to overload controller in Magento?

1. Create your modulefolders and files

  1. Magento/app/code/local/MyNameSpace/MyModule/etc/config.xml
  2. Magento/app/code/local/MyNameSpace/MyModule/ controllers/Checkout/Cart Controller.php
  3. Magento/app/etc/modules/MyNameSpace_All.xml

2. Edit/etc/config.xml

Go to Magento/app/code/local/MyNameSpace/MyModule/etc/config.xmland paste the following xml into it (comments I’m not a 100% sureabout are ending with “(?)”):

  1. <?xml version="1.0"?>
  2. <config>
  3. <wbr><wbr><span><span>&lt;modules<span>&gt;</span></span></span></wbr></wbr>
  4. <wbr><wbr><wbr><wbr><span><span>&lt;MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  5. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;version<span>&gt;</span></span></span>0.1.0<span><span>&lt;/version<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  6. <wbr><wbr><wbr><wbr><span><span>&lt;/MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  7. <wbr><wbr><span><span>&lt;/modules<span>&gt;</span></span></span></wbr></wbr>
  8. <wbr><wbr><span><span>&lt;global<span>&gt;</span></span></span></wbr></wbr>
  9. <wbr><wbr><wbr><wbr><span><span>&lt;!-- This rewrite rulecould be added to the database instead--&gt;</span></span></wbr></wbr></wbr></wbr>
  10. <wbr><wbr><wbr><wbr><span><span>&lt;rewrite<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  11. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;!-- This is an identifier for yourrewrite that should be unique--&gt;</span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  12. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;!-- THIS IS THE CLASSNAME IN YOUR OWN<span>CONTROLLER</span>--&gt;</span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  13. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;mynamespace_mymodule_checkout_cart<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  14. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;from<span>&gt;</span></span></span><span>&lt;![CDATA[#^/checkout/cart/#]]&gt;</span><span><span>&lt;/from<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  15. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;!--</span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  16. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> - mymodulematches the router frontname below</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  17. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -checkout_cart matches the path to your <span>controller</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  18. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  19. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Considering the router below, "/mymodule/checkout_cart/" willbe</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  20. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>"translated" to "/MyNameSpace/MyModule/<span>controller</span>s/Checkout/Cart<span>Controller</span>.php" (?)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  21. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> --&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  22. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;to<span>&gt;</span></span></span>/mymodule/checkout_cart/<span><span>&lt;/to<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  23. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;/mynamespace_mymodule_checkout_cart<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  24. <wbr><wbr><wbr><wbr><span><span>&lt;/rewrite<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  25. <wbr><wbr><span><span>&lt;/global<span>&gt;</span></span></span></wbr></wbr>
  26. <wbr><wbr><span><span>&lt;!--</span></span></wbr></wbr>
  27. <wbr><wbr> If you want to overload an admin-<span>controller</span> this tag should be&lt;admin&gt;</wbr></wbr> instead,
  28. <wbr><wbr> or<span><span>&lt;adminhtml<span>&gt;</span></span></span> if youre overloadingsuch stuff (?)</wbr></wbr>
  29. <wbr><wbr>--&gt;</wbr></wbr>
  30. <wbr><wbr><span><span>&lt;frontend<span>&gt;</span></span></span></wbr></wbr>
  31. <wbr><wbr><wbr><wbr><span><span>&lt;routers<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  32. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;mynamespace_mymodule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  33. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;!-- shouldbe set to "admin" when overloading admin stuff (?)--&gt;</span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  34. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;use<span>&gt;</span></span></span>standard<span><span>&lt;/use<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  35. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;args<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  36. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;module<span>&gt;</span></span></span>MyNameSpace_MyModule<span><span>&lt;/module<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  37. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;!-- This is used when"catching" the rewrite above --&gt;</span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  38. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;frontName<span>&gt;</span></span></span>mymodule<span><span>&lt;/frontName<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  39. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;/args<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  40. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;/mynamespace_mymodule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  41. <wbr><wbr><wbr><wbr><span><span>&lt;/routers<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  42. <wbr><wbr><span><span>&lt;/frontend<span>&gt;</span></span></span></wbr></wbr>
  43. </config>

[by Hendy: The above didn’t work for me when I override catalog/product controller. I had to use:

  1. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;from<span>&gt;</span></span></span><span>&lt;![CDATA[#^catalog/product/#]]&gt;</span><span><span>&lt;/from<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  2. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;to<span>&gt;</span></span></span>mymodule/my<span>controller</span><span><span>&lt;/to<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

(notice the missing leading slash)]

by AxelH: Since Magento 1.3 youcan simply add your module to the frontend router. Rewrites are notneccessary any more:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config>
  3. <wbr><wbr><span><span>&lt;modules<span>&gt;</span></span></span></wbr></wbr>
  4. <wbr><wbr><wbr><wbr><span><span>&lt;MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  5. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;version<span>&gt;</span></span></span>0.1.0<span><span>&lt;/version<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  6. <wbr><wbr><wbr><wbr><span><span>&lt;/MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  7. <wbr><wbr><span><span>&lt;/modules<span>&gt;</span></span></span></wbr></wbr>
  8. <wbr></wbr>
  9. <wbr><wbr><span><span>&lt;frontend<span>&gt;</span></span></span></wbr></wbr>
  10. <wbr><wbr><wbr><wbr><span><span>&lt;routers<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  11. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;checkout<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  12. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;args<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  13. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;modules<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  14. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;MyNameSpace_MyModule</span> <span>before</span>=<span>"Mage_Checkout"</span><span>&gt;</span></span>MyNameSpace_MyModule<span><span>&lt;/MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  15. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;/modules<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  16. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;/args<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  17. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;/checkout<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  18. <wbr><wbr><wbr><wbr><span><span>&lt;/routers<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  19. <wbr><wbr><span><span>&lt;/frontend<span>&gt;</span></span></span></wbr></wbr>
  20. </config>

Please note that before=”Mage_Checkout” will load yourcontroller first if available andfallback to Magento’s if not.

[Edit by lichal: For me this code doesn’t work, because thecontroller is in the folder (notethe bold folder): ‘Magento/app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php’.In order to fix it the line 14:

  1. <wbr><wbr><span><span>&lt;MyNameSpace_MyModule</span><span>before</span>=<span>"Mage_Checkout"</span><span>&gt;</span></span>MyNameSpace_MyModule<span><span>&lt;/MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr>

Has to be:

  1. <wbr><wbr><span><span>&lt;MyNameSpace_MyModule</span><span>before</span>=<span>"Mage_Checkout"</span><span>&gt;</span></span>MyNameSpace_MyModule_Checkout<span><span>&lt;/MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr>

end Edit by lichal]

3. Edit /controllers/Checkout/CartController.php

Paste the following php code into Magento/app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php(the only change we’re doing to the indexAction() is adding anerror_log() message):

  1. <?php
  2. # Controllers are not autoloaded so we will haveto do it manually:
  3. require_once 'Mage/Checkout/controllers/CartController.php';
  4. classMyNameSpace_MyModule_Checkout_Cart Controller extendsMage_Checkout_Cart Controller
  5. {
  6. <wbr><wbr><span># Overloaded indexAction</span></wbr></wbr>
  7. <wbr><wbr><span>public</span> <span>function</span>indexAction<span>(</span><span>)</span></wbr></wbr>
  8. <wbr><wbr><span>{</span></wbr></wbr>
  9. <wbr><wbr><wbr><wbr><span># Just tomake sure</span></wbr></wbr></wbr></wbr>
  10. <wbr><wbr><wbr><wbr><span>error_log</span><span>(</span><span>'Yes, I did it!'</span><span>)</span>;</wbr></wbr></wbr></wbr>
  11. <wbr><wbr><wbr><wbr> parent::<span>indexAction</span><span>(</span><span>)</span>;</wbr></wbr></wbr></wbr>
  12. <wbr><wbr><span>}</span></wbr></wbr>
  13. }

4. Edit Magento/app/etc/modules/MyNameSpace_All.xml

(This is to activate your module)

  1. <?xml version="1.0"?>
  2. <config>
  3. <wbr><wbr><span><span>&lt;modules<span>&gt;</span></span></span></wbr></wbr>
  4. <wbr><wbr><wbr><wbr><span><span>&lt;MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  5. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;active<span>&gt;</span></span></span>true<span><span>&lt;/active<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  6. <wbr><wbr><wbr><wbr><wbr><wbr><span><span>&lt;codePool<span>&gt;</span></span></span>local<span><span>&lt;/codePool<span>&gt;</span></span></span></wbr></wbr></wbr></wbr></wbr></wbr>
  7. <wbr><wbr><wbr><wbr><span><span>&lt;/MyNameSpace_MyModule<span>&gt;</span></span></span></wbr></wbr></wbr></wbr>
  8. <wbr><wbr><span><span>&lt;/modules<span>&gt;</span></span></span></wbr></wbr>
  9. </config>

[Edit 2009-07-26 by PhilFreo: Steps 1-4 alone were sufficientfor me to overload methods from CartController. I’d like to see some clarificationon exactly what steps 5+ are doing and when they are needed.]


[Edit 2009-07-29 by hexdoll: used steps 1-4 to override the customer/account controller, the error_log occurs but theexpected interface templates are not shown]

5. Edit Magento/app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml

Add the following to use the same update handle as before:

  1. <mynamespace_mymodule_checkout_cart_index>
  2. <wbr><wbr><span><span>&lt;update</span> <span>handle</span>=<span>"checkout_cart_index"</span><span>/&gt;</span></span></wbr></wbr>
  3. </mynamespace_mymodule_checkout_cart_index>

(Note that these tags seem to be case sensitive. Try using alllowercase if this isn’t working for you)

[by Hendy: When I overridecatalog/product/view using the method described in this Wikior here, I didn’t have to do the above. However,when using the 'cms way', I had to update the handlemanually.]

6. The above item do not worked for me (updated: 2009-02-19 by:Jonathan M Carvalho)

After loose so many hours I discovery that the file to change is“Magento/app/design/frontend/[myinterface]/[mytheme]/layout/mymodule.xml”

Update 2009-06-17 by Gabriiiel : added the good syntax(mynamespace_mymodule_checkout_cart_index)

Add the following lines:

  1. <mynamespace_mymodule_checkout_cart_index>
  2. <wbr><wbr><span><span>&lt;update</span> <span>handle</span>=<span>"checkout_cart_index"</span><span>/&gt;</span></span><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  3. </mynamespace_mymodule_checkout_cart_index>

Using version 1.2.1

7. Point your browser to/checkout/cart/

Take a look in your php error log and you should find ‘Yes, Idid it!’.

8. You need to get extra precise with the rewrite regularexpression cause this causes a very hard time. In thispart.

 <from><![CDATA[#^/checkout/cart/#]]></from>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值