Llevo bastante tiempo usando Symfony como plataforma de desarrollo para aplicaciones web's por bastantes beneficios, como sencilles, rapidez, eficacia, y sobre todo, esa forma tan dulce de hacerte la vida distribuyendo todas y cada una de las partes de la aplicación basadas en el Modelo-Vista-Controlador.Symfony tiene una muy buena documentación , sin embargo, el desarrollo de este framework es ya tan grande y profundo, que no todo es totalmente documentado.Algo que siempre había echado de menos era el uso de javascripts dinámicos que me permitieran tener un poco mas de contacto con la base de datos, con el fin de generar eventos no tan predecibles en mis aplicaciones. Sin bien es cierto que contamos con la facilidad de Ajax, hacer que un archivo javascript dinámico involucraba tener que idear algunas cosillas que podían hacer complicado el asunto.Así que, investigando un poco las entrañas de Symfony, descubrí la función addJavascript que me incitaba a creer que era la joya perdida que buscaba para poder hacer lo que yo quería, así que, inmediatamente fui a la documentación en linea para ver que tanto podía hacer con ella.Empero, esta documentación esta muy sencilla, mostrándote solo los parámetros que recibe, pero sin especificar mas profundamente hasta donde puede llevarte.Así que el plan era el siguiente:
- Mi proyecto de Symfony solo tiene una aplicación, llamémosla " Frontend ".
- Dentro de esta aplicación " Frontend ", tengo un módulo, y a este llamemosle " Productos ".
-
Este módulo tiene la siguiente estructura:
-
productos:
-
actions
- actions.class.php
-
templates
- indexSuccess.php
-
actions
-
productos:
- Hasta este punto, todo es normal, como cualquier módulo que pudiésemos crear.
- La idea es, generar un template llamado jsSuccess.php que tendrá todo el código javascript que necesitemos, y tendrá que ser llamado por alguna acción cualquier, en este momento, la acción "index".
-
Así que, al crear
jsSuccess.php
, tendremos que generar una acción para este
template
, para indicarle un par de cosas sobre como comportarse, quedando la estructura así.
-
productos:
-
actions
- actions.class.php
-
templates
- indexSuccess.php
- jsSuccess.php
-
actions
-
productos:
-
Dentro de actions.class.php:
-
//Archivo actions.class.php. class predioActions extends sfActions { public function executeIndex(sfWebRequest $request) { } public function executeJs(sfWebRequest $request){ $this->setLayout(false); $this->getResponse()-> addCacheControlHttpHeader('no-cache'); $this->getResponse()-> setContentType('text/javascript'); } }
-
-
El comportamiento de
executeJs
será el siguiente:
-
$this->setLAyout(false)
: No tendrá ningún layout. -
$this->getResponse()->addCacheControlHttpHeader('no-cache');
: No queremos que se aloje en cache. -
$this->getResponse()->setContentType('text/javascript');
: Será un archivo del tipo Javascript.
-
- Hasta este momento, ya le hemos indicado a nuestra acción js como debe comportarse, como un mero archivo Javascript que podrá tener el dinamismo de acceder a base de datos por ejemplo.
-
Modifiquemos el archivo
jsSuccess.php
para establecer algo de código javascript.
-
//Archivo jsSuccess.php alert("Este alert esta en jsSuccess pero la acción verdadera es Index")
-
- Lo único que falta es llamar a nuestro script en la acción que queramos, por ejemplo, en Index. Realmente lo que deberá hacer es ejecutar 2 acciones, la primera la "index" y la segunda la "js". Aquí es donde addJavascript pensé que funcionaría. Así que, modifiquemos la acción "index".
-
//Acción Index que se encuentra dentro del archivo actions.class.php. public function executeIndex(sfWebRequest $request) { $this->getResponse()-> addJavascript($this->getController()->genUrl('productos/js')); }
-
Por si preguntan,
$this->getController()->genUrl("productos/js")
genera una ruta completa del modulo-acción tal cual lo hace url_for en los templates. - Si probamos tal cual tenemos nuestro módulo, notaremos que no ocurre nada, simplemente muestra la acción index vacía y no vemos la alerta que esperábamos. Y esto es debido a que el uso de addJavascript es para archivos meramente del tipo javascript, así que, nuestra acción "productos/js" es renombrada a "productos/js.js" y esta ruta no existe.
- ¿Que falta? indicarle que esta es una ruta que no debe ser modificada.
-
//Acción Index que se encuentra dentro del archivo actions.class.php public function executeIndex(sfWebRequest $request) { $this->getResponse()-> addJavascript($this->getController()->genUrl('productos/js'),"first",array("raw_name"=>true)); }
-
Como pueden darse cuenta, ya hemos usado 2 parámetros mas, recordando la documentación
addJavascript
puede recibir 3 parámetros, donde 1 es obligatorio y los otros 2 opcionales.
-
addJavascript(url, position, options)
- url: Ruta del archivo javascript a llamar.
- position: La posición donde queremos que nuestro script sea llamado, solo hay 2 posiciones: "last" y "first".
- options: Aquí tuve que rebuscar mas el código fuente de symfony y puede recibir "absolute", "raw_name" y "condition"
-
- Ahora si, al llamar nuestra acción "index", veremos nuestra alerta ejecutada directamente desde la acción "js".
Jorge Hernandez :: http://jorgeluis.com.mx