Cabeza de Ratón: versus el Amor Letal

JavaScripts dinámicos en Symfony.

Me he visto en la necesidad de cargar archivos javascript dinámicos en una aplicación desarrollada en Symfony. Aquí, mi solución.

Javascript Dinámico ?

Pues la verdad así entiendo a un archivo javascript que modifica su contenido en función de ciertos factores. Por ejemplo, generar una estructura de datos en notación JSON en base a datos producto de una consulta realizada en el modelo.

Metodología

La implementación la he tomado de este artículo llamado Use routing to serve localized and dynamic JavaScript que he encontrado googleando. Mi aporte es más que una traducción una libre interpretación con algunos comentarios adicionales. O sea, una chantada.

La dirección del Archivo dinámico

Comenzado de atrás para adelante, vamos a definir el nombre de nuestro archivo javascript para insertarlo en algún script php de la vista, ya sea un layout, un template, etc. Tenemos que tener en cuenta que en función del nombre del archivo que definamos tendremos que definir una ruta nueva en nuestra aplicación.

Por ejemplo … usemos:

<?php
// Cargamos js con el helper
use_javascript('miModulo/dinamico.js');
?>

O sea … el nombre y la ruta que hemos escogido poco tiene que ver con el archivo que realmente terminará generando el código javascript. Eso lo termina definiendo la nueva ruta.

Nueva ruta a routing.yml

Ahora debemos agregar una nueva ruta a nuestro routing.yml de nuestra aplicación en función del nombre de archivo antes definido. Para nuestro ejemplo:

dynamic_javascript:
url: /miModulo/:filename.js
param: { module: modulo-real, action: load }

Con esta ruta lo que logramos es que cuando se intente cargar el archivo desde el helper use_javascript busque la acción load del modulo ‘modulo-real’.

El Módulo

Ahora creamos un módulo nuevo en función de la ruta, en nuestro ejemplo es ‘modulo-real’:

$> symfony generate:module appname script

Y definimos la acción load que indefectiblemente buscará la aplicación a causa de la ruta:

public function executeLoad($request) {
$this->setLayout(false);
$this->getResponse()->setContent('text/javascript');
$this->setTemplate($request->getParameter('filename'));
return ".js".chr(0);
}

En este método:

La respuesta de la aplicación no tendrá un Layout.

Será un archivo de texto de javascript.

El contenido será el template con nombre igual a dinamico.js. Este archivo debe estar dentro de la carpeta templates del mismo módulo que esta acción, o sea, ‘modulo-real’.

Y el dinamismo ?

Bueno, simplemente trata a dinamico.js como un archivo PHP normal. Puedes usar y abusar de PHP y Symfony; mientras te asegures que lo que genera sea javascript, todo vale.

Por otro lado, puedes usar la arquitectura creada para cargar distintos archivos, por ejemplo …

<?php use_javascript('miModulo/otro_js.js'); ?>

… y sólo preocuparte por tener ese archivo otro_js.js dentro de la misma carpeta templates.

Puedes modificar la acción para la forma de cargar el .js, etc. etc. etc.
Espero que sea útil.
Saludos.

You can follow any responses to this entry through the RSS 2.0 feed.