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:
  • 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:
  • 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)
  • Ahora si, al llamar nuestra acción "index", veremos nuestra alerta ejecutada directamente desde la acción "js".
  • Espero que esto sea un poco mas de ayuda para quienes anden buscando la manera de mover información dinámica en nuestros javascripts.

    Jorge Hernandez :: http://jorgeluis.com.mx

      FLISOL 2011Presunto Culpable Sin Censura !