Cómo hacer override o sobrescribir los blocks, models, helpers y controllers de Magento

Como modificar la funcionalidad del core de Magento correctamente

Profile picture for user admin
Por Way2 Ecommerce
13 Mar 2017

En esta ocasión, vamos a mostrarte la mejor forma de modificar la funcionalidad del núcleo de Magento sin caer en malas prácticas ni comprometer el buen funcionamiento actual y futuro de tu tienda online.

Magento es la herramienta más potente y versátil que existe en la actualidad para crear tiendas online, pero, como instrumento de uso general para todo tipo de tiendas, lo más probable es que necesites adaptarlo a las particularidades de la tienda concreta en la que estás trabajando y que tengas que modificar el funcionamiento del core o núcleo de tu framework.

<!--more-->

Para los más inexpertos en el uso de Magento, lo más tentador y práctico podría ser entrar en la carpeta app/code/core y realizar los cambios directamente sobre los archivos que necesiten ser modificados, pero ello podría conllevar problemas de compatibilidad con otros módulos, la pérdida de las modificaciones realizadas al actualizar nuestro framework a una versión más reciente, conflictos a la hora de aplicar parches, etc. Así que, antes de caer en la tentación de modificar directamente el core de tu Magento, repítete esto todas las veces que sea necesario:

<img class="aligncenter size-full wp-image-2996" src="https://way2ecommerce.com/assets/modificar_magento_core.gif" alt="" width="657" height="352" />

Una forma de sobrescribir blocks, models y helpers (no así los controladores) es la de copiar el archivo a una ruta análoga a la del core, pero dentro de la carpeta local. Es decir, si queremos modificar, por ejemplo, el archivo:

app/code/core/Mage/Catalog/Model/Product.php

Lo que tendríamos que hacer es copiar el archivo a la carpeta local, creando, si fuera necesario, las subcarpetas correspondientes:

app/code/local/Mage/Catalog/Model/Product.php

Ahora podríamos realizar las modificaciones pertinentes sobre el archivo recién copiado manteniendo el core libre de cambios y en su estado original. Ello es posible porque Magento busca primero los archivos en la carpeta local; si lo encuentra, lo ejecuta, si no busca en la carpeta community y, si tampoco lo encuentra, realiza una última búsqueda en la carpeta core.

Esta opción, aunque mejor que la anterior, obliga a copiar el archivo completo, aunque solo queramos modificar una línea en una función concreta y, por ello tampoco es una solución óptima. Ya no existe la posibilidad de perder los cambios realizados al proceder a la actualización de Magento, pero ahora entra en juego la probabilidad de que una actualización en una función que no hemos modificado, aunque aplicada en el archivo del core, en la práctica no se realice, puesto que Magento utilizará el archivo de la carpeta local con la función desactualizada, a no ser que en cada actualización recuerdes comprobar y trasladar, en su caso, las modificaciones a la carpeta local de tu Magento. Este, y otros motivos como la mayor dificultad a la hora de identificar los cambios realizados, no hacen de esta la mejor opción a la hora de sobrescribir el núcleo de nuestro Magento ecommerce.

Por todo lo expuesto anteriormente, la mejor opción a la hora de personalizar y modificar el core o núcleo de Magento es la creación de un módulo con solo aquellos cambios que queremos realizar y localizando nuestro código en un lugar fácilmente reconocible.

Let’s get busy!!!

Primero, vamos a crear un módulo donde incluir las personalizaciones de nuestra tienda. Para ello, vamos a crear la carpeta <em>Way2ecommerce</em> dentro de app/code/local. Una vez hecho esto, creamos la carpeta <em>Personalizaciones</em>, dentro de <em>Way2ecommerce</em>. Bien, ya tenemos nuestro namespace <em>Way2ecommerce</em> y el nombre de nuestro módulo <em>Personalizaciones</em>.

Para que Magento reconozca nuestro módulo, tenemos que crear un archivo dentro de app/etc/modules con el siguiente nombre: Way2ecommerce_Personalizaciones.xml e incluir el siguiente código:

/app/etc/modules/

 

