🔷 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).
| 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 |
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.