Symfony2: Form Extensions

El componente de formularios da para mucho, en esta ocasión vamos a ver en qué consisten las Form Extensions y crearemos una. Seguiremos los pasos de la documentación para crearnos una extensión que permita añadir la opción help a cualquier campo que nos permitirá mostrar una ayuda al lado del campo.

Las Form Extensions nos permiten añadir funcionalidad encima de los types existentes. Esto nos permite poder añadir una funcionalidad general a varios types (como la de “help” que haremos ahora) o añadir una funcionalidad a un type específico (como el caso de la documentación para añadir un thumbnail a un campo file o añadir un prototype_data a collection como ya hicimos). Esto se podría hacer con Custom Types, pero lo que te permiten las extensiones es actuar directamente con los types existentes, algo mucho más cómodo y práctico.

HelpTypeExtension.php

Lo primero que haremos será crear la clase HelpTypeExtension, esta clase debe implementar la interfaz FormTypeExtensionInterface, también podemos extender la clase AbstractTypeExtension que nos facilita la tarea al ya tener implementados los métodos.

Empezamos primero por el método getExtendedType que es el método más importante y lo que devuelve es el nombre del type (corresponde con el valor devuelto del método getName del Type) que vamos a extender. En nuestro caso la extensión se va a aplicar a todos los campos (cada campo es un formulario).

En setDefaultOptions indicamos que es un valor opcional y en buildView pasamos a la vista el valor del atributo help.

Registrar la extensión

Tenemos que declarar la extensión como servicio y añadirle el tag form.extension (en el artículo de Compiler Pass hablamos sobre tags):

El alias del tag es el tipo de campo al que se aplica la extensión.

Sobrescribir las plantillas del formulario

Como nuestra extensión añade el campo help, tenemos que modificar la vista para añadir este campo. Los cambios serán para todos los formularios, por lo que sobrescribimos la plantilla de los formularios para toda la aplicación. Añadimos en el config.yml:

Y ese fichero contendrá las modificaciones:

Lo añadimos solo para el bloque form_widget_simple que será el habitual.

Usando la extensión

Ya tenemos todo lo necesario, ahora simplemente vamos a usarlo, para ello tenemos que añadir la opción help donde queramos mostrarlo, por ejemplo en uno de los que ya tenemos:

El resultado final se puede ver en el ejemplo.

Ver Demo