Symfony 2.1, el libro oficial

12.5. Mostrando un formulario en una plantilla

En los ejemplos anteriores se mostraba el formulario entero en una plantilla utilizando un solo helper llamado form_widget(). Normalmente necesitas un control más preciso sobre cómo se muestran las diferentes partes del formulario, por lo que utilizarás un código como el siguiente:

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
<form action="{{ path('task_new') }}" method="post" {{ form_enctype(form) }}>
    {{ form_errors(form) }}

    {{ form_row(form.task) }}
    {{ form_row(form.dueDate) }}

    {{ form_rest(form) }}

    <input type="submit" />
</form>
<!-- src/Acme/TaskBundle/Resources/views/Default/newAction.html.php -->
<form action="<?php echo $view['router']->generate('task_new') ?>" method="post" <?php echo $view['form']->enctype($form) ?>>
    <?php echo $view['form']->errors($form) ?>

    <?php echo $view['form']->row($form['task']) ?>
    <?php echo $view['form']->row($form['dueDate']) ?>

    <?php echo $view['form']->rest($form) ?>

    <input type="submit" />
</form>

La plantilla anterior utiliza los siguientes helpers:

  • form_enctype(form), si al menos un campo del formulario permite subir archivos, añade el atributo enctype="multipart/form-data" obligatorio en la etiqueta <form>.
  • form_errors(form), muestra los errores globales del formulario (los errores específicos se muestran al lado de cada campo de formulario erróneo).
  • form_row(form.dueDate), muestra el título, los errores (si los hay) y las etiquetas HTML necesarias para mostrar el campo indicado (por ejemplo, dueDate). Por defecto todos estos elementos se agrupan dentro de una etiqueta <div>.
  • form_rest(form), muesta todos los campos de formulario que no se han mostrado todavía utilizando los otros helpers. Por lo general es buena idea utilizar este helper en la parte inferior de cada formulario (por si te has olvidado de mostrar algún campo o para no tener que mostrar uno a uno los campos ocultos del formulario). Este helper también es muy útil para mostrar automáticamente el campo oculto relacionado con la protección CSRF.

El helper form_row realiza la mayor parte del trabajo, ya que muestra el título, los errores y las etiqueas HTML de un campo. Si no quieres encerrar todos estos elementos en una etiqueta div, tendrás que crear un tema propio para formularios, tal y como se explica más adelante.

Truco Para acceder a los datos del formulario, utiliza la notación form.vars.value:

{{ form.vars.value.task }}
<?php echo $view['form']->get('value')->getTask() ?>

12.5.1. Mostrando cada campo a mano

El helper form_row es muy útil porque puedes mostrar fácilmente cada campo del formulario (y también puedes personalizar su aspecto). Pero a veces necesitas un control todavía más preciso de cómo se muestra cada una de las partes que forman el campo de formulario. Para ello tendrás que utilizar otros helpers, tal y como muestra el siguiente código (que produce un resultado similar a utilizar el helper form_row):

{{ form_errors(form) }}

<div>
    {{ form_label(form.task) }}
    {{ form_errors(form.task) }}
    {{ form_widget(form.task) }}
</div>

<div>
    {{ form_label(form.dueDate) }}
    {{ form_errors(form.dueDate) }}
    {{ form_widget(form.dueDate) }}
</div>

{{ form_rest(form) }}
<?php echo $view['form']->errors($form) ?>

<div>
    <?php echo $view['form']->label($form['task']) ?>
    <?php echo $view['form']->errors($form['task']) ?>
    <?php echo $view['form']->widget($form['task']) ?>
</div>

<div>
    <?php echo $view['form']->label($form['dueDate']) ?>
    <?php echo $view['form']->errors($form['dueDate']) ?>
    <?php echo $view['form']->widget($form['dueDate']) ?>
</div>

<?php echo $view['form']->rest($form) ?>

Si el título generado automáticamente para un campo no es del todo correcto, puedes especificarlo explícitamente:

{{ form_label(form.task, 'Task Description') }}
<?php echo $view['form']->label($form['task'], 'Task Description') ?>

Algunos tipos de campo definen opciones de configuración relacionadas con la forma en la que se muestran. Estas opciones están documentadas con cada tipo, pero una opción común es attr, que te permite modificar los atributos del elemento del formulario. El siguiente ejemplo añade la clase task_field de CSS al elemento HTML utilizado para representar el campo task:

{{ form_widget(form.task, { 'attr': {'class': 'task_field'} }) }}
<?php echo $view['form']->widget($form['task'], array(
    'attr' => array('class' => 'task_field'),
)) ?>

Si necesitas renderizar los campos de formulario a mano, también puedes acceder a los valores individuales de cada campo (como el id, el name y el label). Por ejemplo, para obtener el id:

{{ form.task.vars.id }}
<?php echo $form['task']->get('id') ?>

Para obtener el valor del atributo name del campo de formulario, utiliza en su lugar la propiedad full_name:

{{ form.task.vars.full_name }}
<?php echo $form['task']->get('full_name') ?>

12.5.2. Referencia de funciones de plantilla Twig

Si utilizas Twig, dispones de una referencia completa de las funciones relacionadas con los formularios: Twig Template Form Function and Variable Reference