Переписать контроллер magento

12

Мне нужно перезаписать действие с именем _initAction из контроллера:

/app/code/core/Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php

в мой собственный модуль и контроллер:

/app/code/local/Qbikz/ToolTip/controllers/Adminhtml/Catalog/Product/AttributeController.php

Я уже пробовал разные способы решить ее: Первый метод , где <from>и <to>я пробовал разные комбинации (отображены 404 страница не найдена):

 <rewrite>
     <qbikz_tooltip_adminhtml_catalog_product_attribute>
         <from><![CDATA[#^/adminpanel/catalog_product_attribute/edit/#]]></from>
         <to>/tooltip/adminhtml_catalog_product_attribute/init/</to>
     </qbikz_tooltip_adminhtml_catalog_product_attribute>
</rewrite>

+

 <frontend>
        <routers>
            <qbikz_tooltip>
                <use>admin</use>
                <args>
                    <module>Qbikz_ToolTip</module>
                    <frontName>catalog_product_attribute</frontName>
                </args>
            </qbikz_tooltip>
        </routers>
    </frontend>

Второй способ (показ страницы с игнорированием моих правил):

<admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <Qbikz before="Mage_Adminhtml_Catalog_Product">Qbikz_ToolTip_Adminhtml_Catalog_Product</Qbikz>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>

В моем контроллере я положил die («ОК»); Но это не появляется. Может кто-нибудь может помочь? Благодарю.

стопор
источник
Вы помните, чтобы очистить кэш? Конкретно кеш конфига?
Benubird
"Rewtire контроллер"? Что это?
Баттл Буткус
Да, мой кеш, если выключен.
Пробка
Перезаписать в порядке? извините за мой английский =)
Пробка
Ребята, пожалуйста, ответьте на мою тему
Anup Chaudhary

Ответы:

15

Используйте второй метод, но немного измененный. Ваш XML должен выглядеть так:

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <Qbikz_ToolTip before="Mage_Adminhtml">Qbikz_ToolTip_Adminhtml</Qbikz_ToolTip>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

Теперь создайте файл Qbikz/ToolTip/controllers/Adminhtml/Catalog/Product/AttributeController.phpс таким содержанием:

<?php 
require_once 'Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php';
class Qbikz_ToolTip_Adminhtml_Catalog_Product_AttributeController extends Mage_Adminhtml_Catalog_Product_AttributeController {
   protected function _initAction(){
       //your magic here
   }
}
Мариус
источник
@Marus, что лучше запрашивать файл, ваш путь или require_once (Mage :: getModuleDir ('controllers', 'Mage_Adminhtml'). DS.'Catalog'.DS.'Product'.DS.'AttributeController.php '); Кроме того, я хочу знать, можем ли мы переписать блок и контроллер в одном модуле или мы должны написать отдельные модули для записи блока, а не контроллера.
Аднан
Оба способа имеют одинаковый результат. Но если вы хотите быть на 100% политкорректным, используйте метод, который вы упомянули. Также вы можете использовать тот же модуль для перезаписи блоков и контроллеров.
Мариус
Это, кажется, не работает при попытке переопределить indexAction () Mage_Checkout :: CartController.php.
Макс
В 1.9.4.2 для меня это ошибка. Контроллер выбрасывает 404. Возможно, есть другой способ сделать это сейчас? Это происходит со мной при переопределении
кассового
0

В моем расширении onetepcheckout, файл конфигурации: app / code / local / Gurutheme / Onestepcheckout / etc / config.xml

<frontend>
        <routers>
             <checkout>
                <args>
                    <modules>
                        <Gurutheme_Onestepcheckout before="Mage_Checkout">Gurutheme_Onestepcheckout</Gurutheme_Onestepcheckout>
                    </modules>
                </args>
            </checkout>
        </routers>
</frontend>

Я добавил контроллер

app/code/local/Gurutheme/Onestepcheckout/controllers/OnepageController.php

для переопределения основного контроллера Onepage

app/code/core/Mage/Checkout/controllers/OnepageController.php

Это основной исходный код этого переопределяющего контроллера:

require_once("Mage/Checkout/controllers/OnepageController.php");

class Gurutheme_Onestepcheckout_OnepageController extends Mage_Checkout_OnepageController {

}

Главное, что при переписывании контроллеров magento мы должны включать в себя оригинальный и расширять его, это помогает всему нативному поведению до того, как будут работать все готовые функции.

phanvugiap
источник
Только если вы используете дополнительные (защищенные) методы исходного класса в ваших переопределенных действиях. Все действия, отсутствующие в вашем контроллере, будут обрабатываться оригинальным контроллером. Обратите внимание, что технически вы не переписываете контроллер, а добавляете его в список обработчиков для имени пользователя
Fabian Schmengler
Полностью согласен, мы фактически перенаправили его, но должны расширить исходный для наследования любого существующего кода
phanvugiap
-1

Я переписал контроллер списка пожеланий предприятия.

В моем config.xml

<frontend>
    <routers>
        <wishlist>
            <args>
                <modules>
                    <namespace_modulename before="Enterprise_Wishlist">Namespace_Modulename</namespace_modulename>
                </modules>
                <module>Namespace_Modulename</module>
                <frontName>shoppinglist</frontName>
            </args>
        </wishlist>
    </routers>
</frontend>

И в моей IndexControllerдобавленной ниже строке:

require_once 'Enterprise/Wishlist/controllers/IndexController.php';

//before

class Namespace_Modulename_IndexController extends Enterprise_Wishlist_IndexController{}

Вы также можете переписать помощника следующим образом: /magento//a/91474/33509

вритика нигам
источник