Контроллер переопределения Magento
Я хотел бы сделать выше. Я переопределил много файлов в прошлом... блок, модель, помощник.... но этот ускользает от меня.
Может кто-нибудь увидеть, что я делаю здесь не так: (я редактировал этот код... чтобы включить некоторые рекомендации сейчас...)
Вот моя структура папок (2 расположения контроллера в качестве теста):
/Idigital/Idgeneral/etc/config.xml
/Idigital/Idgeneral/controllers/Checkout/CartController.php
/Idigital/Idgeneral/controllers/CartController.php
Вот мой config.xml:
<?xml version="1.0"?>
<config>
<modules>
<idigital_idgeneral>
<version>0.1.0</version>
</idigital_idgeneral>
</modules>
<global>
<blocks>
<idgeneral><class>Idigital_Idgeneral_Block</class></idgeneral>
</blocks>
</global>
<frontend>
<routers>
<checkout>
<use>standard</use>
<args>
<modules>
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
</modules>
</args>
</checkout>
</routers>
<layout>
<updates>
<idgeneral>
<file>idigital.xml</file>
</idgeneral>
</updates>
</layout>
</frontend>
</config>
Я поместил файл моего контроллера в 2 места для тестирования. И вот верхняя часть моего первого файла контроллера:
require_once 'Mage/Checkout/controllers/CartController.php';
class Idigital_Idgeneral_Checkout_CartController extends Mage_Checkout_CartController
{
public function testAction()
{
var_dump('inside checkout/cart/test');exit;
}
/**
* Add product to shopping cart action
*/
public function addAction()
{
blah...
}
И мой второй контроллер:
require_once 'Mage/Checkout/controllers/CartController.php';
class Idigital_Idgeneral_CartController extends Mage_Checkout_CartController
{
public function testAction()
{
var_dump('inside cart/test');exit;
}
/**
* Add product to shopping cart action
*/
public function addAction()
{
blah...
}
Когда я захожу: /checkout/cart/add Im направляется к контроллеру мага... не мой местный. (У меня есть stmts var_dump в каждом.. так что я могу видеть, который запускается).
Когда я захожу / проверяю / корзина / тест - я получаю 404 Когда я захожу / корзина / добавляю или корзина / тест - я получаю 404, когда я посещаю общее / корзину / тест или общее / корзину / добавление - я получаю 404
5 ответов
Создайте свой модуль папки и файлы
app/code/local/MyNameSpace/MyModule/etc/config.xml app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php app/etc/modules/MyNameSpace_All.xml
Отредактируйте /etc/config.xml и создайте приложение /code/local/MyNameSpace/MyModule/etc/config.xml со следующим содержимым:
<?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>
Примечание: вышеописанное не сработало для меня, когда я переопределяю каталог / контроллер продукта. Я должен был использовать:
<from><![CDATA[#^catalog/product/#]]></from> <to>mymodule/mycontroller</to>
(обратите внимание на отсутствующую косую черту)
Начиная с Magento 1.3 вы можете просто добавить свой модуль в интерфейсный маршрутизатор. Переписать больше не нужно:
<?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>
Обратите внимание, что
before=”Mage_Checkout”
сначала загрузит ваш контроллер, если он доступен, и вернется к Magento, если нет.Если контроллер находится в другой папке, вам придется изменить код:
app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php.
замещать
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>
с
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule>
редактировать
'controllers/Checkout/CartController.php'
Создайте
app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
со следующим содержанием: (единственное изменение в indexAction() - добавление вызова error_log()):<?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(); } }
редактировать
'app/etc/modules/MyNameSpace_All.xml'
(Это для активации вашего модуля)правда местный
редактировать
'app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml'
и добавьте следующее, чтобы использовать тот же дескриптор обновления, что и раньше:<mynamespace_mymodule_checkout_cart_index> <update handle="checkout_cart_index"/> </mynamespace_mymodule_checkout_cart_index>
(Обратите внимание, что эти теги чувствительны к регистру. Попробуйте использовать все строчные буквы, если это не работает для вас)
[от Hendy: Когда я переопределяю каталог / товар / вид, используя метод, описанный в этой вики или здесь, мне не нужно было делать это выше. Однако при использовании "пути cms" мне пришлось обновлять дескриптор вручную.]
Вышеуказанный пункт не работал для меня (2009-02-19 Джонатан М Carvalho)
Я обнаружил, что файл для изменения - это app/design/frontend/[myinterface]/[mytheme]/layout/mymodule.xml
Добавьте следующие строки:
- Укажите ваш браузер на /checkout/cart/. В вашем журнале ошибок PHP вы должны найти "Да, я сделал это!".
Вы должны быть очень точными с регулярным выражением rewrite, потому что ошибки очень трудно найти.
<Idigital_Idgeneral before="Mage_Checkout">Idgeneral_Checkout</Idigital_Idgeneral>
Должно быть
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
или попробуйте переместить свой пользовательский контроллер до
../Idigital/Idgeneral/controllers/CartController.php
и использовать
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral</Idigital_Idgeneral>
Там также ошибка в вашем <modules>
местоположение тега. Так должно быть:
<config>
<modules>
<idigital_idgeneral>
<version>0.1.0</version>
</idigital_idgeneral>
</modules>
<global>
...
</global>
<frontend>
....
</frontend>
...
</config>
т.е. <modules>
не должно быть внутри <global>
Вот хороший учебник о том, как вывести дамп конфигурации дерева, которое Magento видит как XML: http://alanstorm.com/magento_config
Я оставляю это здесь для следующего бедного разработчика, вынужденного работать с этой jalopy. Многие из приведенных здесь инструкций взяты из документов magento, которые, как и его источник, представляют собой искаженный лабиринт неверного направления. Хорошо, достаточно жалоб...
Это работало для меня в версии 1.8
Создайте свое пространство имен и модуль: /app/code/local/MyNameSpace/MyModule
Создайте конфигурацию вашего модуля: /app/code/local/MyNameSpace/MyModule/etc/config.xml
<?xml version="1.0" ?>
<config>
<modules>
<MyNameSpace_MyModule>
<version>0.1.0</version>
</MyNameSpace_MyModule>
</modules>
<frontend>
<routers>
<checkout>
<args>
<modules>
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule>
</modules>
</args>
</checkout>
</routers>
</frontend>
Создайте свой контроллер: /app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
<?php
require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php';
class MyNameSpace_MyModule_Checkout_CartController extends Mage_Checkout_CartController
{
public function indexAction() {
// /var/log/debug.log should log the output
Mage::log('cart index override', null, 'debug.log');
// Call the parent class
parent::indexAction();
}
}
Включите ваш новый модуль: /app/etc/modules/MyNameSpace_All.xml
<?xml version="1.0" ?>
<config>
<modules>
<MyNameSpace_MyModule>
<active>true</active>
<codePool>local</codePool>
</MyNameSpace_MyModule>
</modules>
</config>
Это все, что нужно. А теперь иди праздновать, ты только что отполировал какашку!;)
Это небольшое уведомление о пути включения контроллера.
Этот путь включения может вызвать ошибки, если включен режим компилятора Magento.
require_once 'Mage/Checkout/controllers/CartController.php';
Вместо этого хорошо использовать
require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php';
Это будет безопаснее.
Ну... это НЕ БУДЕТ переопределять контроллер корзины покупок.
Поэтому я использовал перезапись URL-адреса в представлении ПРОДУКТА... по этой ссылке... в нижней части статьи. Они говорят, что это правильный метод...
http://www.excellencemagentoblog.com/magento-add-product-to-cart-ajax
if(!url){
url = jQuery('#product_addtocart_form').attr('action');
}
url = url.replace("checkout/cart","idgeneral/cart");
Это сработало для меня. Позволяет мне взломать. В основном вызывает МОЙ контроллер.. вместо контроллера проверки.
Спасибо за помощь ROSCIUS... ценится.
Мне также пришлось изменить мой конфиг.... мой раздел маршрутизаторов теперь выглядит так:
<routers>
<!-- THIS PART REGISTERS OUR CONTROLLERS FOLDER FOR USE -->
<idgeneral>
<use>standard</use>
<args>
<module>Idigital_Idgeneral</module>
<frontName>idgeneral</frontName>
</args>
</idgeneral>
<!-- THIS PART WONT WORK TO OVERWRITE OUR MAGE CONTROLLER -->
<checkout>
<use>standard</use>
<args>
<modules>
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
</modules>
</args>
</checkout>
</routers>