🌐

Pretty URLs para modulos — hookModuleRoutes

Actualizado: 2024-12-01

Por defecto, las URLs de los FrontControllers de un modulo son del tipo /index.php?fc=module&module=mymodule&controller=list. El hook moduleRoutes permite definir URLs amigables como /mi-seccion/lista mejorando el SEO y la experiencia de usuario.

#Registrar el hook

Registrar moduleRoutes en install()
php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('moduleRoutes'); // DEBE estar en install
}

#Implementar hookModuleRoutes

hookModuleRoutes — definicion de rutas
php
<?php

/**
 * Define las rutas Pretty URL del modulo.
 * Se ejecuta en CADA peticion — mantenerlo ligero.
 */
public function hookModuleRoutes(): array
{
    return [
        // Clave unica: module-{modulo}-{nombre}
        'module-mymodule-list' => [
            'rule'       => 'mi-seccion/lista',    // La URL publica
            'keywords'   => [],                    // Sin parametros dinamicos
            'controller' => 'list',                // controllers/front/list.php
            'params'     => [
                'fc'     => 'module',
                'module' => $this->name,
            ],
        ],
        'module-mymodule-page' => [
            'rule'       => 'mi-seccion/pagina',
            'keywords'   => [],
            'controller' => 'page',
            'params'     => [
                'fc'     => 'module',
                'module' => $this->name,
            ],
        ],
    ];
}

#Rutas con parametros dinamicos

Rutas con ID y slug dinamicos
php
<?php

public function hookModuleRoutes(): array
{
    return [
        'module-mymodule-view' => [
            // {id} y {slug} son parametros capturados de la URL
            'rule'     => 'fichas/{id}-{slug}',
            'keywords' => [
                'id' => [
                    'regexp' => '[0-9]+',               // Solo numeros
                    'param'  => 'id',                   // $_GET['id']
                ],
                'slug' => [
                    'regexp' => '[_a-zA-Z0-9\-\.]+',   // Slug URL-safe
                    'param'  => 'slug',                 // $_GET['slug']
                ],
            ],
            'controller' => 'view',    // controllers/front/view.php
            'params'     => [
                'fc'     => 'module',
                'module' => $this->name,
            ],
        ],
        // URL resultante: /fichas/42-mi-producto-titulo
    ];
}

#Generar URLs desde PHP

Generar Pretty URLs desde PHP con getModuleLink()
php
<?php

// getModuleLink('module', 'controller', $params)
$link = $this->context->link;

// Ruta simple sin parametros
$listUrl = $link->getModuleLink('mymodule', 'list');
// Output: https://tienda.com/mi-seccion/lista

// Ruta con parametros dinamicos
$viewUrl = $link->getModuleLink('mymodule', 'view', [
    'id'   => 42,
    'slug' => 'mi-producto-titulo',
]);
// Output: https://tienda.com/fichas/42-mi-producto-titulo

// Desde dentro del FrontController:
$url = $this->context->link->getModuleLink(
    $this->module->name,
    'list'
);

#Generar URLs desde Smarty

Usar {url} en templates Smarty del modulo
smarty
{* URL del listado sin parametros *}
{url entity='module' name='mymodule' controller='list'}

{* URL con parametros *}
{url entity='module' name='mymodule' controller='view' params=['id' => $item.id, 'slug' => $item.slug]}

#Limpiar la cache de rutas

⚠️
Las rutas se cachean — limpiar tras cambios

PrestaShop cachea el sistema de rutas. Tras modificar hookModuleRoutes, debes limpiar la cache del front office desde el BO (Parametros avanzados > Rendimiento > Vaciar cache) o borrar /var/cache/prod/ y /cache/smarty/compile/.

Limpiar la cache desde CLI (PS 8/9)
bash
# Limpiar cache de Symfony (incluye rutas)
php bin/console cache:clear --env=prod

# Limpiar cache de Smarty (si hay templates cacheados)
rm -rf var/cache/prod/
rm -rf cache/smarty/compile/
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.