Desarrollar un módulo para PrestaShop puede parecer intimidante al principio, pero la plataforma tiene una arquitectura bastante predecible. Una vez que entiendes la estructura mínima, todo lo demás es lógica PHP estándar.

Estructura mínima de un módulo

Todo módulo en PrestaShop vive dentro de la carpeta /modules/{nombre_modulo}/ y necesita al menos dos archivos para funcionar:

  • mi_modulo.php — clase principal del módulo
  • mi_modulo.tpl — plantilla Smarty (opcional, solo si tiene front)
<?php
if (!defined('_PS_VERSION_')) exit;

class MiModulo extends Module {
  public function __construct() {
    $this->name    = 'mi_modulo';
    $this->tab     = 'front_office_features';
    $this->version = '1.0.0';
    $this->author  = 'Carlos Moreno';
    parent::__construct();
    $this->displayName = $this->l('Mi Módulo');
    $this->description = $this->l('Descripción del módulo.');
  }

  public function install() {
    return parent::install() && $this->registerHook('displayHome');
  }

  public function hookDisplayHome($params) {
    return $this->display(__FILE__, 'mi_modulo.tpl');
  }
}

¿Qué es un hook?

Los hooks son puntos de enganche que PrestaShop expone en distintas partes del front y el back office. Al registrar tu módulo en un hook con registerHook(), PrestaShop ejecutará tu función correspondiente cada vez que ese punto se renderiza.

Los hooks más usados en proyectos reales son:

  • displayHome — zona principal de la portada
  • displayHeader — dentro del <head>, ideal para cargar CSS/JS propios
  • actionCartSave — se dispara cuando el carrito cambia
  • actionOrderStatusUpdate — al cambiar el estado de un pedido

Buenas prácticas

Después de haber desarrollado módulos en producción para tiendas con miles de pedidos diarios, estas son las reglas que me han evitado dolores de cabeza:

  1. Siempre valida _PS_VERSION_ al inicio del archivo para evitar accesos directos.
  2. Usa $this->l() para todos los textos: hace el módulo traducible.
  3. Añade métodos uninstall() que limpien lo que install() creó (tablas, configuraciones).
  4. No hagas queries SQL directas; usa ObjectModel o Db::getInstance()->executeS().
Un módulo que no tiene uninstall() limpio es un módulo que va a dejar basura en la base de datos para siempre.