⚠️ 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

EstrategiaDescripcion
Usar hooks en lugar de overridesSi existe un hook que hace lo mismo, usarlo siempre
Minimizar los metodos sobreescritosSolo sobreescribir lo estrictamente necesario
Documentar los metodos tocadosPara facilitar la fusion manual si ocurre un conflicto
Verificar conflictos antes de instalarComprobar si ya existe el archivo override
Instalar overrides condicionalmenteSi ya existe override, intentar fusionar o alertar al usuario
Probar con otros modulos popularesEspecialmente 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.