Nota : Esta é uma pergunta canônica que explica completamente como as regravações do controlador funcionam e pode ser usada como destino duplicado para perguntas mais específicas sobre "Como substituo o controlador X" ou "Por que minha reescrita não funciona".
Veja também: Procurando perguntas canônicas sobre substituições do Magento 1
Digamos que eu tenha que fazer alterações em uma classe de controlador principal em um módulo personalizado (alterar métodos ou adicionar métodos). Como faço isso passo a passo?
module
magento-1
overrides
controllers
Raphael na Digital Pianism
fonte
fonte
Respostas:
Existem várias abordagens, mas vou começar como isso não é feito para esclarecer alguns equívocos comuns:
app/code/local
. Isso ocorre porque as classes do controlador não são carregadasVarien_Autoload
, mas os arquivos são incluídos explicitamente.<rewrite><controller><to>
sintaxe. Esta é uma técnica antiga e obsoleta desde o Magento 1.3 (consulte: Substituindo Controlador vs Substituindo Solicitação do Controlador de Ação )Adicionar / substituir ações do controlador
Para adicionar ações do controlador a um controlador existente, use o seguinte em seu config.xml:
Em seguida, crie um controlador em seu módulo, como
Você não precisa estender a classe do controlador original porque o Magento procurará nas duas classes, na ordem definida por
before="..."
Se você precisar estender a classe original porque deseja reutilizar outros métodos, precisará incluí-la (lembre-se, os controladores não são carregados automaticamente):
Use observadores para modificar as ações do controlador
Se você não adicionar novas ações, uma alternativa é usar observadores para modificar o comportamento das ações existentes. Toda ação do controlador aciona um evento dinâmico "predispatch" no formulário
controller_action_predispatch_$FRONTNAME_$CONTROLLER_$ACTION
, por exemplocontroller_action_predispatch_checkout_onepage_index
No observador, você tem acesso à própria classe do controlador usando
Se você não deseja que o método original seja acionado, diga ao Magento para não despachar ainda mais a ação:
Para garantir a integridade: Você também pode impedir eventos "pós-distribuição" de maneira semelhante, mas isso geralmente não é necessário (aqui está um exemplo em que é útil: XML possui conteúdo extra ):
Por falar nisso, você também pode adicionar um observador,
controller_action_postdispatch_$FRONTNAME_$CONTROLLER_$ACTION
se desejar executar ações ou modificações adicionais da resposta após a ação original ter sido executada.fonte
Reescrever:
1) Exemplo de reescrita: na reescrita, você precisa criar sua própria classe e precisa estender a classe principal e pode reescrever as funções principais do magento ou sua própria função e lógica.
No seu arquivo config.xml
No seu arquivo de controlador
No Adminhtml
em yourconfig.xml deve ser
e sua classe de controlador deve ser
Obrigado pela equipe Inchoo.
http://inchoo.net/magento/overriding-magento-blocks-models-helpers-and-controllers/
fonte