Your SlideShare is downloading. ×
0
Castellón - 5 y 6 de Julio 2010 – Universitat Jaume I organizan patrocinan colaboran Jornadas Symfony 5 y 6 de julio 2010 ...
tr Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony hacemos Webs!
Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony Domesticando los formu...
Jornadas Symfony  http://decharlas.uji.es/symfony Presentación CTO Acilia Internet Madrid Jornadas Symfony  http://decharl...
Jornadas Symfony  http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony  http://decharlas.uj...
Jornadas Symfony  http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony  http://decharlas.uj...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Domesticando los formu...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Contenido +  Formulari...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Domestiquemos los Form...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony EmbeddedForm Así se ha...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony EmbeddedForm Para esto...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Symfony Forms SubFrame...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Symfony Forms SubFrame...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases sfForm publ...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases sfWidget cl...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases sfValidator...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fomularios sfForms
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Fo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fomularios Imprimiendo...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Vista del ...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Manipuland...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm sfForms, Option...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm sfForm. class ....
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm Clases Relativa...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets sfWidget sfWid...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets sfWidgets, Opt...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets en Sym...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets más us...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets más us...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Crear un Widge...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets más us...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets sfWidget abstr...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators sfValidator...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Validadores...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Validadores...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Validadores...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Inicio de l...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Proceso de ...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas sobre e...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Funcionalidades y Clases
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Guardando los Formular...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Image : actAs : Timest...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Invocando el método sa...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Guardando los Formular...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm updateXXXColumn...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Save y doSave sfFormOb...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios de Objetos...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios de Objetos...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Filtros del Admin Gene...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios de Objetos...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Comparación de Clases ...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Muchas Gracias CTO Jos...
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony [email_address] http:/...
Upcoming SlideShare
Loading in...5
×

Symfony: Domesticando los Formularios

