понедельник, 15 июня 2009 г.

Подмена родного контроллера (controller) в Magento своим.

Напишу как подменить родной контроллер в Magento, своим, без изменения родного кода магазина.

На примере подмены контроллера для корзины.

1.Сначала нужно создать непосредственно файлы модуля

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


2. Cоздаем /etc/config.xml в нашем модуле



  1. <?xml version="1.0"?>
  2. <config>
  3. <modules>
  4. <MyNameSpace_MyModule>
  5. <version>0.1.0</version>
  6. </MyNameSpace_MyModule>
  7. </modules>
  8. <global>
  9. <rewrite>
  10. <!-- Это имя класса для Вашего контроллера -->
  11. <mynamespace_mymodule_checkout_cart>
  12. <from><![CDATA[#^/checkout/cart/#]]></from>
  13. <!-- Путь к родному контроллеру который требуется подменить
  14. to - путь к нашему контрллеру
  15. -->
  16. <to>/mymodule/checkout_cart/</to>
  17. </mynamespace_mymodule_checkout_cart>
  18. </rewrite>
  19. </global>
  20. <!--
  21. Если Вы хотите переписать admin контроллер, то нужно написать admin вместо frontend
  22. -->
  23. <frontend>
  24. <routers>
  25. <mynamespace_mymodule>
  26. <use>standard</use>
  27. <args>
  28. <module>MyNameSpace_MyModule</module>
  29. <frontName>mymodule</frontName>
  30. </args>
  31. </mynamespace_mymodule>
  32. </routers>
  33. </frontend>
  34. </config>

3. Изменение /app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php

Это наш контролер


2. # Controllers are not autoloaded so we will have to do it manually:
3. require_once 'Mage/Checkout/controllers/CartController.php';
4. class MyNameSpace_MyModule_Checkout_CartController extends Mage_Checkout_CartController
5. {
6. # Overloaded indexAction
7. public function indexAction()
8. {
9. # Just to make sure
10. error_log('Yes, I did it!');
11. parent::indexAction();
12. }
13.}


4. Создаем конфиг файл, чтобы наш модуль активировался /app/etc/modules/MyNameSpace_All.xml


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



5. И последнее модифицирование файла, для того чтобы все блоки в родном контроллере, адекватно работали и в нашем созданом
Magento/app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml


  1. <mynamespace_mymodule_checkout_cart_index>
  2. <update handle="checkout_cart_index"/>
  3. </mynamespace_mymodule_checkout_cart_index>



Вот собственно и все, после всех манипуляций, все должно заработать