🔭 Como funcionan los overrides en PrestaShop

Actualizado: 2024-12-01

El sistema de overrides de PrestaShop permite reemplazar o extender clases del core colocando archivos PHP en el directorio /override/. Es util para personalizaciones que no son posibles con hooks, pero debe usarse con cuidado para evitar conflictos entre modulos.

#El directorio override/

Estructura del directorio override/
bash
override/
├── classes/
│   ├── Cart.php              # Override de Cart
│   ├── Product.php           # Override de Product
│   ├── order/
│   │   └── Order.php         # Override de Order
│   └── webservice/
│       └── WebserviceKey.php
└── controllers/
    ├── admin/
    │   ├── AdminOrdersController.php
    │   └── AdminProductsController.php
    └── front/
        ├── ProductController.php
        └── CategoryController.php

#Como PrestaShop fusiona los overrides

Cuando instalaas un modulo con overrides, o cuando se detecta un archivo en /override/, PrestaShop genera /cache/class_index.php. Este archivo mapea cada clase a su implementacion (core o override).

cache/class_index.php — ejemplo de contenido generado
php
<?php
// Generado automaticamente por PrestaShop
// NO editar manualmente
return array(
    'Cart'    => array('path' => _PS_OVERRIDE_DIR_ . 'classes/Cart.php',    'type' => 'override'),
    'Product' => array('path' => _PS_OVERRIDE_DIR_ . 'classes/Product.php', 'type' => 'override'),
    'Order'   => array('path' => _PS_CORE_DIR_    . 'classes/order/Order.php', 'type' => 'core'),
    // ...
);

// Para regenerar manualmente (cuando hay problemas):
// Eliminar este archivo y PS lo regenera en la proxima peticion

#Tipos de overrides disponibles

TipoDirectorioEjemplos
ObjectModeloverride/classes/Product, Cart, Order, Customer, Category
Helperoverride/classes/helper/HelperForm, HelperList, Helper
FrontControlleroverride/controllers/front/ProductController, CategoryController
AdminControlleroverride/controllers/admin/AdminOrdersController, AdminProductsController
Webserviceoverride/classes/webservice/WebserviceKey, WebserviceRequest

#Override vs Hooks — decision rapida

NecesidadUsar Override?Alternativa con Hook
Añadir campo a productoNo recomendadoactionProductFormBuilderModifier + tabla propia
Modificar listado adminNo recomendadoactionOrderGridDefinitionModifier
Añadir validacion al carritoSolo si no hay hookactionCartSave, actionBeforeCartUpdateQty
Modificar URL de pagina FONo recomendadohookModuleRoutes
Cambiar calculo de precioSolo si necesarioactionProductPriceCalculation
Añadir columna a tabla DBEvitar (crea dependencia)Tabla propia con id_product
Modificar envio de emailNo recomendadoactionEmailSendBefore

#Verificar overrides instalados

Comandos para verificar el estado de los overrides
bash
# Ver todos los overrides activos
ls override/classes/
ls override/controllers/front/
ls override/controllers/admin/

# Regenerar el class index (resolver problemas de deteccion)
rm cache/class_index.php
# (PS lo regenera en la proxima peticion HTTP)

# Via bin/console de PrestaShop
php bin/console prestashop:override:list

# Limpiar toda la cache de clases
php bin/console cache:clear --env=prod
⚠️
Conflictos entre overrides de modulos

Si dos modulos instalan un override de la misma clase, el segundo modulo en instalarse sobreescribira el primero. El primer modulo dejara de funcionar. Usa hooks siempre que sea posible para evitar este problema.

Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.