Cómo hacer override en los módulos de Prestashop

publicado en: Prestashop, Tutoriales | 8

Parece que al fin, después de tanto tiempo el equipo de Prestashop nos ha escuchado y ha añadido una funcionalidad con la que algunos llevamos bastante tiempo soñando, hacer override de los módulos.

A partir de la versión 1.6.0.11 esto se ha convertido en una realidad, se acabó sufrir cada vez que había que actualizar un módulo, ya podemos tener nuestros módulos actualizados y con funcionalidades retocadas.

Una cosa que me aprece increible es que no hayan anunciado esto «a bombo y platillo» sabiendo que es una funcionalidad que se lleva demandando desde hace tantisimo tiempo, sino que ha sido a través de un usuario del foro como se ha dado a concoer esta gran noticia. Sea como fuere por fin está disponible, para tiendas a partir de la 1.6.0.11 eso si.

Bueno ya basta de introducción, vamos a ponernos manos a la obra.
Si ahora accedemos a la carpeta de /override (recuerda que tienes que tener la versión 1.6.0.11) tendremos una nueva carpeta que se llama /modules de forma que tendriamos una estructura tal que asi /override/modules/.

Dentro de esta carpeta deberemos crear una nueva carpeta con el nombre del modulo al que vamos a hacer override, por ejemplo blockcms. Una vez que la tengamos, dentro crearemos el archivo blockcms.php.

Vamos a ver el código que debemos incluir para que esto funcione. Nos valernos del archivo original para hacer nuestra modificación, asi que vamos a /modules/blockcms/blockcms.php y lo abrimos, dentro tenemos algo como esto

<?php
 
if (!defined('_CAN_LOAD_FILES_'))
    exit;
 
class BlockCms extends Module
{
 
}

Y lo que hacemos es modificarlo para nuestro override, de forma que extienda la clase BlockCms que a su vez extiende a Module, se quedaria como sigue:

<?php
 
if (!defined('_CAN_LOAD_FILES_'))
    exit;
 
class BlockCmsOverride extends BlockCms
{
 
}

Como se ve, BlockCmsOverride extiende a BlockCms que es el archivo original. Como os habreis dado cuenta el patron para nombrarlo es NombreDelModuloOverride, asi que no hay mucha perdida y todo pasa a ser muy ordenado.

Solo queremos ver que hemos extendido nuestro modulo, asi que vamos con algo facil, unicamente incluiremos un var_dump para ver que efectivamente se ha extendido nuestra funcionalidad

<?php
 
 
if (!defined('_CAN_LOAD_FILES_'))
    exit;
 
class BlockCmsOverride extends BlockCms
{
    public function displayBlockCMS($column)
    {
        var_dump('probando');
        if (!$this->isCached('blockcms.tpl', $this->getCacheId($column)))
        {
            $cms_titles = BlockCMSModel::getCMSTitles($column);
 
            $this->smarty->assign(array(
                'block' => 1,
                'cms_titles' => $cms_titles,
                'contact_url' => (_PS_VERSION_ >= 1.5) ? 'contact' : 'contact-form'
            ));
        }
        return $this->display(__FILE__, 'blockcms.tpl', $this->getCacheId($column));
    }
 
}

Como se puede ver no es nada del otro mundo, simplemente tenemos que duplicar en nuestro archivo de override el metodo que queramos extender o reemplazar.

Listo! Tan sencillo como eso, ya tenemos nuestro modulo modificado y a salvo de futuras actualizaciones. Parece mentira que una cosa tan sencilla vaya a darnos tanta tranquilidad a la hora de poder extender la funcionalidad de algunos modulos.

 

¿Que os parece esta mejora? ¿la echabais de menos en vuestros desarrollos?

8 comentarios

  1. Juan Pablo

    Hola Dwalins! Quiero hacerte una petición. Tengo en mi web un nuevo método de pago, llamado Sequra payment con unas características especiales, el caso es que este modulo me da la opción de añadir un recargo en el precio de compra del cliente y para añadir este recargo lo que hace es que (en el momento que instalas el modulo) crea un producto llamado Sequra payment con el precio fijo que tu le pongas (este producto te aparece en el backoffice como un producto mas, pero no en tu tienda) y lo añade a la factura.

    Pues bien, me gustaría saber si se pudiese hacer lo mismo pero con el modulo oficial de paypal, modificarlo de manera que haya un producto llamado «Recargo paypal» que se añada a la factura si utilizas este método de pago, pero en vez de recargo fijo, seria un porcentaje del precio de la compra (imagino que esto sera mas complicado).

    Ya me dirás algo 🙂

    Gracias!

    • dwalins

      Hola Juan Pablo,
      Puedes probar con el módulo que proponen en este hilo del foro de Prestashop. Si no acaba de convencerte, creo recordar que había por ahí un módulo de pago que puede que sea más avanzado.

      Pruebalo y me comentas 😉

      Un saludo!

  2. Juan Pablo

    Probare este modulo, pero la última edición fue de noviembre del 2013, y hace poco paypal hizo un cambio en el sistema de seguridad creo, es por lo que me da cosa usar estos módulos gratis que hay por la web. Crees que es buena opción igualmente?

    • dwalins

      Hola Juan Pablo,

      Si la ultima edición fué de noviembre de 2013 estoy bastante convencido que no te va a funcionar, ya que no están dando servicio a través de SSL3 que es lo que manejaba el anterior módulo, si tienes una tienda que no sea la de producción puedes probar el módulo y tratar de corregir el error (aqui puedes ver como) aunque si no dispones de mucho tiempo tiraria a por la versión de pago que te aseguras la actualización.

  3. Fran

    Hola,

    Mira yo llevo dos días liado con esto del override en Prestashop 1.6.1.6, he seguido tus pasos y los de otros tutoriales, pero imposible, no consigo que tome los cambios.

    He creado esto /override/modules/payapl/express_checkout/process.php
    con este contenido:

    class PaypalExpressCheckoutOverride extends PaypalExpressCheckout
    {
    public function setExpressCheckout($access_token = false)
    {
    …..

    }
    }

    he borrado cache/class_index.php he borrado la cache desde el admin y nada, no hay manera de que me tome los cambios, algo se me debe estar escapando :S

    Te agradecería cualquier ayuda.

    Un saludo.

    • dwalins

      Hola Fran,

      Es raro que no te pille los cambios, asi de primeras parece que está bien. ¿Tienes otros overrides funcionando actualmente? Si es el primero mira que no esté desactivada una opción que hay en el panel de administración que desactiva el uso de overrides

      Un saludo

  4. Fran

    Hola,

    Gracias por tu respuesta 😉

    No, en la página de rendimiento del admin no está desactivado el override.

    Parece que los overrides sí funcionan si modifico un .php en el directorio principal del módulo, pero no si modifico alguno que esté en un directorio dentro del módulo :S

    • dwalins

      Hola Fran,

      Supongo que has comprobado bien la ruta de las carpetas y que no se ha colado ningún error en el nombre de las carpetas, si hago memoria no recuerdo haber tenido que hacer override de ningun modulo con varias carpetas pero debería funcionar. ¿En que versión de prestashop estás?

      He estado cotilleando por el foro, prueba a reintalar el modulo con el override a ver si así te lo coge.

      Un saludo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *