Estamos usando uma extensão que substitui globalmente o bloco Mage_Catalog_Block_Product_List_Toolbar.
<global>
<blocks>
<catalog>
<rewrite>
<product_list_toolbar>Amasty_Shopby_Block_Catalog_Product_List_Toolbar</product_list_toolbar>
</rewrite>
</catalog>
</blocks>
</global>
Embora a extensão funcione no contexto de uma categoria de navegação em camadas, a classe reescrita não funciona corretamente quando inserimos uma lista arbitrária de produtos em outra exibição (personalizada) em nosso próprio módulo interno. Se removermos a substituição da extensão apenas para fins de teste, tudo funcionará bem.
Como podemos desfazer a reescrita de uma extensão apenas para nosso próprio controlador, sem editar o código da comunidade do desenvolvedor da extensão?
magento-1
extensions
overrides
Aaron Pollock
fonte
fonte
<rewrite>
por classe, portanto, embora eu possa criar minha própria classe estendendo a classe principal, não tenho certeza de como faria isso funcionar através dogetBlock('catalog/product_list_toolbar')
método de fábrica.Respostas:
Advertências: Não existe uma maneira projetada de fazer o que você está pedindo no sistema. O seguinte deve funcionar, mas eu nunca o testei extensivamente em um sistema de produção e pode haver situações em que isso causará mais problemas do que vale a pena. Prossiga apenas se estiver confortável em depurar problemas relacionados à alteração das regravações de um sistema em funcionamento.
A etapa 1 está desfazendo a reescrita. A árvore de configuração do Magento pode ser alterada em tempo de execução. Então, se você executar o seguinte código
Então o Magento instancia o
Mage_Catalog_Block_Product_List_Toolbar
bloco original pelo restante da solicitação.A etapa 2 é decidir onde chamar isso em seu módulo. Como isso é apenas para o seu controlador e está reescrevendo um bloco que não será instanciado até o final do seu controlador, eu adicionaria um método à sua classe de controlador, algo como isto
e depois chame esse método no início de cada uma de suas ações
Isso pode parecer um pouco desajeitado, mas acho uma boa idéia ser desajeitado (ou seja, óbvio) quando você está sendo inteligente com os objetos de sistema do Magento. Outro lugar para isso pode ser os eventos
controller_action_predispatch
oucontroller_action_predispatch_front_controller_action
e / ou aplicados condicionalmente.Lembre-se de que a reescrita não será desfeita até que esse método seja chamado. Isso significa que, se você tentar instanciar um bloco antes de chamar
_undoRewrites
, a classe reescrita será usada para instanciar o objeto.fonte
Solução 1:
você pode tentar instanciar a classe diretamente (maneira php) no seu controlador
ao invés de
algo como:
Solução 2:
Outra abordagem seria criar uma nova classe, no seu módulo, que estenda a classe original e use essa.
Solução 3:
Caso contrário, se a extensão não estiver criptografada (todos gostamos de código aberto :), você pode tentar descobrir por que ela quebra as suas coisas
fonte
rewrite
na mesma classe base. Portanto, o método de fábrica não funcionará (você já percebeu isso, eu acho). Talvez não exista uma maneira do Magento de fazer isso, mas vamos aguardar um pouco para ver se há uma maneira melhor.$this->getLayout()->createBlock("Mage_Catalog_Block_Product_List_Toolbar")
quando você está em um contexto de classe de bloco). Se não houver nenhum/
parâmetro, o Magento usará a string como está para procurar a classe.Se existirem várias reescritas para o mesmo alias de classe, a última que o carregador de configuração do Magento analisa do config.xml "ganha". Eu atacaria esse problema:
catalog/product_list_toolbar
na sua extensãoMage_Catalog_Block_Product_List_Toolbar
Estenda seu bloco em vez da classe Amasty.fonte
Semelhante ao que Francesco sugeriu acima, mas acredito que você pode realmente passar o nome completo da classe para getModel. Dessa forma, você ainda está fazendo a mesma coisa, mas usando métodos principais para fazê-lo. Não tenho muita certeza dos prós / contras desse método, mas pensei em lançar isso como uma idéia.
Em uma nota lateral, acredito que esta será a maneira padrão de carregar classes no Magento2.
fonte
Você precisa fazer uma pequena alteração no código de extensão, receio. Não reescreva a classe por conta própria
config.xml
, apenas mudeAmasty_Shopby_Block_Catalog_Product_List_Toolbar
para estender sua classe que, por sua vez, se estendeMage_Catalog_Block_Product_List_Toolbar
.fonte