🧩 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
| Metodo | Orden | Descripcion |
|---|---|---|
| __construct() | 1 | Inicializacion basica |
| init() | 2 | Seguridad, mantenimiento, permisos |
| setMedia() | 3 | Registrar CSS/JS |
| postProcess() | 4 | Procesar POST antes de renderizar |
| initContent() | 5 | Cargar datos y asignar Smarty |
| display() | 6 | Renderizar 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
| Archivo | URL | Clase |
|---|---|---|
| controllers/front/account.php | /module/mymodule/account | MyModuleAccountModuleFrontController |
| controllers/front/list.php | /module/mymodule/list | MyModuleListModuleFrontController |
| controllers/front/ajax.php | /module/mymodule/ajax | MyModuleAjaxModuleFrontController |
| controllers/front/webhook.php | /module/mymodule/webhook | MyModuleWebhookModuleFrontController |
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.