---
title: ModuleFrontController — paginas front del modulo
section: front
slug: frontcontroller
description: "Como crear paginas front office para modulos PrestaShop con ModuleFrontController: metodos initContent, setMedia, AJAX, acceso a contexto y variables Smarty."
keywords: prestashop frontcontroller modulo front office pagina ModuleFrontController smarty ajax contexto
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/front/frontcontroller"
---

# ModuleFrontController — paginas front del modulo

> Como crear paginas front office para modulos PrestaShop con ModuleFrontController: metodos initContent, setMedia, AJAX, acceso a contexto y variables Smarty.

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')}}
```


---

*Fuente: [https://ayudaprestashop.es/front/frontcontroller](https://ayudaprestashop.es/front/frontcontroller). Version Markdown generada automaticamente para consumo por LLMs.*
