Routing — URLs de modulos y rutas Symfony
Actualizado: 2024-12-01
PrestaShop usa dos sistemas de routing: routes.yml para las paginas del Back Office (Symfony) y hookModuleRoutes para las paginas del Front Office. Ambos permiten crear URLs amigables y parametrizadas.
#Rutas del Back Office (routes.yml)
config/routes.yml — rutas de controllers Symfony en el BO
yaml
# Ruta basica
admin_mymodule_index:
path: /my-module
methods: [GET]
defaults:
_controller: 'MyModule\Controller\Admin\IndexController::indexAction'
_legacy_classname: AdminMyModule
_legacy_link: AdminMyModule
# Ruta con parametro
admin_mymodule_item_edit:
path: /my-module/items/{id}/edit
methods: [GET, POST]
requirements:
id: '\d+'
defaults:
_controller: 'MyModule\Controller\Admin\ItemController::editAction'
# Ruta de eliminacion
admin_mymodule_item_delete:
path: /my-module/items/{id}
methods: [DELETE]
requirements:
id: '\d+'
defaults:
_controller: 'MyModule\Controller\Admin\ItemController::deleteAction'
#Rutas del Front Office (hookModuleRoutes)
hookModuleRoutes — URLs amigables en el Front Office
php
<?php
public function hookModuleRoutes(): array
{
return [
// ── Ruta de listado ──
'module-mymodule-list' => [
'controller' => 'list',
'rule' => 'mi-modulo/listado',
'keywords' => [],
'params' => ['fc' => 'module', 'module' => $this->name],
],
// ── Ruta de detalle con slug ──
'module-mymodule-detail' => [
'controller' => 'detail',
'rule' => 'mi-modulo/{slug}',
'keywords' => [
'slug' => ['regexp' => '[_a-zA-Z0-9-]+', 'param' => 'slug'],
],
'params' => ['fc' => 'module', 'module' => $this->name],
],
// ── Ruta con ID numerico ──
'module-mymodule-item' => [
'controller' => 'item',
'rule' => 'mi-modulo/item/{id:[0-9]+}',
'keywords' => [
'id' => ['regexp' => '[0-9]+', 'param' => 'id'],
],
'params' => ['fc' => 'module', 'module' => $this->name],
],
];
}
#Generar URLs desde PHP
Generar URLs de rutas desde PHP
php
<?php
// ── FRONT OFFICE — usar Link ──
$link = Context::getContext()->link;
// URL de FrontController del modulo
$url = $link->getModuleLink('mymodule', 'list');
$url = $link->getModuleLink('mymodule', 'detail', ['slug' => 'mi-producto']);
// ── BACK OFFICE — usar el Router de Symfony ──
// Desde dentro de un Symfony Controller:
$url = $this->generateUrl('admin_mymodule_item_edit', ['id' => 42]);
// Desde el modulo (mymodule.php):
$container = \PrestaShop\PrestaShop\Adapter\SymfonyContainer::getInstance();
$router = $container->get('router');
$url = $router->generate('admin_mymodule_item_edit', ['id' => 42]);
#Generar URLs desde JavaScript
Router JS en el Back Office de PrestaShop
javascript
// El router de Symfony esta disponible en el BO via window.prestashop.instance.router
// SOLO en el Back Office con los assets del BO cargados
const router = window.prestashop?.instance?.router;
if (router) {
// Generar URL de una ruta del BO
const editUrl = router.generate('admin_mymodule_item_edit', { id: 42 });
console.log(editUrl); // /admin123/my-module/items/42/edit
} else {
// Fallback para cuando el router no esta disponible
console.warn('PS Router no disponible');
}
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.