🖥️ ModuleFrontController — paginas front del modulo
Actualizado: 2024-12-01
La clase ModuleFrontController permite a los modulos crear paginas propias en el Front Office de PrestaShop. La URL de acceso es /index.php?fc=module&module=nombremodulo&controller=nombrecontrolador o, con pretty URLs, usando hookModuleRoutes.
#Estructura de un FrontController
controllers/front/mypage.php — FrontController basico
php
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class MyModuleMypageModuleFrontController extends ModuleFrontController
{
/** @var bool Mostrar columna izquierda */
public $display_column_left = false;
/** @var bool Mostrar columna derecha */
public $display_column_right = false;
/** @var string Template de la pagina */
public $template = 'module:mymodule/views/templates/front/mypage.tpl';
/**
* Logica principal de la pagina.
* Equivale a index() en otros frameworks.
*/
public function initContent(): void
{
parent::initContent();
// Verificar login si la pagina es privada
if (!$this->context->customer->isLogged()) {
Tools::redirect('index.php?controller=authentication&back=' . urlencode($_SERVER['REQUEST_URI']));
}
// Cargar datos
$myData = $this->getMyData();
// Asignar a Smarty
$this->context->smarty->assign([
'my_data' => $myData,
'customer' => $this->context->customer,
'module_dir' => $this->module->getPathUri(),
]);
}
/**
* Añadir CSS/JS especificos de esta pagina.
*/
public function setMedia(): bool
{
parent::setMedia();
$this->registerStylesheet(
'mymodule-mypage',
'modules/mymodule/views/css/front-mypage.css'
);
$this->registerJavascript(
'mymodule-mypage',
'modules/mymodule/views/js/front-mypage.js',
['position' => 'bottom', 'priority' => 200]
);
return true;
}
private function getMyData(): array
{
return Db::getInstance()->getRow(
'SELECT * FROM `' . _DB_PREFIX_ . 'mymodule_data`
WHERE `id_customer` = ' . (int) $this->context->customer->id
) ?: [];
}
}
#Metodos principales
| Metodo | Cuando se llama | Uso tipico |
|---|---|---|
| initContent() | Al renderizar la pagina | Cargar datos, asignar Smarty, redirigir |
| setMedia() | Al cargar activos | Registrar CSS/JS de la pagina |
| postProcess() | Antes de initContent() | Procesar formularios POST |
| getBreadcrumbLinks() | Para el breadcrumb | Personalizar la miga de pan |
| getTemplateVarPage() | Variables de pagina | Meta title, description para SEO |
#Controlador AJAX
controllers/front/ajax.php — respuesta JSON via AJAX
php
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class MyModuleAjaxModuleFrontController extends ModuleFrontController
{
public $ajax = true; // Indica que esta pagina es solo AJAX
public function initContent(): void
{
// Obtener accion
$action = Tools::getValue('action');
switch ($action) {
case 'getItems':
$this->ajaxRender(json_encode($this->getItems()));
break;
case 'saveItem':
$this->ajaxRender(json_encode($this->saveItem()));
break;
default:
$this->ajaxRender(json_encode(['error' => 'Accion no valida']));
}
}
private function getItems(): array
{
$rows = Db::getInstance()->executeS(
'SELECT * FROM `' . _DB_PREFIX_ . 'mymodule_items`
WHERE active = 1 ORDER BY sort_order ASC'
);
return ['success' => true, 'items' => $rows ?: []];
}
private function saveItem(): array
{
if (!Tools::isSubmit('token') || !$this->validateToken()) {
return ['success' => false, 'error' => 'Token invalido'];
}
$name = pSQL(Tools::getValue('name', ''));
if (empty($name)) {
return ['success' => false, 'error' => 'Nombre requerido'];
}
Db::getInstance()->insert('mymodule_items', ['name' => $name, 'active' => 1]);
return ['success' => true, 'id' => (int) Db::getInstance()->Insert_ID()];
}
}
#Acceso a la URL del controlador
Generar URLs a FrontControllers desde cualquier contexto
php
<?php
// Metodo 1: Clase Link (recomendado)
$link = Context::getContext()->link;
$url = $link->getModuleLink(
'mymodule', // nombre del modulo
'mypage', // nombre del controlador (sin 'ModuleFrontController')
['param' => 'valor'], // parametros GET adicionales
true // HTTPS
);
// Resultado: https://tutienda.com/module/mymodule/mypage?param=valor
// o con pretty URLs: https://tutienda.com/mi-pagina-bonita
// Metodo 2: URL AJAX directa
$ajaxUrl = $link->getModuleLink('mymodule', 'ajax', [], true);
// Exportar a Smarty o JS
$this->context->smarty->assign('ajax_url', $ajaxUrl);
// Desde Smarty
// {assign var='controller_url' value={$link->getModuleLink('mymodule','mypage')}}
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.