3,593

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,593
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
121
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • Transcript of "Symfony: Domesticando los Formularios"

    1. 1. Castellón - 5 y 6 de Julio 2010 – Universitat Jaume I organizan patrocinan colaboran Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony
    2. 2. tr Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony hacemos Webs!
    3. 3. Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony Domesticando los formularios: sfForm Jose Antonio Pio Acilia.es
    4. 4. Jornadas Symfony http://decharlas.uji.es/symfony Presentación CTO Acilia Internet Madrid Jornadas Symfony http://decharlas.uji.es/symfony Background + Estudie Ingeniería Electrónica + Empece a trabajar con internet en el 2001... y aquí sigo. + PHP y Ruby + CakePHP, Rails, CodeIgniter y Symfony 1.2 - 1.4
    5. 5. Jornadas Symfony http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony http://decharlas.uji.es/symfony
    6. 6. Jornadas Symfony http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony http://decharlas.uji.es/symfony notodohoteles.com, quiniela15.com (cache) CondeNast - Profesional Vogue GQ
    7. 7. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Domesticando los formularios: sfForm Contenido
    8. 8. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Contenido + Formularios el SubFramework + Las Clases + Formularios + Widgets + Validators + Funcionalidades y clases
    9. 9. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Domestiquemos los Formularios ¿Cómo se hace un embedded form?
    10. 10. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony EmbeddedForm Así se hace public function configure() { . .. $this ->embedForm( 'newPhotos' , new ObjectForm( $ObjectRelated ) ); }
    11. 11. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony EmbeddedForm Para esto lo he usado class UserAdminForm extends BasesfGuardUserAdminForm { public function configure() { . .. $profileForm = new sfGuardUserProfileForm( $this ->object->profile); $this ->embedForm( "profile" , $profileForm ); } }
    12. 12. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Symfony Forms SubFrameWork
    13. 13. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Symfony Forms SubFrameWork + Objeto Formulario: sfForm + Objeto Widget: sfWidget + Objeto Validator: sfValidator sfForm sfWidget sfValidator
    14. 14. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases sfForm public function executeContact( $request ) { $this ->form = new sfForm (); $this ->form->setWidgets( array ( 'name' => new sfWidgetFormInputText(), 'email' => new sfWidgetFormInputText( array ( 'default' => 'me@example.com' )), 'subject' => new sfWidgetFormChoice( array ( 'choices' => array ( 'Subject A' , 'Subject B' , 'Subject C' ))), 'message' => new sfWidgetFormTextarea(), )); } sfForm
    15. 15. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases sfWidget class ArticleForm extends BaseArticleForm { public function configure() { $this ->widgetSchema[ 'template_id' ] = new sfWidgetFormInputHidden (); $this ->validatorSchema[ 'cover_image_id' ] = new sfValidatorDoctrineChoice ( array ( 'model' => 'Image' , 'required' => false )); $this ->widgetSchema[ 'document_id' ] = new sfWidgetFormDocument (); } } sfWidget
    16. 16. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases sfValidator class ArticleForm extends BaseArticleForm { public function configure() { $this ->validatorSchema[ 'title' ] = new sfValidatorString ( array ( 'max_length' => 255 )) $this ->validatorSchema[ 'template_id' ] = new sfValidatorDoctrineChoice ( array ( 'model' => 'Template' , 'required' => false )); $this ->validatorSchema[ 'video_id' ] = new sfValidatorArticleVideo ( array ( 'object' => $this ->object ) ); } } sfValidator
    17. 17. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fomularios sfForms
    18. 18. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact( $request ) { $this ->form = new sfForm(); $this ->form->setWidgets( array ( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this ->form->setValidators( array ( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); $this ->form->getWidgetSchema()->setNameFormat( 'contact[%s]' ); // Deal with the request if ( $request ->isMethod( 'post' )){ $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); if ( $this ->form->isValid() ){ var_export ( $this ->form->getValues() ); } $this ->redirect( "module/contact" ); } }
    19. 19. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact($request) { $this ->form = new sfForm(); $this->form->setWidgets(array( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this->form->setValidators(array( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); $this->form->getWidgetSchema()->setNameFormat('contact[%s]'); // Deal with the request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
    20. 20. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact($request) { $this->form = new sfForm(); $this ->form->setWidgets( array ( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this->form->setValidators(array( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); $this->form->getWidgetSchema()->setNameFormat('contact[%s]'); // Deal with the request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
    21. 21. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact($request) { $this->form = new sfForm(); $this->form->setWidgets(array( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this ->form->setValidators( array ( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); // Error extra Form Field si no hay validador ->isValid $this->form->getWidgetSchema()->setNameFormat('contact[%s]'); // Deal with the request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
    22. 22. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact($request) { $this->form = new sfForm(); $this->form->setWidgets(array( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this->form->setValidators(array( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); $this ->form->getWidgetSchema()->setNameFormat( 'contact[%s]' ); // Deal with the request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
    23. 23. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact($request) { $this->form = new sfForm(); $this->form->setWidgets(array( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this->form->setValidators(array( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); $this->form->getWidgetSchema()->setNameFormat('contact[%s]'); // Deal with the request if ( $request ->isMethod( 'post' )){ $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); if ( $this ->form->isValid() ){ var_export ( $this ->form->getValues() ); } $this->redirect("module/contact"); } }
    24. 24. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public function executeContact($request) { $this->form = new sfForm(); $this->form->setWidgets(array( 'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(), )); $this->form->setValidators(array( 'name' => new sfValidatorString( array ( 'max_length' => 10 ) ), 'message' => new sfValidatorString( array ( 'max_length' => 20 )) )); $this->form->getWidgetSchema()->setNameFormat('contact[%s]'); // Deal with the request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this ->redirect( "module/contact" ); } }
    25. 25. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fomularios Imprimiendo los Formularios
    26. 26. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Vista del Formulario de Contacto <?php echo $form ->renderFormTag( '' ) ?> < table > <?php echo $form ?> < tr > < td colspan = &quot;2&quot; > < input type = &quot;submit&quot; /> </ td > </ tr > </ table > </ form > <?php echo $form ->renderFormTag( '' ) ?> < ul > <?php foreach ( $form as $field ): ?> < li > <?php echo $fiel ->renderRow() ?> </li> <?php endforeach ; ?> < li > < input type = &quot;submit&quot; / d > </ li > </ ul > </ form >
    27. 27. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Manipulando los campos del formulario <?php echo $form ->renderFormTag( '' ) ?> < ul > <?php foreach ( $form as $field ): ?> < li > <?php if ( $field ->hasError() ): ?> < div class = &quot;error&quot; > <?php echo $field ->renderError() ?> </ div > <?php endif ; ?> <?php echo $field ->renderLabel() ?> <?php echo $field ->render() ?> <?php if ( $field ->renderHelp() ): ?> <?php echo $field ->renderHelp() ?> <?php endif ; ?> </ li > <?php endforeach ; ?> < li > < input type = &quot;submit&quot; /> </ li > </ ul > </ form >
    28. 28. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm
    29. 29. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm sfForms, Options y Attributes class sfForm implements ArrayAccess, Iterator, Countable { protected static $CSRFSecret = false , $CSRFFieldName = '_csrf_token' , $toStringException = null; protected $widgetSchema = null, $validatorSchema = null, $errorSchema = null, $formFieldSchema = null, $formFields = array (), $isBound = false , $taintedValues = array (), $taintedFiles = array (), $values = null, $defaults = array (), $fieldNames = array (), $options = array (), $count = 0 , $localCSRFSecret = null, $embeddedForms = array (); public function __construct( $defaults = array (), $options = array (), $CSRFSecret = null) { } public function configure(){ } public function setup() { } public function render( $attributes = array ()) {} }
    30. 30. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm sfForm. class .php sfFormField. class .php sfFormFieldSchema. class .php sfFormFilter. class .php sfFormObject. class .php sfFormSymfony. class .php sfFormFieldSchema sfFormField sfForm ArrayAccess Countable Iterator Clases Relativas a los Formularios
    31. 31. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm Clases Relativas a los Formularios sfForm ArrayAccess Countable Iterator sfFormSymfony BaseForm sfFormObject
    32. 32. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets sfWidget sfWidgetForm sfWidgetFormInput
    33. 33. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets sfWidgets, Options y Attributes abstract class sfWidget { protected $requiredOptions = array (), $attributes = array (), $options = array (); protected static $xhtml = true , $charset = 'UTF-8' ; public function __construct( $options = array (), $attributes = array ()) { $this ->configure( $options , $attributes ); . .. } protected function configure( $options = array (), $attributes = array ()) { } abstract public function render( $name , $value = null, $attributes = array (), $errors = array ()); }
    34. 34. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets en Symfony sfWidgetFormPropelChoice sfWidgetFormDoctrineChoice sfWidgetForm sfWidgetFormDateTime sfWidgetFormSelectRadio sfWidgetFormSelect sfWidgetFormFilterInput sfWidgetFormDateRange sfWidgetFormInputHidden sfWidgetFormInputFile sfWidgetFormInputText sfWidgetFormInputPassword sfWidgetFormInputFileEditable sfWidgetFormDate sfWidgetFormTime sfWidgetFormSelectCheckbox sfWidgetFormSelectMany sfWidgetFormFilterDate sfWidgetFormInput sfWidgetFormSchemaDecorator sfWidgetFormTextarea sfWidgetFormInputCheckbox sfWidgetFormChoiceBase sfWidgetFormChoice sfWidgetFormSchema sfWidgetFormSchemaFormatterTable sfWidgetFormSchemaFormatterList sfWidgetFormSchemaForEach sfWidgetFormSchemaFormatter sfWidgetFormI18nChoiceCountry sfWidgetFormI18nDate sfWidgetFormI18nTime sfWidgetFormI18nDateTime sfWidgetFormI18nChoiceCurrency sfWidgetFormI18nChoiceTimezone sfWidgetFormI18nChoiceLanguage
    35. 35. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets más usados new sfWidgetFormInput( array ( 'default' => 'John Doe' )); new sfWidgetFormTextarea( array ( 'default' => 'Enter your address here' ), array ( 'cols' => 20 , 'rows' => 5 )); new sfWidgetFormInputPassword(); new sfWidgetFormInputHidden( array ( 'default' => 1234 )); new sfWidgetFormInputCheckbox( array ( 'value_attribute_value' => 'single' , 'default' => true )); new sfWidgetFormChoice( array ( 'choices' => array ( '' => 'Select from the list' , 'us' => 'USA' , 'ca' => 'Canada' , 'uk' => 'UK' , 'other' ), 'default' => 'uk' )); new sfWidgetFormDate( array ( 'label' => 'Date of birth' , 'default' => '01/01/1950' , // can be a timestamp or a string understandable by strtotime() 'years' => $years , ));
    36. 36. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets más usados new sfWidgetFormTime( array ( 'default' => '12:00' )); new sfWidgetFormDateTime( array ( 'default' => '01/01/2008 12:00' )); new sfWidgetFormI18nDate( array ( 'culture' => $this ->getUser()->getCulture(), 'month_format' => 'name' , // Use any of 'name' (default), 'short_name', and 'number' 'label' => 'Date of birth' , 'default' => '01/01/1950' , 'years' => $years )); new sfWidgetFormI18nCountryChoice( array ( 'default' => 'UK' )); new sfWidgetFormI18nLanguageChoice( array ( 'languages' => array ( 'en' , 'fr' , 'de' ), // optional restricted list of languages 'default' => 'en' )); new sfWidgetFormInputFile(); new sfWidgetFormInputFileEditable( array ( 'default' => '/images/foo.png' ));
    37. 37. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Crear un Widget propio class sfWidgetFormCKeditor extends sfWidgetFormTextarea { public function __construct( $options = array (), $attributes = array ()) { $this ->addOption( 'ckconfig' , array ( 'toolbar' => &quot;Full&quot; , 'rows' => 10 , 'cols' => 80 ) ); $this ->addOption( 'verify' , false ); parent ::__construct( $options , $attributes ); } protected function configure( $options = array (), $attributes = array ()) { $this ->setAttribute( 'class' , &quot;ck_textarea&quot; ); } } }
    38. 38. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets más usados public function render( $name , $value = null, $attributes = array (), $errors = array ()){ $config = &quot;&quot;; $editor = $this ->renderContentTag( 'textarea' , self ::escapeOnce( $value ), array_merge( array ( 'name' => $name ), $attributes )); $id_name = trim(preg_replace(&quot;/_{2,}/&quot;, &quot;_&quot;, preg_replace(&quot;/_{1,}$/&quot;, &quot;&quot;, preg_replace(&quot;/[|]/&quot;, &quot;_&quot;, $name)))); $configout = array (); foreach($this->getOption('ckconfig') as $key => $value){ $configout[] .= &quot; {$key} : &quot;{$value}&quot; &quot;; } $config = &quot;, { &quot;.join(&quot;,&quot;, $configout).&quot; }&quot;; $editor .= '<script type=&quot;text/javascript&quot;> $(document).ready(function(){ try{ var instance = CKEDITOR.instances[''.$id_name.'']; if ( instance ){ instance.destroy(true); instance = null; CKEDITOR.replace( ''.$name.'' '.$config.'); }else{ CKEDITOR.replace( ''.$name.'' '.$config.' ); } }catch(e){} }); </script>'; return $editor ; } }
    39. 39. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets sfWidget abstract class sfWidget { public function renderTag( $tag , $attributes = array ()) { if ( empty ( $tag )) { return '' ; } return sprintf( '<%s%s%s' , $tag , $this ->attributesToHtml( $attributes ), self :: $xhtml ? ' />' : (strtolower( $tag ) == 'input' ? '>' : sprintf( '></%s>' , $tag ))); } public function renderContentTag( $tag , $content = null, $attributes = array ()) { if ( empty ( $tag )) { return '' ; } return sprintf( '<%s%s>%s</%s>' , $tag , $this ->attributesToHtml( $attributes ), $content , $tag ); }
    40. 40. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators
    41. 41. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators sfValidatorBase, Options y Attributes abstract class sfValidatorBase { protected static $charset = 'UTF-8' , $globalDefaultMessages = array ( 'invalid' => 'Invalid.' , 'required' => 'Required.' ); protected $requiredOptions = array (), $defaultMessages = array (), $defaultOptions = array (), $messages = array (), $options = array (); public function __construct( $options = array (), $messages = array ()) { { $this ->configure( $options , $messages ); .. . } protected function configure( $options = array (), $messages = array ()) {} abstract protected function doClean( $value ); }
    42. 42. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Validadores de Symfony sfValidatorBase sfValidatedFile sfValidatorBoolean sfValidatorChoice sfValidatorCSRFToken sfValidatorDate sfValidatorDateRange sfValidatorDateTime sfValidatorEmail sfValidatorFile sfValidatorInteger sfValidatorNumber sfValidatorPass sfValidatorRegex sfValidatorString sfValidatorTime sfValidatorUrl sfValidatorFromDescription sfValidatorAnd sfValidatorOr sfValidatorCallback sfValidatorSchema sfValidatorSchemaCompare sfValidatorSchemaFilter sfValidatorSchemaForEach sfValidatorError sfValidatorErrorSchema sfValidatorDecorator
    43. 43. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Validadores mas usados new sfValidatorString( array ( 'min_length' => 4 , 'max_length' => 50 ,), array ( 'min_length' => 'Es muy corto' , 'max_length' => 'Es muy largo' , )); new sfValidatorNumber( array ( 'min' => 18 , 'max' => 99.99 ,), array ( 'min' => 'Mas de 18' , 'max' => 'No te creo' , )); new sfValidatorEmail(); new sfValidatorUrl(); new sfValidatorRegex( array ( 'pattern' => '^[0-9]{3}.[0-9]{3}.[0-9]{2}.[0-9]{3}$' )); new sfValidatorBoolean();
    44. 44. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Validadores mas usados new sfValidatorChoice( array ( 'choices' => array ( 'Subject A' , 'Subject B' , 'Subject C' ))); new sfValidatorChoice( array ( 'multiple' => true , 'choices' => array ( 'en' => 'English' , 'fr' => 'French' , 'other' ))); new sfValidatorPropelChoice( array ( 'model' => 'Section' , 'column' => 'name' )); new sfValidatorDoctrineChoice( array ( 'model' => 'Section' , 'column' => 'name' )); new sfValidatorPropelUnique( array ( 'model' => 'User' , 'column' => 'login' )); new sfValidatorDoctrineUnique( array ( 'model' => 'User' , 'column' => 'login' )); new sfValidatorFile( array ( 'required' => true , 'path' => &quot;///folder&quot; , 'mime_types' => 'web_images' , 'max_size' => 10485760 ) );
    45. 45. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Inicio de la Validación // Validación en la acción if ( $request ->isMethod( 'post' )) { $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); if ( $this ->form->isValid() ){ var_export ( $this ->form->getValues() ); } } public function bindAndSave( $taintedValues , $taintedFiles = null, $con = null) { $this ->bind( $taintedValues , $taintedFiles ); if ( $this ->isValid()){ { $this ->save( $con ); return true ; } return false ; }
    46. 46. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    47. 47. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    48. 48. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); public function bind( array $taintedValues = null, array $taintedFiles = null){ . .. try { $this ->doBind( self ::deepArrayUnion( $this ->taintedValues, self ::convertFileInformation( $this ->taintedFiles))); . .. } ... } protected function doBind( array $values ){ $this ->values = $this ->validatorSchema->clean( $values ); }
    49. 49. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    50. 50. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    51. 51. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    52. 52. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    53. 53. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Proceso de Validación protected function doClean( $values ){ // pre validator try { $this ->preClean( $values ); } catch . .. // validate given values foreach ( $values as $name => $value ) { try { $clean [ $name ] = $this ->fields[ $name ]->clean( $value ); } catch (sfValidatorError $e ){ $clean [ $name ] = null; $errorSchema ->addError( $e , (string) $name ); } } . ... // post validator try { $clean = $this ->postClean( $clean ); } catch . .. return $clean ; }
    54. 54. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    55. 55. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    56. 56. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    57. 57. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $form->bind( $values, $fliles ); sfForm::doBind($values); $this->$this->validatorSchema->clean($values) sfValidatorSchema::clean($values); $this->doClean($values); $this->preClean($values); foreach ($values as $name => $value) $clean[$name] = $this->fields[$name]->clean($value); $clean = $this->postClean($clean); return $clean;
    58. 58. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas sobre el proceso de Validación $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); public function bind( array $taintedValues = null, array $taintedFiles = null){ . .. try { $this ->doBind( self ::deepArrayUnion( $this ->taintedValues, self ::convertFileInformation( $this ->taintedFiles))); . .. } ... } protected function doBind( array $values ){ $this ->values = $this ->validatorSchema->clean( $values ); }
    59. 59. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Funcionalidades y Clases
    60. 60. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Guardando los Formularios de Objetos Save y doSave
    61. 61. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Image : actAs : Timestampable : ~ columns : name: { type: string(255), notblank: true, notnull: true } file_name: { type: string(255), notblank: true, notnull: true } description : { type: blob } width: { type: integer } height: { type: integer } size: { type: integer } mime_type: { type:string(255) } alt: { type: blob, notnull: true, notblank:true } title: { type: blob, notnull: true, notblank:true } caption: { type: string(255) } copy_right: { type: string(255) } longdesc : { type: blob } gravity : { type:string , default: north } Guardando los Formularios de Objetos
    62. 62. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Invocando el método save() Guardando los Formularios de Objetos ᄎ class imageActions extends autoImageActions { public function executeCreate(sfWebRequest $request ){ $this ->form = new ImageForm(); $this ->image = $this ->form->getObject(); if ( $this ->processForm( $request , $this ->form)){ $this ->redirect(“edit...”); } else { $this ->execute( &quot;new&quot; ); } } ... protected function processForm(sfWebRequest $request , sfForm $form ) { $form ->bind( $request ->getParameter( $form ->getName()), $request ->getFiles( $form ->getName())); Try { $tree = $form ->save(); } } catch (Exception $e ) { return false ; } return true ; } ... }
    63. 63. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Guardando los Formularios de Objetos Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values);
    64. 64. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    65. 65. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    66. 66. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    67. 67. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    68. 68. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    69. 69. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm updateXXXColumn class ImageForm extends BaseImageForm { ... protected function updateGravityColumn ( $field ){ $valids = array ( 'north' , 'center' , 'south' ); if ( in_array ( $field , $valids ) ){ return $field ; } return 'north' ; } protected function updateDescriptionColumn( $field ) { $this ->object->longdesc = $field ; return $field ; } ... } Guardando los Formularios de Objetos
    70. 70. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    71. 71. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    72. 72. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values); Guardando los Formularios de Objetos
    73. 73. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios de Objetos Las Clases
    74. 74. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios de Objetos sfForm Las Clases ArticleForm BaseArticleForm BaseFormDoctrine sfFormDoctrine sfFormObject BaseForm sfFormSymfony ArrayAccess Countable Iterator
    75. 75. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Filtros del Admin Generator Las Clases
    76. 76. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios de Objetos sfForm Las Clases ArticleForm BaseArticleFormFilter BaseFormFilterDoctrine sfFormFilterDoctrine sfFormFilter BaseForm sfFormSymfony ArrayAccess Countable Iterator
    77. 77. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Comparación de Clases Las Clases ArticleFormFilter BaseArticleFormFilter BaseFormFilterDoctrine sfFormFilterDoctrine sfFormFilter BaseForm ArticleForm BaseArticleForm BaseFormDoctrine sfFormDoctrine sfFormObject BaseForm
    78. 78. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Muchas Gracias CTO José Antonio Pio Gil
    79. 79. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony [email_address] http://twitter.com/josetonyp
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×