:::: MENU ::::

Sobreescribir bloque desde dos extensiones

3.67 avg. rating (71% score) - 3 votes

Un caso habitual en tiendas Magento muy personalizadas, es que existan conflictos entre las diferentes extensiones instaladas.

Conflicto entre extensiones Magento

En la mayoría de los casos, los conflictos vienen dados por extensiones que intentan reescribir el mismo Modelo o Bloque del Core de Magento que otra extensión.

En un caso reciente, he necesitado añadir funcionalidad a un bloque que una extensión instalada ya reescribía. Se trataba del bloque:

Mage_Catalog_Block_Product_View

Cuando sucede esto, la extensión que se carga en último lugar es la que sobre escribe el bloque original, y la otra extensión pierde su funcionalidad, lo que a menudo resulta en errores y fallos en la página.

En mi caso, para sobreescribir el bloque Core de Magento, en el XML de configuración de mi extensión, tenía incluido:

<global>
  <blocks>
    <catalog>
      <rewrite>
        <product_view>NV_MiExtension_Block_Catalog_Product_View</product_view>
      </rewrite>
    </catalog>
  </blocks>
</global>

En la definición de mi bloque, la herencia se realizaba de la siguiente forma:

class NV_MiExtension_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {
}

El problema es que al cargarse mi extensión en último lugar, la extensión que ya estaba instalada y que realizaba la misma sobreescritura, quedaba sin efecto.

Sobreescribiendo el mismo bloque desde dos extensiones Magento

Para solucionar el problema es necesario hacer algunos cambios, de forma que Magento ‘encadene’ correctamente la herencia de los bloques.

En el fichero de configuración de mi extensión, hay que declarar una dependencia con la extensión ya instalada de otra empresa.

[xml highlight=»6″]
<config>
<modules>
<NV_Sinergia>
<active>true</active>
<codePool>local</codePool>
<depends>
<OtraEmpresa_OtraExtension />
</depends>
</NV_Sinergia>
</modules>
</config>

Una vez declarado la dependencia, nos aseguramos que nuestra extensión se carga en último lugar y que la reescritura encadenada funcionará correctamente.

El rewrite, en el fichero de config.xml de nuestra extensión, lo mantenemos igual, es decir, sobreescribiendo directamente el bloque core de Magento

[xml highlight=»4″]
<global>
<blocks>
<catalog>
<rewrite>
<product_view>NV_MiExtension_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
</blocks>
</global>

Finalmente, en la definición de nuestra clase, heredamos del bloque definido por la otra extensión:

class NV_MiExtension_Block_Catalog_Product_View extends OtraEmpresa_OtraExtension_Block_Catalog_Product_View {
}

Con eso, el bloque Mage_Catalog_Block_Product_View tendrá toda la funcionalidad definida por esa otra extensión, y además podremos añadir nuestro propio código, modificando o ampliando el bloque.




Hey! Qué opinas sobre el artículo?