php - extensions - magento system requirements
Magento-mĂșltiples clases extendiendo la misma clase principal (1)
Estoy seguro de que todos nos encontramos en una situación en la que tienes múltiples extensiones con un bloque o modelo que reescribe el mismo bloque / modelo central. El problema que encontré es el siguiente: ¿cómo controla el orden en que Magento ve estas clases?
Por ejemplo, digamos que tenemos 2 extensiones con las siguientes 2 clases:
Clase A
config.xml
<catalog>
<rewrite>
<product_view>My_ClassA_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
My / ClassA / Block / Catalog / Product / View.php
class My_ClassA_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Clase B
<catalog>
<rewrite>
<product_view>My_ClassB_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
Mi / ClassB / Block / Catalog / Product / View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
-
La solución recomendada es cambiar uno de ellos para que extiendan el otro y los encadenen (la class A extends B {}
, la class B extends C {}
, etc.):
My / ClassA / Block / Catalog / Product / View.php
class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}
Mi / ClassB / Block / Catalog / Product / View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
-
El problema con el que me he encontrado es que Magento no necesariamente lo ve de esa manera. No sé si es alfabético o algo aleatorio, pero a veces esto funciona y otras no. En algunos casos, Magento le da prioridad a ClassB y todas las llamadas a createBlock(''catalog/product_view'')
crean una instancia de ClassB , omitiendo completamente cualquier código en ClassA .
Así que mi pregunta es la siguiente: ¿cómo controlo qué clase se createBlock(''catalog/product_view'')
instancia de createBlock(''catalog/product_view'')
cuando dos extensiones diferentes reescriben la clase principal catalog_product_view?
Cuando Magento recupera la clase para usar para un bloque en particular, busca dentro de un árbol config.xml
fusionado para un solo nodo en
catalog/rewrite/product_view
El problema con las reescrituras múltiples es que solo puede haber un nodo debido a la forma en que Magento carga el XML de un módulo, lo combina con el árbol de configuración y luego carga otro modelo. Esto significa que solo puede tener un alias de clase resuelto a un nombre de clase.
Ahí es donde están los archivos.
app/etc/modules/*.xml
ven a jugar. Estos archivos le dicen a Magento qué módulos usar. También tienen soporte para una etiqueta <depends>
. Esta etiqueta le permite decir que ciertos módulos dependen de otro módulo, lo que significa que su config.xml
se cargará después del config.xml
otro módulo. De esta manera, puede controlar en qué orden se cargan los módulos y, por lo tanto, controlar qué nodo de reescritura fusionado "gana", lo que a su vez le permitirá saber qué clase debe ser la última en su cadena de herencia.