1. Continuamos con
Formularios
Realizada por:
Christian Aquino |@cj_aquino
Diego Ramirez |@thedarsideofit
Gonzalo Alonso |@GonzaloAlonsoD
Diego Barros |@Inmzombie
Para: Hydras C&S |@hydras_cs
Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
3. Tematizando formularios
Se puede personalizar cómo se reproduce cada parte de un formulario. Se puede cambiar la forma en
que se dibuja cada «fila» del formulario, cambiar el formato que sirve para reproducir errores, e
incluso personalizar la forma en que se debe reproducir una etiqueta textarea. Nada está fuera de
límites, y puedes usar diferentes personalizaciones en diferentes lugares.
Symfony utiliza plantillas para reproducir todas y cada una de las partes de un formulario, como las
etiquetas label, etiquetas input, mensajes de error y todo lo demás.
En Twig, cada «fragmento» del formulario está representado por un bloque Twig. Para personalizar
alguna parte de cómo se reproduce un formulario, sólo hay que reemplazar el bloque adecuado.
En PHP, cada «fragmento» del formulario se reproduce vía un archivo de plantilla individual. Para
personalizar cualquier parte de cómo se reproduce un formulario, sólo hay que reemplazar la plantilla
existente creando una nueva.
Para entender cómo funciona esto, vamos a personalizar el fragmento form_row añadiendo un
atributo «class» al elemento div que envuelve cada fila. Para ello, crea un nuevo archivo de plantilla
que almacenará el nuevo marcado:
5. El fragmento field_row del formulario se usa cuando al dibujar la mayoría de los campos a través de
la función form_row. Para decir al componente Form que utilice tu nuevo fragmento field_row definido
anteriormente, añade lo siguiente en la parte superior de la plantilla que dibuja el formulario:
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig'
'AcmeTaskBundle:Form:fields2.html.twig' %}
<form ...>
Twig
PHP
<!-- src/Acme/TaskBundle/Resources/views/Default/new.html.php -->
<?php $view['form']->setTheme($form, array('AcmeTaskBundle:Form')) ?>
<?php $view['form']->setTheme($form, array('AcmeTaskBundle:Form', 'AcmeTaskBundle:Form')) ?>
<form ...>
6. Nombrando fragmentos de formulario
En Symfony, cada parte de un formulario reproducido —elementos HTML de formulario, errores,
etiquetas, etc.— se definen en base a un tema, el cual es una colección de bloques en Twig y una
colección de archivos de plantilla en PHP.
En Twig, cada bloque necesario se define en un solo archivo de plantilla (form_div_layout.html.twig)
que vive dentro de Twig Bridge. Dentro de este archivo, puedes ver todos los bloques necesarios
para reproducir un formulario y cada tipo de campo predeterminado.
/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
En PHP, los fragmentos son archivos de plantilla individuales. De manera predeterminada se
encuentran en el directorio Resources/views/Form del paquete de la plataforma (ver en GitHub).
El nombre de cada fragmento sigue el mismo patrón básico y se divide en dos partes, separadas por
un solo carácter de guión bajo (_). Algunos ejemplos son:
● form_row — usado por form_row para reproducir la mayoría de los campos;
● textarea_widget — usado por form_widget para dibujar un campo de tipotextarea;
● form_errors — usado por form_errors para dibujar los errores de un campo;
7. label (p. ej. form_label) dibuja la etiqueta de los campos
widget (p. ej. form_widget) dibuja la representación HTML de los campos
errors (p. ej. form_errors) dibuja los errores de los campos
row (p. ej. form_row) dibuja el renglón completo de los campos (etiqueta, elemento
gráfico y errores)
Cada fragmento sigue el mismo patrón básico: type_part. La porción type corresponde al tipo del
campo que se está reproduciendo (por ejemplo, textarea, checkbox, date, etc.), mientras que la
porción part corresponde a qué se está reproduciendo (por ejemplo, label,widget, errors, etc.). Por
omisión, hay cuatro posibles partes de un formulario que puedes pintar:
8. Heredando fragmentos de plantilla
En algunos casos, parece que falta el fragmento que deseas personalizar. Por ejemplo, no hay
fragmento textarea_errors en los temas predeterminados provistos con Symfony. Entonces, ¿cómo se
reproducen los errores de un campo textarea?
La respuesta es: a través del fragmento field_errors. Cuando Symfony pinta los errores del tipo
textarea, primero busca un fragmento textarea_errors antes de caer de nuevo al fragmento
form_errors. Cada tipo de campo tiene un tipo padre (el tipo primario del textarea es text, y su padre
es el form), y Symfony utiliza el fragmento para el tipo del padre si no existe el fragmento base.
Por lo tanto, para sustituir sólo los errores de los campos textarea, copia el fragmento form_errors,
renómbralo como textarea_errors y personalízalo. Para sustituir la reproducción predeterminada para
error de todos los campos, copia y personaliza el fragmento form_errors directamente.
9. Tematizando formularios globalmente
En el ejemplo anterior, utilizamos el ayudante form_theme (en Twig) para «importar» fragmentos de
formulario personalizados sólo para ese formulario. También puedes decirle a Symfony que importe
formularios personalizados a través de tu proyecto.
Twig
Para incluir automáticamente en todas las plantillas los bloques personalizados de la plantilla fields.html.
twig creada anteriormente, modifica el archivo de configuración de tu aplicación:
# app/config/config.yml
twig:
form:
resources:
- 'AcmeTaskBundle:Form:fields.html.twig'
# ...
10. Para incluir automáticamente todas las plantillas personalizadas del directorio
Acme/TaskBundle/Resources/views/Form creado anteriormente, modifica el archivo de configuración
de tu aplicación:
# app/config/config.yml
framework:
templating:
form:
resources:
- 'AcmeTaskBundle:Form'
# ...