Reescrever o controlador magento

12

Eu preciso substituir a ação chamada _initAction do Controller:

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

no meu próprio módulo e controlador:

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

Eu já tentei maneiras diferentes de resolvê-lo: Primeiro método em que <from>e <to>tentei combinações diferentes (Mostrando página 404 não encontrada):

 <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>

Segundo método (Página exibida com ignorar minhas regras):

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

No meu controlador eu coloquei die ("ok"); Mas não está aparecendo. Talvez alguém possa ajudar? Obrigado.

Rolha
fonte
Você se lembrou de limpar os caches? Particularmente o cache de configuração?
Benubird
"Controlador de Rewtire"? O que é isso?
Buttle Butkus
Sim, meu cache se desativado.
quer
Substituir está ok? desculpe pelo meu inglês =)
Stopper
Pessoal, por favor, responda meu tópico
Anup Chaudhary

Respostas:

15

Use o segundo método, mas um pouco modificado. Seu XML deve ficar assim:

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

Agora crie o arquivo Qbikz/ToolTip/controllers/Adminhtml/Catalog/Product/AttributeController.phpcom este conteúdo:

<?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
   }
}
Marius
fonte
@Marius, o que é melhor exigir um arquivo, do seu jeito ou require_once (Mage :: getModuleDir ('controllers', 'Mage_Adminhtml'). DS.'Catalog'.DS.'Product'.DS.'AttributeController.php '); Além disso, quero saber se podemos reescrever o bloco e o controlador em um único módulo ou precisamos escrever módulos separados para gravar o bloco e o controlador.
Adnan
Ambas as formas têm o mesmo resultado. Mas se você quiser ser 100% politicamente correto, use o método que você mencionou. Além disso, você pode usar o mesmo módulo para reescrever blocos e controladores.
Marius
Isso parece não funcionar ao tentar substituir indexAction () de Mage_Checkout :: CartController.php.
Max
No 1.9.4.2, isso está gerando um erro para mim. O controlador lança um 404. Talvez haja uma maneira diferente de fazer isso agora? Ele está me acontecendo ao substituir um controlador de check-out
gabtzi
0

Na minha extensão onestepcheckout, arquivo de configuração: 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>

Eu adicionei um controlador

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

para substituir o controlador de núcleo Onepage

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

Este é o código fonte básico desse controlador substituto:

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

class Gurutheme_Onestepcheckout_OnepageController extends Mage_Checkout_OnepageController {

}

A principal coisa que ao reescrever os controladores magento, devemos incluir o original e estendê-lo, ajuda todo o comportamento nativo antes, para que todos os recursos pré-criados funcionem.

phanvugiap
fonte
Somente se você confiar em métodos adicionais (protegidos) da classe original em suas ações substituídas. Todas as ações ausentes no seu controlador serão tratadas pelo controlador original. Observe que tecnicamente você não reescreve o controlador, mas o adiciona à lista de manipuladores para obter um nome de frente
Fabian Schmengler
Totalmente de acordo, nós realmente re-route-lo, mas deve estender o original para herdar qualquer código existente
phanvugiap
-1

Reescrevi o controlador da lista de desejos da empresa.

No meu 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>

E na minha IndexControllerlinha Adicionar abaixo:

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

//before

class Namespace_Modulename_IndexController extends Enterprise_Wishlist_IndexController{}

Você também pode reescrever o auxiliar assim: /magento//a/91474/33509

vritika nigam
fonte