🧩 ModuleFrontController — guia completa

Actualizado: 2024-12-01

Cada archivo en controllers/front/ de un modulo crea una URL accesible en el Front Office. La clase debe llamarse {NombreModulo}{NombreControlador}ModuleFrontController y extender ModuleFrontController.

#Lifecycle de un FrontController

MetodoOrdenDescripcion
__construct()1Inicializacion basica
init()2Seguridad, mantenimiento, permisos
setMedia()3Registrar CSS/JS
postProcess()4Procesar POST antes de renderizar
initContent()5Cargar datos y asignar Smarty
display()6Renderizar template y layout

#Propiedades configurables

controllers/front/account.php — propiedades del FrontController
php
<?php

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

class MyModuleAccountModuleFrontController extends ModuleFrontController
{
    /** Ocultar columna izquierda (sidebar) */
    public $display_column_left  = false;

    /** Ocultar columna derecha */
    public $display_column_right = false;

    /** Template principal de la pagina */
    public $template = 'module:mymodule/views/templates/front/account.tpl';

    /** Activar SSL para esta pagina */
    public $ssl = true;

    /** Incluir CSS del carrito en la pagina */
    public $useDefaultSortFilter = false;

    public function initContent(): void
    {
        parent::initContent();

        $this->context->smarty->assign([
            'customer'   => $this->context->customer,
            'orders'     => $this->getCustomerOrders(),
            'module_dir' => $this->module->getPathUri(),
        ]);
    }

    private function getCustomerOrders(): array
    {
        return Order::getCustomerOrders(
            (int) $this->context->customer->id,
            true  // true = incluir detalles
        );
    }
}

#Procesar formularios POST

postProcess() — manejar POST antes de renderizar
php
<?php

public function postProcess(): void
{
    // Solo procesar si es POST
    if (!$_SERVER['REQUEST_METHOD'] === 'POST') {
        return;
    }

    if (Tools::isSubmit('submitMyForm')) {
        $field = trim(Tools::getValue('my_field', ''));

        // Validar
        if (empty($field)) {
            $this->errors[] = $this->trans('El campo no puede estar vacio.', [], 'Modules.Mymodule.Shop');
            return;
        }

        // Guardar
        Configuration::updateValue('MY_SETTING', pSQL($field));

        // Redirigir para evitar re-submit (Post/Redirect/Get)
        Tools::redirect($this->context->link->getModuleLink($this->module->name, 'account', [
            'success' => 1,
        ]));
    }
}

public function initContent(): void
{
    parent::initContent();

    // Mensaje de exito tras redirect
    if (Tools::getValue('success')) {
        $this->context->smarty->assign('success_message', true);
    }

    // Pasar errores de validacion al template
    $this->context->smarty->assign('errors', $this->errors);
}

#Breadcrumbs y meta SEO

Personalizar breadcrumbs y meta tags
php
<?php

/**
 * Personalizar el breadcrumb de la pagina.
 */
public function getBreadcrumbLinks(): array
{
    $breadcrumb = parent::getBreadcrumbLinks();

    $breadcrumb['links'][] = [
        'title' => $this->trans('Mi Cuenta', [], 'Modules.Mymodule.Shop'),
        'url'   => $this->context->link->getPageLink('my-account'),
    ];

    $breadcrumb['links'][] = [
        'title' => $this->trans('Mi Modulo', [], 'Modules.Mymodule.Shop'),
        'url'   => '',
    ];

    return $breadcrumb;
}

/**
 * Personalizar el <title> y meta description de la pagina.
 */
public function getTemplateVarPage(): array
{
    $page = parent::getTemplateVarPage();

    $page['meta']['title']       = $this->trans('Mi Pagina — Tienda', [], 'Modules.Mymodule.Shop');
    $page['meta']['description'] = $this->trans('Descripcion para SEO de esta pagina.', [], 'Modules.Mymodule.Shop');
    $page['body_classes']['mymodule-page'] = true;

    return $page;
}

#Pagina privada — verificar login

Redirigir al login si el cliente no esta autenticado
php
<?php

public function initContent(): void
{
    parent::initContent();

    // Verificar autenticacion
    if (!$this->context->customer->isLogged()) {
        Tools::redirect(
            'index.php?controller=authentication&back=' .
            urlencode($_SERVER['REQUEST_URI'])
        );
    }

    // A partir de aqui, $this->context->customer es un cliente logueado
    $customerId = (int) $this->context->customer->id;
    // ...
}

#Multiples paginas en un modulo

ArchivoURLClase
controllers/front/account.php/module/mymodule/accountMyModuleAccountModuleFrontController
controllers/front/list.php/module/mymodule/listMyModuleListModuleFrontController
controllers/front/ajax.php/module/mymodule/ajaxMyModuleAjaxModuleFrontController
controllers/front/webhook.php/module/mymodule/webhookMyModuleWebhookModuleFrontController
💡
Pretty URLs con hookModuleRoutes

Para cambiar /module/mymodule/account por /mi-cuenta-personalizada, usa el hook hookModuleRoutes. Consulta la guia Trucos > Pretty URLs para modulos.

Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.