miércoles, 16 de noviembre de 2011

Insertando calendarios de jQuery con Symfony

Calendario de jQuery con plugin sfFormExtraPlugin para Symfony

Recientemente comencé a desarrollar aplicaciones en  PHP con el  framework Simfony. En este corto articulo les narro cómo instalar el  plugin sfFormExtraPlugin y luego facilitarle al usuario la selección de fechas mediante el uso de un calendario (en este caso de  jQuery Datepicker). De más está decir que me ha dado unos cuantos dolores de cabeza , así que espero que este corto tutorial también pueda servirle a todos aquellos que tienen problemas similares al mío. Por el camino, como efecto secundario, también espero que queden claras las razones por las que me gusta  Python, especialmente  las plantillas de Genshi con Django. Espero también que Ustedes con sus comentarios puedan iluminarme el camino que lleva a mejorar la solución que les presento por acá. Les sugiero  suscribirse a este blog mediante RSS si desea estar al tanto de nuevos trucos de programación. Sin más rodeos, let the hacking begin ! .

Pre-requisitos

Formulario estándar de Symfony

Sinceramente hay  muchos tutoriales detallando los primeros pasos en Symfony. Es por esto que no pretendo abordar todos estos pasos. Asumo entonces que ya existe un sitio funcional y muy especialmente una página que utiliza los  formularios de Symfony para ofrecerle al usuario la posibilidad de seleccionar fechas. En otras palabras , ya se tiene una aplicación donde existe una clase TestForm.class.php que utiliza los modelos que brindan acceso a la base de datos; además existen módulos, componentes, y todo lo que sea preciso (... hay muchos caminos para llegar a Roma ;) para obtener una página similar a la que se muestra en la figura.

Instalando el plugin sfFormExtraPlugin

Segun la documentación hay  muchas formas de instalar un plugin de Symfony. De más está decir que Murphy (... mi gran amigo de mil batallas ... Jo jo jo ...) se encargó de que ninguna funcionara. Me explico. Cualquier variante de instalación en línea que incluyera conectarse al  PEAR channel de Symfony siempre terminaba en un adorable mensaje The channel symfony does not support the REST protocol . Por tal razon pasé a la próxima fase : la instalación offline . A continuación les muestro brevemente cómo se hace (basado en  este artículo del sitio My Rant).

Primeramente, edite el fichero config/ProjectConfiguration.class.php y habilite el plugin sfFormExtraPlugin. Le debe quedar algo más o menos así (aunque puede ser diferente si Usted utiliza otros plugins en su aplicación ;) .




class ProjectConfiguration extends sfProjectConfiguration  
{  
  public function setup()  
  {  
    $this->enablePlugins(array('sfDoctrinePlugin', 'sfFormExtraPlugin'));  
  }  
}  

También acostumbro a incluir el plugin en el fichero apps/<appname>/config/settings.yml (aunque sinceramente no he podido constatar la necesidad de hacerlo). Allí sería preciso modificar la directiva enabled_modules y añadir sfFormExtraPlugin , por ejemplo, de la siguiente manera :

enabled_modules:      [default, sfGuardAuth, sfFormExtraPlugin]

Luego proceda a instalar el plugin en cuestión.

$ cd plugins  
$ wget "http://plugins.symfony-project.org/get/sfFormExtraPlugin/sfFormExtraPlugin-1.1.3.tgz"  
$ tar zxvf sfFormExtraPlugin-1.1.3.tgz  
$ mv sfFormExtraPlugin-1.1.3 sfFormExtraPlugin  
$ cd ..  
$ ./symfony plugin:publish-assets  
$ cd web/js  
$ wget "http://code.jquery.com/jquery-1.4.3.min.js"  
$ wget "http://jqueryui.com/download/jquery-ui-1.8.5.custom.zip"  
$ mkdir jquery-ui  
$ cd jquery-ui  
$ unzip ../jquery-ui-1.8.5.custom.zip  
$ mv jquery-ui/css/smoothness ../css  

