Estamos utilizando una extensión que sobrescribe globalmente el bloque 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>
Si bien la extensión funciona en el contexto de una categoría de navegación en capas, la clase reescrita no funciona correctamente cuando insertamos una lista de productos arbitraria en otra vista (personalizada) en nuestro propio módulo interno. Si eliminamos la sobrescritura de la extensión solo con fines de prueba, todo funciona bien.
¿Cómo podemos deshacer la reescritura de una extensión solo para nuestro propio controlador, sin editar el código de comunidad del desarrollador de la extensión?
magento-1
extensions
overrides
Aaron Pollock
fuente
fuente
<rewrite>
por clase, por lo que aunque podría crear mi propia clase extendiendo la clase principal, no estoy seguro de cómo hacerlo funcionar a través delgetBlock('catalog/product_list_toolbar')
método de fábrica.Respuestas:
Advertencias: No hay una forma diseñada para hacer lo que está pidiendo en el sistema. Lo siguiente debería funcionar, pero nunca lo he probado exhaustivamente en un sistema de producción, y puede haber situaciones en las que cause más problemas de lo que vale. Solo proceda si se siente cómodo depurando problemas relacionados con el cambio de reescrituras de un sistema de trabajo.
El paso 1 es deshacer la reescritura. El árbol de configuración de Magento se puede cambiar en tiempo de ejecución. Entonces, si ejecuta el siguiente código
Entonces Magento creará una instancia del
Mage_Catalog_Block_Product_List_Toolbar
bloque original para el resto de la solicitud.El paso 2 es decidir dónde llamar a esto en su módulo. Dado que esto es solo para su controlador y está reescribiendo un bloque que no se instanciará hasta el final de su controlador, agregaría un método a su clase de controlador algo como esto
y luego simplemente llame a este método al comienzo de cada una de sus acciones
Esto puede parecer un poco torpe, pero creo que es una buena idea ser torpe (es decir, obvio) cuando se es inteligente con los objetos del sistema de Magento. Otro lugar para esto podría ser los eventos
controller_action_predispatch
ocontroller_action_predispatch_front_controller_action
y / o aplicados condicionalmente.Solo recuerde que la reescritura no se deshará hasta que se llame a este método. Eso significa que si intenta crear una instancia de un bloque antes de llamar
_undoRewrites
, la clase reescrita se usará para crear una instancia del objeto.fuente
Solución 1:
puede intentar crear una instancia de la clase directamente (forma php) en su controlador
en lugar de
algo como:
Solución 2:
Otro enfoque sería crear una nueva clase, en su módulo, que extienda la clase original y use esa.
Solución 3: de lo
contrario, si la extensión no está encriptada (a todos nos encanta el código abierto :), puede intentar averiguar por qué rompe sus cosas
fuente
rewrite
en la misma clase base. Por lo tanto, el método de fábrica no funcionará (ya te has dado cuenta de esto). Tal vez no haya una forma de Magento de hacer esto, pero esperemos un poco para ver si hay una mejor manera.$this->getLayout()->createBlock("Mage_Catalog_Block_Product_List_Toolbar")
cuando está en un contexto de clase de bloque). Si no hay ningún/
parámetro en el parámetro, Magento solo usará la cadena como está para buscar la clase.Si existen varias reescrituras para el mismo alias de clase, entonces la última que el cargador de configuración de Magento analiza desde config.xml "gana". Atacaría este problema al:
catalog/product_list_toolbar
en tu extensiónMage_Catalog_Block_Product_List_Toolbar
lugar de la clase Amasty.fuente
Similar a lo que sugirió Francesco anteriormente, pero creo que en realidad puedes pasar el nombre completo de la clase a getModel. De esta manera, de alguna manera sigues haciendo lo mismo, pero usando métodos básicos para hacerlo. No estoy completamente seguro de los pros / contras de este método, pero pensé que lo lanzaría como una idea.
En una nota al margen, creo que esta será la forma estándar de cargar clases en Magento2.
fuente
Necesito hacer un ligero cambio en el código de extensión, me temo. No reescriba la clase en la suya
config.xml
, solo cámbielaAmasty_Shopby_Block_Catalog_Product_List_Toolbar
para extender su clase que a su vez se extiendeMage_Catalog_Block_Product_List_Toolbar
.fuente