🔷 Overrides de clases en PrestaShop

Actualizado: 2024-12-01

Un override en PrestaShop es una clase PHP que extiende una clase del core y se coloca en el directorio /override/. PrestaShop fusiona automaticamente todos los overrides en cache/class_index.php. Es un mecanismo potente pero que puede causar conflictos cuando varios modulos modifican la misma clase.

⚠️
Usar con precaucion en PS 8+

En PrestaShop 8 y 9 muchas funcionalidades tienen alternativas via hooks o servicios Symfony. Los overrides deben ser el ultimo recurso. Consulta la guia de Alternativas antes de decidir.

#Override de ObjectModel

override/classes/Product.php — añadir campo a Product
php
<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

/**
 * Override de la clase Product para añadir un campo personalizado.
 * Archivo: override/classes/Product.php
 */
class Product extends ProductCore
{
    /** @var string Campo personalizado */
    public $my_custom_field = '';

    /**
     * Extiende la definicion del ObjectModel.
     * OJO: PHP no permite redeclarar propiedades estaticas directamente.
     * Hay que hacerlo en el constructor o usar una estrategia alternativa.
     */
    public function __construct($id = null, $idLangDefault = null, $idShop = null)
    {
        // Añadir el campo a la definicion antes de llamar al padre
        self::$definition['fields']['my_custom_field'] = [
            'type'     => self::TYPE_STRING,
            'validate' => 'isCleanHtml',
            'size'     => 255,
        ];

        parent::__construct($id, $idLangDefault, $idShop);
    }
}

#Override de AdminController

override/controllers/admin/AdminProductsController.php
php
<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

/**
 * Override del controlador de productos del admin.
 * Archivo: override/controllers/admin/AdminProductsController.php
 */
class AdminProductsController extends AdminProductsControllerCore
{
    /**
     * Sobreescribir initPageHeaderToolbar() para añadir un boton
     */
    public function initPageHeaderToolbar(): void
    {
        parent::initPageHeaderToolbar();

        // Añadir boton personalizado a la barra de herramientas
        $this->page_header_toolbar_btn['my_action'] = [
            'href'  => self::$currentIndex . '&myaction=1&token=' . $this->token,
            'desc'  => $this->l('Mi Accion'),
            'icon'  => 'process-icon-new',
        ];
    }

    /**
     * Añadir logica adicional al postProcess()
     */
    public function postProcess(): void
    {
        if (Tools::getValue('myaction')) {
            // Tu logica aqui
            $this->confirmations[] = 'Accion completada';
        }

        parent::postProcess();
    }
}

#Instalacion segura desde un modulo

Instalar override desde un modulo con clearClassIndex()
php
<?php

/**
 * Instala el override manualmente sin depender del sistema nativo de PS.
 * El sistema nativo puede fallar si hay conflictos con otros overrides.
 */
private function installOverride(): bool
{
    $src  = $this->getLocalPath() . 'override/classes/Product.php';
    $dest = _PS_ROOT_DIR_ . '/override/classes/Product.php';

    // Si ya existe, NO sobreescribir (podria ser de otro modulo)
    if (file_exists($dest)) {
        return true; // Asumimos que ya esta instalado o no es necesario
    }

    if (!copy($src, $dest)) {
        return false;
    }

    // OBLIGATORIO: limpiar el class index para que PS reconozca el override
    if (file_exists(_PS_ROOT_DIR_ . '/cache/class_index.php')) {
        unlink(_PS_ROOT_DIR_ . '/cache/class_index.php');
    }

    return true;
}

private function uninstallOverride(): bool
{
    $dest = _PS_ROOT_DIR_ . '/override/classes/Product.php';

    if (file_exists($dest)) {
        unlink($dest);
    }

    // Limpiar class index
    if (file_exists(_PS_ROOT_DIR_ . '/cache/class_index.php')) {
        unlink(_PS_ROOT_DIR_ . '/cache/class_index.php');
    }

    return true;
}

#Conflictos y resolucion

Un conflicto ocurre cuando dos modulos intentan overridear la misma clase. PrestaShop fusiona los overrides, pero si ambos redefinen el mismo metodo, solo prevalece uno (el ultimo instalado).

SintomaCausa probableSolucion
Pagina en blanco al instalar moduloOverride conflictivoRevisar /override/ y cache/class_index.php
Metodo no ejecutadoOtro override lo sobreescribeUsar hooks en lugar de override
Error Fatal: Cannot redeclareDos archivos override para la misma claseFusionar manualmente los dos overrides
Override ignoradoclass_index.php cacheadoEliminar cache/class_index.php

#Alternativas modernas a overrides

Caso de usoOverride (legacy)Alternativa moderna
Añadir campo a productoOverride Product.phpTabla propia + hookActionProductFormBuilderModifier
Modificar listado adminOverride AdminControllerhookActionXxxGridDefinitionModifier
Añadir logica a pedidoOverride Order.phphookActionOrderStatusUpdate / actionValidateOrder
Cambiar URL de paginaOverride FrontControllerhookModuleRoutes + ModuleFrontController
Modificar query SQLOverride ObjectModel::getOrderByhookActionXxxGridQueryBuilderModifier
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.