🖥️ Controller Overrides en PrestaShop

Actualizado: 2024-12-01

Los overrides de controllers permiten modificar el comportamiento de las paginas del core de PrestaShop (ficha de producto, listado de categoria, pagina de pedidos del BO...). Antes de usar overrides, verifica si existe un hook equivalente.

#Override de FrontController

override/controllers/front/ProductController.php
php
<?php

if (!defined('_PS_VERSION_')) { exit; }

/**
 * Override del controlador de ficha de producto.
 * ANTES de usar esto, verifica:
 * - displayProductExtraContent (para añadir contenido)
 * - actionProductFormBuilderModifier (para el admin)
 * - hookActionFrontControllerSetMedia (para CSS/JS)
 */
class ProductController extends ProductControllerCore
{
    /**
     * Extender initContent para añadir variables extra a Smarty.
     */
    public function initContent(): void
    {
        // SIEMPRE llamar al padre primero
        parent::initContent();

        // Añadir nuestra variable al template de producto
        if ($this->product && $this->product->id) {
            $extraData = Db::getInstance()->getRow(
                'SELECT * FROM `' . _DB_PREFIX_ . 'mymodule_product_extra`
                 WHERE id_product = ' . (int) $this->product->id
            );

            $this->context->smarty->assign('mymodule_extra', $extraData ?: []);
        }
    }
}

#Override de AdminController

override/controllers/admin/AdminOrdersController.php
php
<?php

if (!defined('_PS_VERSION_')) { exit; }

/**
 * Override del controlador de pedidos del BO.
 * ALTERNATIVA: usar hookActionAdminOrdersControllerPostProcessBefore
 * o hookDisplayAdminOrderMain para añadir contenido.
 */
class AdminOrdersController extends AdminOrdersControllerCore
{
    /**
     * Añadir un boton extra a la barra de herramientas de pedido.
     */
    public function initPageHeaderToolbar(): void
    {
        // Llamar al padre primero
        parent::initPageHeaderToolbar();

        // Solo añadir el boton si hay un pedido seleccionado
        if ($this->object && $this->object->id) {
            $this->page_header_toolbar_btn['mymodule_action'] = [
                'href'  => self::$currentIndex
                           . '&id_order=' . (int) $this->object->id
                           . '&mymodule_action=1'
                           . '&token=' . $this->token,
                'desc'  => $this->l('Accion de Mi Modulo'),
                'icon'  => 'process-icon-export',
            ];
        }
    }
}

#Hooks disponibles en controllers

ControllerHook alternativo
ProductController::initContent()displayProductExtraContent, displayProductAdditionalInfo
CategoryController::initContent()displayProductListFunctionalButtons, filterProductSearch
CartController::processChangeProductInCart()actionCartSave, actionBeforeCartUpdateQty
OrderController::confirmOrder()actionValidateOrder, displayOrderConfirmation
AdminOrdersController::postProcess()actionAdminOrdersControllerPostProcessBefore
AdminProductsController::postProcess()actionAfterUpdateProductFormHandler
AdminCatalogsController::initContent()displayAdminListBefore, displayAdminListAfter

#Metodos mas comunes a sobreescribir

MetodoCuando usarlo
initContent()Añadir datos al contexto Smarty
setMedia()Añadir CSS/JS especificos
postProcess()Procesar logica antes del render
getBreadcrumbLinks()Personalizar el breadcrumb
initPageHeaderToolbar()Añadir botones al BO (Admin)
renderList()Personalizar el listado (Admin)
renderForm()Personalizar el formulario (Admin)
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.