Контроллер переопределения 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 ответов

  1. Создайте свой модуль папки и файлы

    app/code/local/MyNameSpace/MyModule/etc/config.xml
    app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
    app/etc/modules/MyNameSpace_All.xml
    
  2. Отредактируйте /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>
  1. редактировать '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();
        }
         }
    
    1. редактировать 'app/etc/modules/MyNameSpace_All.xml'(Это для активации вашего модуля)

      правда местный

  2. редактировать '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

    Добавьте следующие строки:


    1. Укажите ваш браузер на /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>
Другие вопросы по тегам