✅ 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 override | Hook 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
| Necesidad | Alternativa recomendada |
|---|---|
| Añadir campo al formulario de producto | hookActionProductFormBuilderModifier |
| Modificar grid de pedidos en BO | hookActionOrderGridDefinitionModifier |
| Añadir logica al guardar un pedido | hookActionValidateOrder / hookActionOrderStatusUpdate |
| Modificar calculo de precio | hookActionGetProductPropertiesAfter o Service Decoration |
| Añadir tab al producto en FO | hookDisplayProductExtraContent |
| Modificar email de confirmacion | hookActionBuildMailLayoutVariables |
| Añadir validacion al checkout | hookActionCartSave / hookActionBeforeCartUpdateQty |
| Extender la API REST | hookAddWebserviceResources |
| Añadir pagina al BO | Symfony Controller + $this->tabs declaration |
| Modificar query SQL de listado BO | hookActionOrderGridQueryBuilderModifier |
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.