---
title: Overrides de clases en PrestaShop
section: overrides
slug: class-overrides
description: "Como crear overrides de clases ObjectModel y Controller en PrestaShop: estructura, ubicacion, clearClassIndex(), conflictos y alternativas modernas."
keywords: prestashop overrides clases objectmodel controller clearClassIndex conflictos alternativas modulo
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/overrides/class-overrides"
---

# Overrides de clases en PrestaShop

> Como crear overrides de clases ObjectModel y Controller en PrestaShop: estructura, ubicacion, clearClassIndex(), conflictos y alternativas modernas.

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).

| Sintoma | Causa probable | Solucion |
| --- | --- | --- |
| Pagina en blanco al instalar modulo | Override conflictivo | Revisar /override/ y cache/class_index.php |
| Metodo no ejecutado | Otro override lo sobreescribe | Usar hooks en lugar de override |
| Error Fatal: Cannot redeclare | Dos archivos override para la misma clase | Fusionar manualmente los dos overrides |
| Override ignorado | class_index.php cacheado | Eliminar cache/class_index.php |

## Alternativas modernas a overrides

| Caso de uso | Override (legacy) | Alternativa moderna |
| --- | --- | --- |
| Añadir campo a producto | Override Product.php | Tabla propia + hookActionProductFormBuilderModifier |
| Modificar listado admin | Override AdminController | hookActionXxxGridDefinitionModifier |
| Añadir logica a pedido | Override Order.php | hookActionOrderStatusUpdate / actionValidateOrder |
| Cambiar URL de pagina | Override FrontController | hookModuleRoutes + ModuleFrontController |
| Modificar query SQL | Override ObjectModel::getOrderBy | hookActionXxxGridQueryBuilderModifier |


---

*Fuente: [https://ayudaprestashop.es/overrides/class-overrides](https://ayudaprestashop.es/overrides/class-overrides). Version Markdown generada automaticamente para consumo por LLMs.*
