⚠️ Resolucion de conflictos entre overrides
Actualizado: 2024-12-01
Un conflicto de overrides ocurre cuando dos modulos intentan sobreescribir la misma clase PHP del core. PrestaShop solo puede tener una version del archivo override, por lo que el segundo modulo en instalarse reemplaza al primero.
#Como se producen los conflictos
Escenario tipico de conflicto
bash
# Modulo A instala: override/classes/Product.php
# -> Añade campo 'warranty_months'
# Modulo B intenta instalar: override/classes/Product.php
# -> Añade campo 'eco_label'
# Resultado: PS no puede fusionarlos automaticamente
# Solo uno prevalece (el de la ultima instalacion)
# El otro modulo pierde su funcionalidad o causa errores fatales
# Sintoma comun:
# Fatal error: Cannot redeclare class Product
# o
# White screen al acceder a productos
#Detectar el conflicto
Diagnostico de conflictos de overrides
bash
# 1. Ver el log de errores de PHP
tail -100 var/log/prod.log
tail -100 /var/log/php_errors.log
# 2. Verificar el contenido del override existente
cat override/classes/Product.php
# 3. Verificar class_index.php
cat cache/class_index.php | grep Product
# 4. Desactivar temporalmente un modulo para aislar el problema
# (desde el BO o via CLI)
php bin/console prestashop:module:disable nombre_modulo
# 5. Forzar regeneracion del class index
rm cache/class_index.php
# (PS lo regenera en la proxima peticion)
#Fusion manual de overrides
Fusion manual de dos overrides en uno
php
<?php
if (!defined('_PS_VERSION_')) { exit; }
/**
* OVERRIDE FUSIONADO de Product.
* Contiene logica de MODULO A y MODULO B.
*
* Modulo A: añade 'warranty_months'
* Modulo B: añade 'eco_label'
*
* IMPORTANTE: este archivo debe mantenerse al actualizar cualquiera de los dos modulos.
*/
class Product extends ProductCore
{
// ── MODULO A ──
public static function getProductProperties($idLang, $product, Context $context = null): array
{
$props = parent::getProductProperties($idLang, $product, $context);
// Logica del Modulo A
$props['warranty_months'] = (int) Db::getInstance()->getValue(
'SELECT months FROM `' . _DB_PREFIX_ . 'module_a_warranty`
WHERE id_product = ' . (int) ($product['id_product'] ?? 0)
);
// Logica del Modulo B (añadida en la fusion)
$props['eco_label'] = (string) Db::getInstance()->getValue(
'SELECT label FROM `' . _DB_PREFIX_ . 'module_b_eco`
WHERE id_product = ' . (int) ($product['id_product'] ?? 0)
);
return $props;
}
}
#Prevencion de conflictos
| Estrategia | Descripcion |
|---|---|
| Usar hooks en lugar de overrides | Si existe un hook que hace lo mismo, usarlo siempre |
| Minimizar los metodos sobreescritos | Solo sobreescribir lo estrictamente necesario |
| Documentar los metodos tocados | Para facilitar la fusion manual si ocurre un conflicto |
| Verificar conflictos antes de instalar | Comprobar si ya existe el archivo override |
| Instalar overrides condicionalmente | Si ya existe override, intentar fusionar o alertar al usuario |
| Probar con otros modulos populares | Especialmente con modulos como Yotpo, Klaviyo, etc. |
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.