<?xml version="1.0"?>
<config>
    <modules>
        <Way2ecommerce_Personalizaciones>
            <active>true</active>
            <codePool>local</codePool>
        </Way2ecommerce_Personalizaciones>
    </modules>
</config>


 

Ahora vamos a crear el archivo de configuración de nuestro módulo. Para ello, generamos la carpeta <em>etc</em>, dentro de app/code/local/Way2ecommerce/Personalizaciones, en la cual introducimos el archivo config.xml con el siguiente código:

app/code/local/Way2ecommerce/Personalizaciones/etc/config.xml

 

[code language="xml"]
<config>
    <modules>
        <Way2ecommerce_Personalizaciones>
            <version>0.1.0</version>
        </Way2ecommerce_Personalizaciones>
    </modules>
    <global>
    </global>
</config>
[/code]

Ya tenemos un módulo creado y configurado, pero que todavía no hace absolutamente nada, así que vamos a añadirle las personalizaciones del core de Magento:
<h2>Override o sobrescribir blocks de Magento:</h2>
Imaginemos que queremos realizar alguna modificación sobre el <em>footer</em> para que cachee de forma diferente la <em>homepage</em> del resto de páginas, ya que queremos mostrar un pie de página distinto en la página de bienvenida de nuestra tienda. Para ello, tenemos que crear la clase Footer.php dentro de app/code/local/Way2ecommerce/Personalizaciones/Block/Page/Html, con el siguiente código:

[code language="php"]
class Way2ecommerce_Personalizaciones_Block_Page_Html_Footer extends Mage_Page_Block_Html_Footer {

    public function getCacheKeyInfo()
    {
        //Código para cambiar la caché key según la página en la que nos encontremos
    }

}
[/code]

Ahora solo nos queda indicar, en la configuración del módulo, que queremos sobrescribir o hacer override del bloque correspondiente con el siguiente código entre las etiquetas global:

app/code/local/Way2ecommerce/Personalizaciones/etc/config.xml

[code language="xml"]
<blocks>
    <page>
        <rewrite>
            <html_footer>Way2ecommerce_Personalizaciones_Block_Page_Html_Footer</html_footer>
        </rewrite>
    </page>
</blocks>
[/code]

Ya tenemos nuestro bloque sobrescrito, sin afectar al resto de funciones de la clase Footer.php, solo realizando cambios sobre la función getCacheKeyInfo.

Los models y los helpers de Magento se sobrescriben de manera similar.
<h2>Override o sobrescribir helpers de Magento:</h2>
Supongamos que queremos sobrescribir el helper de catalogsearch:

app/code/core/Mage/CatalogSearch/Helper/Data.php

Creamos el archivo Helper/CatalogSearch/Data.php dentro de nuestro módulo con el siguiente código:

[code language="php"]
class Way2ecommerce_Personalizaciones_Helper_CatalogSearch_Data extends Mage_CatalogSearch_Helper_Data {

    //Código a incluir

}
[/code]

Y modificamos el archivo config.xml del módulo para incluir el cambio dentro de las etiquetas global, como en el caso anterior:

app/code/local/Way2ecommerce/Personalizaciones/etc/config.xml

[code language="xml"]
<helpers>
    <catalogsearch>
        <rewrite>
            <data>Way2ecommerce_Personalizaciones_Helper_CatalogSearch_Data</data>
        </rewrite>
    </catalogsearch>
</helpers>
[/code]

<h2>Override o sobrescribir models de Magento:</h2>
Ahora vamos a realizar cambios sobre un model del core de Magento, concretamente sobre:

app/code/core/Mage/Catalog/Model/Product.php

Creamos el archivo Model/Catalog/Product.php en nuestro módulo Personalizaciones con el siguiente código:

[code language="php"]
class Way2ecommerce_Personalizaciones_Model_Catalog_Product extends Mage_Catalog_Model_Product {

    //Código a incluir
    
}
[/code]

Y lo incluimos en config.xml, entre las etiquetas global:

app/code/local/Way2ecommerce/Personalizaciones/etc/config.xml

