sábado, 9 de noviembre de 2013

Usando la herencia de formularios en Symfony2

Durante el desarrollo de una aplicación web en Symfony 2 es bastante común encontrarnos con la necesidad de tener varios formularios similares entre sí. Por ejemplo es muy común necesitar un formulario para crear una nueva entidad y otro para editar dicha entidad. Normalmente la diferencia entre uno y otro no es más que añadir o eliminar algunos campos y no deseamos tener que copiar prácticamente todo el código del formulario ya que eso haría nuestro código menos mantenible y nuestra aplicación más propensa a errores.

Digamos que tenemos una entidad Event y necesitamos dos formularios: uno al que llamaremos EventNew y que sirve para crear un nuevo evento y otro llamado EventEdit que servirá para editar un evento. Queremos que el formulario para crear un nuevo evento tenga los siguientes campos:

  • Name
  • Category
  • Subcategory
  • Datetime

Por otra parte queremos que el formulario de edición tenga los mismos campos excepto la fecha/hora del evento (por alguna razón no deseamos que este dato pueda cambiarse una vez creado el evento). Además queremos que nuestro formulario de edición incluya un campo description, ya que hemos decidido que en el formulario de nuevo evento no lo queremos para agilizar el proceso de creación de un nuevo evento. Así pues la lista de campos del formulario de edición sería la siguiente::
  • Name
  • Category
  • Subcategory
  • Description

Tenemos como mínimo dos maneras de resolver este problema. Podemos crear una clase llamada BaseEventType de la cual heredarán EventNewType y EventEditType, la cual contendrá los campos que son comunes a ambos formularios (nombre, categoría y subcategoría). La segunda opción es simplemente hacer que EventEditType herede de EventNewType (el cual contendrá sus 4 campos descritos anteriormente) y añadir o eliminar los campos necesarios. Probablemente la opción 1 es más adecuada de cara a ampliar en un futuro con más formularios. Si estás seguro de que solamente vas a necesitar estos dos la opción 2 es más rápida. Si escogemos la primera opción la clase BaseEventType quedaría así:


Ahora necesitamos la clase EventNewType que heredará de la Base y añade el campo datetime. Fíjate como llamamos en buildForm al método buildForm de la clase padre (BaseEventType) con el fin de heredar los campos que hemos incluido en el base:


Por último creamos la clase EventEditType:

Si optamos por la segunda opción planteada anteriormente crearíamos la clase EventNewType incluyendo los cuatro campos (name, category, subcategory, datetime). Luego crearíamos la clase EventEditType heredando de EventNewType. Eliminaríamos el campo datetime y añadiríamos el campo description empleando los metodos add y remove de FormBuilderInterface:




1 comentario:

  1. Me a gustado mucho, y me resuelve muchos problemas, estaba llenando mi aplicacion por un monton de formularios, muchas gracias, me gustaria mantenerme actualizado con datos como estos que brindas, muchas gracias

    ResponderEliminar