🔗
Router JavaScript en el Back Office de PrestaShop
Actualizado: 2024-12-01
El componente Router de PrestaShop permite generar URLs de rutas Symfony registradas directamente desde JavaScript. Es esencial para hacer peticiones AJAX a endpoints del BackOffice sin hardcodear rutas que pueden cambiar.
Disponible desde PS 1.7.6+
El componente Router de prestashop.instance esta disponible en PrestaShop 1.7.6 en adelante. Para versiones anteriores, usa el mecanismo de fallback con variables PHP generadas en el template.
#Inicializar el Router
Inicializar el componente Router
javascript
// Esperar a que el DOM este listo
$(function() {
// Verificar que el sistema de componentes existe
if (typeof window.prestashop !== 'undefined' &&
typeof window.prestashop.component !== 'undefined') {
window.prestashop.component.initComponents(['Router']);
}
});
// Alternativa: escuchar el evento de componentes listos
document.addEventListener('DOMContentLoaded', () => {
if (window.prestashop?.component?.initComponents) {
window.prestashop.component.initComponents(['Router']);
}
});
#Generar URLs con generate()
Generar URLs de rutas del core
javascript
// El nombre de la ruta es el nombre Symfony (routes.yml)
const url = window.prestashop.instance.router.generate('admin_customers_index');
// → /admin123/sell/customers/
const orderUrl = window.prestashop.instance.router.generate('admin_orders_index');
// → /admin123/sell/orders/
const productUrl = window.prestashop.instance.router.generate('admin_products_v2_index');
// → /admin123/sell/catalog/products/
#Pasar parametros a la ruta
Rutas con parametros — CRUD y busqueda
javascript
// Ruta con parametro ID
const editUrl = window.prestashop.instance.router.generate(
'admin_product_form',
{ id: 123 } // segundo argumento: objeto con parametros
);
// → /admin123/sell/catalog/products/123/edit
// Busqueda de clientes
const searchUrl = window.prestashop.instance.router.generate(
'admin_customers_search',
{ sf_action: 'search', sf_simple_filter: 'john@example.com' }
);
// Luego hacer la peticion AJAX
fetch(editUrl)
.then(r => r.json())
.then(data => console.log(data));
#Mecanismo de fallback
Fallback seguro para versiones antiguas
javascript
/**
* Genera una ruta de forma segura con fallback.
* @param {string} routeName - Nombre de la ruta Symfony
* @param {Object} params - Parametros de la ruta
* @param {string} fallback - URL de fallback si el router no esta disponible
* @returns {string}
*/
function generateRoute(routeName, params = {}, fallback = '#') {
try {
if (window.prestashop?.instance?.router?.generate) {
return window.prestashop.instance.router.generate(routeName, params);
}
} catch (e) {
console.warn('PS Router not available:', e);
}
return fallback;
}
// Uso:
const url = generateRoute(
'admin_orders_view',
{ orderId: 42 },
'/admin/sell/orders/42'
);
#Exponer rutas del modulo a JS
Pasar URLs desde PHP al JS del modulo
php
<?php
// En el hook actionAdminControllerSetMedia o en el template Twig
public function hookActionAdminControllerSetMedia(array $params): void
{
// Inyectar las URLs generadas por PHP en el JS
Media::addJsDef([
'myModuleUrls' => [
'save' => $this->context->link->getAdminLink('AdminMyModule', true, [], ['action' => 'save']),
'delete' => $this->context->link->getAdminLink('AdminMyModule', true, [], ['action' => 'delete']),
'list' => $this->context->link->getAdminLink('AdminMyModule'),
],
]);
}
Usar las URLs inyectadas desde PHP
javascript
// myModuleUrls esta disponible globalmente gracias a Media::addJsDef
console.log(myModuleUrls.save); // URL de guardado con token
fetch(myModuleUrls.save, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data: 'value' }),
})
.then(r => r.json())
.then(result => {
if (result.success) {
showSuccessAlert('Guardado correctamente');
}
});
#Debug en consola
Herramientas de debug en la consola del navegador
javascript
// Ver todas las rutas disponibles en el Router
console.log(prestashop.instance.router);
// Probar una ruta directamente
prestashop.instance.router.generate('admin_orders_index');
// Ver el objeto completo de prestashop
console.log(window.prestashop);
// Listar todos los componentes disponibles
console.log(prestashop.component);
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.