En este punto ya deberían estar instalados los ficheros del plugin, pero faltan unos detalles. En primer lugar, hay que inyectar las referencias a los ficheros estáticos de jQuery . Por tanto , edite el fichero apps/<app_name>/config/view.yml e incluya los valores mostrados a continuación :

stylesheets:    [main.css, smoothness/jquery-ui-1.8.5.custom.css]  
  
javascripts:    [jquery-1.4.3.min.js, jquery-ui/js/jquery-ui-1.8.5.custom.min.js]  

Ya por último hace falta indicarle a Symfony cuales son los campos para los cuales se ofrecerá la posibilidad de edición mediante un calendario. Edite el fichero del formulario (e.g. lib/form/doctrine/TestForm.class.php ) y edite el método configure añadiendo instrucciones como las que se muestran a continuación.




class TestForm extends BaseTestForm
{
  public function configure()
  {
                $this->widgetSchema['fechainicial'] = new sfWidgetFormJqueryDate();
                $this->widgetSchema['fechafinal'] = new sfWidgetFormJqueryDate();
                $this->widgetSchema['fecharev'] = new sfWidgetFormJqueryDate();
  }
}

Todas las referencias indican que en este punto ya se visualizaría un botón que desplegaría el calendario de jQuery ... pero ...

Cuando Olemis llora Murphy tiembla …

Ejemplo de calendario insertado en formulario

Está de más decir que por alguna razón (... que todavía no he logrado descubrir, así que si la conocen espero sus comentarios con detalles ... ;) no me funciona. Cuando se va a visualizar la página, en mi caso, se muestra el siguiente mensaje Fatal error: Class 'sfWidgetFormJqueryDate' not found in /path/to/project/lib/form/doctrine/TestForm.class.php on line 17 . Sospecho que la causa es que el fichero plugins/.filemap no está correctamente generado (¿ algo que supongo que deba hacer el comando plugin:publish-assets ?). Llego a esa conclusión al comparar los contenidos de mi fichero (mostrado a continuación) con los de otros proyectos que hacen uso del mismo plugin (e.g.  Kakrail)

a:0:{}

Por tales razones me vi obligado a incluir la siguiente línea al principio del fichero lib/form/doctrine/TestForm.class.php. Preste atención al hecho de que la ruta especificada puede cambiar en dependencia del lugar donde se ubique el fichero .php del formulario, pero siempre tiene que resultar en una referencia al fichero plugins/sfFormExtraPlugin/lib/widget/sfWidgetFormJQueryDate.class.php.




require dirname(__FILE__).'/../../../plugins/sfFormExtraPlugin/lib/widget/sfWidgetFormJQueryDate.class.php';

Después de este pequeño detallito, todo funciona. Sin embargo, como ya mencioné anteriormente, me gustaría no tener que incluir esta línea y lograr que se concrete la magia del fichero .filemap ... pero por ahora ¡qué remedio! . De más está decir que espero sus comentarios al respecto.

Agradecimientos

No sería posible concluir este artículo sin agradecer a Yamila , quien se encargó del proceso de creación del sitio de Symfony , los modelos de Doctrine , etc, etc ... y facilitó los enlaces a los  artículos de instalación de los plugins de Symfony, exactamente dos minutos antes de enviarle un ramo de flores a los desarrolladores del plugin y del framework (... y a Murphy ...) .

Conclusiones

Como han podido apreciar es posible enriquecer las interfaces de usuario de sitios implementados con Symfony . En particular se brinda la posibilidad de desplegar un calendario para seleccionar cómodamente fechas. El proceso es ... enriquecedor . La ruta ideal puede fallar en varios puntos del camino , pero al final se logra el objetivo . Recuerde que todo es posible simelo pides ... . Pronto publicaré más artículos sobre temas afines. Si Usted está interesad@ le invito a  suscribirse a este blog mediante RSS . Cualquier sugerencia para mejorar el artículo, correcciones a partes del proceso explicado , preguntas ... pues no dude en compartirlas y dejar su comentario. Podrían ser útiles para que otros resuelvan algún problema y usen eficientemente su tiempo. Hasta pronto

No hay comentarios:

Publicar un comentario