✅ Alternativas modernas a los overrides

Actualizado: 2024-12-01

PrestaShop 8+ ofrece multiples alternativas modernas a los overrides de clases. Usar estas alternativas garantiza compatibilidad entre modulos, facilita las actualizaciones de PS y hace el codigo mas testeable y mantenible.

#Hooks — la alternativa principal

Lo que antes hacian con overrideHook moderno equivalente
Override de Product::getProductProperties()actionGetProductPropertiesAfter
Override de Order::save()actionOrderStatusUpdate, actionValidateOrder
Override de Cart::getOrderTotal()actionCartSave, actionGetExtraTotalValues
Override de AdminOrdersController::postProcess()actionAdminOrdersControllerPostProcessBefore
Override de CustomerCore::getCustomersByEmail()actionObjectCustomerAddBefore/After
Override de ProductController::initContent()actionFrontControllerSetMedia, displayProductExtraContent

#Form Builder Modifiers

Modificar formularios sin override — forma moderna
php
<?php

// ANTES (con override):
// class Product extends ProductCore {
//     // ... añadir campo al formulario sobreescribiendo metodos
// }

// AHORA (sin override, usando hook):
public function hookActionProductFormBuilderModifier(array $params): void
{
    $formBuilder = $params['form_builder'];

    // Añadir campo al formulario de producto
    $formBuilder->add('my_field', \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
        'label'    => 'Mi campo',
        'required' => false,
        'data'     => $this->getFieldValue((int) $params['id']),
    ]);
}

// Para el pedido:
public function hookActionOrderGridDefinitionModifier(array $params): void
{
    $definition = $params['definition'];
    // Modificar el grid de pedidos
}

#Service Decoration en Symfony

config/services.yml — decorar un servicio del core
yaml
services:
  # Decorar el servicio de precios del core
  MyModule\Service\PriceCalculatorDecorator:
    decorates: 'prestashop.core.pricing.price_calculator'
    arguments:
      - '@MyModule\Service\PriceCalculatorDecorator.inner'
      - '@my_module.custom_discount_service'
src/Service/PriceCalculatorDecorator.php
php
<?php

declare(strict_types=1);

namespace MyModule\Service;

use PrestaShop\PrestaShop\Core\Pricing\PriceCalculatorInterface;

class PriceCalculatorDecorator implements PriceCalculatorInterface
{
    private PriceCalculatorInterface $inner;
    private CustomDiscountService    $discountService;

    public function __construct(
        PriceCalculatorInterface $inner,
        CustomDiscountService $discountService
    ) {
        $this->inner           = $inner;
        $this->discountService = $discountService;
    }

    public function calculatePrice(/* ... parametros ... */): float
    {
        // Llamar al servicio original
        $price = $this->inner->calculatePrice(/* ... */);

        // Aplicar nuestra logica adicional
        return $this->discountService->applyCustomDiscount($price);
    }
}

#Tabla de decision rapida

NecesidadAlternativa recomendada
Añadir campo al formulario de productohookActionProductFormBuilderModifier
Modificar grid de pedidos en BOhookActionOrderGridDefinitionModifier
Añadir logica al guardar un pedidohookActionValidateOrder / hookActionOrderStatusUpdate
Modificar calculo de preciohookActionGetProductPropertiesAfter o Service Decoration
Añadir tab al producto en FOhookDisplayProductExtraContent
Modificar email de confirmacionhookActionBuildMailLayoutVariables
Añadir validacion al checkouthookActionCartSave / hookActionBeforeCartUpdateQty
Extender la API RESThookAddWebserviceResources
Añadir pagina al BOSymfony Controller + $this->tabs declaration
Modificar query SQL de listado BOhookActionOrderGridQueryBuilderModifier
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.