[code language="xml"]
<models>
    <catalog>
        <rewrite>
            <product>Way2ecommerce_Personalizaciones_Model_Catalog_Product</product>
        </rewrite>
    </catalog>
</models>
[/code]

<h2>Override o sobrescribir controladores de Magento:</h2>
La sobrescritura u override de los controladores de Magento se realiza de una manera diferente a la de los blocks, models y helpers. En este caso, la inclusión del override del controller no se hace dentro de las etiquetas <em>global</em>, sino de <em>config</em> puesto que debemos indicar si es un archivo de <em>frontend</em> o de la <em>admin</em>, la ruta que se sobrescribe y los argumentos de la misma.

Como sabemos que un ejemplo vale más que mil palabras, vamos a sobrescribir el siguiente controlador:

app/code/core/Mage/Customer/controllers/AddressController.php

Debemos incluir el fragmento de abajo entre las etiquetas <em>config</em> del archivo de configuración del módulo:

app/code/local/Way2ecommerce/Personalizaciones/etc/config.xml

[code language="xml"]
<frontend>
    <routers>
        <customer>
            <args>
                <modules>
                    <way2ecommerce_personalizaciones before="Mage_Customer">Way2ecommerce_Personalizaciones
                    </way2ecommerce_personalizaciones>
                </modules>
            </args>
        </customer>
    </routers>
</frontend>
[/code]

Como se trata de una modificación en el front de Magento, se pone la etiqueta <em>frontend</em>, en caso de que la modificación se realizara en un controlador de la administración la etiqueta sería <em>admin</em>. A continuación se incluye la ruta y, dentro de esta, el nombre del módulo donde se encuentra el controlador que vamos a sobrescribir; en este caso, como el controlador se encuentra dentro de Mage_Customer, la etiqueta será customer. En caso de la admin, la ruta es adminhtml. Finalmente, entre las etiquetas <em>args</em> y<em> modules</em> se incluye una etiqueta con namespace_modulo , en minúsculas, en nuestro caso, way2ecommerce_personalizaciones, añadiendo before=”Namespace_Module”, en esta ocasión before=”Mage_Customer y, de nuevo, el namespace y el nombre del módulo.

Este sería un ejemplo del código a incluir en config.xml en caso de sobrescribir un controlador de la administración, en este caso, decidimos que el controlador se encuentre dentro de la carpeta Adminhtml de nuestro módulo, por lo tanto, el controlador se debería crean en Way2ecommerce/Personalizaciones/controllers/Adminhtml:

app/code/local/Way2ecommerce/Personalizaciones/etc/config.xml

[code language="xml"]
<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <way2ecommerce_personalizaciones before="Mage_Adminhtml">
                        Way2ecommerce_Personalizaciones_Adminhtml
                    </way2ecommerce_personalizaciones>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>
[/code]

Ahora vamos a crear el controlador dentro de la carpeta controllers (en minúscula). Como puedes observar, no se informa del nombre del controlador en el config.xml, sino de la ruta en la que debe buscar los controladores, por lo que el archivo debe tener el mismo nombre que el que queremos sobrescribir, es decir, en nuestro caso AddressController.php y el siguiente código:

[code language="php"]
require_once 'Mage/Customer/controllers/AddressController.php';


class Way2ecommerce_Personalizaciones_AddressController extends Mage_Customer_AddressController {

    //Código a incluir        
}
[/code]

Ten en cuenta que hay que incluir a mano el controlador, puesto que Magento no lo carga automáticamente:

[code language="php"]
require_once 'Mage/Customer/controllers/AddressController.php';
[/code]

Ahora ya sabes cómo hacer override o sobrescribir el core de tu Magento. Somos conscientes de que no es sencillo y que al principio cuesta bastante, pero con un poco de práctica te manejarás como pez en el agua y podrás realizar cualquier modificación del núcleo de Magento de una manera profesional y limpia, a la par que rápida.

Profile picture for user admin
Way2 Ecommerce

Expertos en Magento ecommerce. Definimos, desarrollamos, mantenemos y potenciamos tiendas online de la más alta calidad para que tu ecommerce supere todas tus expectativas.