🔭 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
| Tipo | Directorio | Ejemplos |
|---|---|---|
| ObjectModel | override/classes/ | Product, Cart, Order, Customer, Category |
| Helper | override/classes/helper/ | HelperForm, HelperList, Helper |
| FrontController | override/controllers/front/ | ProductController, CategoryController |
| AdminController | override/controllers/admin/ | AdminOrdersController, AdminProductsController |
| Webservice | override/classes/webservice/ | WebserviceKey, WebserviceRequest |
#Override vs Hooks — decision rapida
| Necesidad | Usar Override? | Alternativa con Hook |
|---|---|---|
| Añadir campo a producto | No recomendado | actionProductFormBuilderModifier + tabla propia |
| Modificar listado admin | No recomendado | actionOrderGridDefinitionModifier |
| Añadir validacion al carrito | Solo si no hay hook | actionCartSave, actionBeforeCartUpdateQty |
| Modificar URL de pagina FO | No recomendado | hookModuleRoutes |
| Cambiar calculo de precio | Solo si necesario | actionProductPriceCalculation |
| Añadir columna a tabla DB | Evitar (crea dependencia) | Tabla propia con id_product |
| Modificar envio de email | No recomendado | actionEmailSendBefore |
#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.