Cómo personalizar la reproducción de un formulario

Symfony ofrece una amplia variedad de formas para personalizar cómo se reproduce un formulario. En esta guía, aprenderás cómo personalizar cada parte posible de tu formulario con el menor esfuerzo posible si utilizas Twig o PHP como tu motor de plantillas.

Fundamentos de la reproducción de formularios

Recuerda que label, error y los elementos gráficos HTML de un campo de formulario se pueden reproducir fácilmente usando la función form_row de Twig o el método ayudante row de PHP:

  • Twig
    {{ form_row(form.age) }}
    
  • PHP
    <?php echo $view['form']->row($formulario['edad']) }} ?>
    

También puedes reproducir cada una de las tres partes del campo individualmente:

  • Twig
    <div>
        {{ form_label(form.age) }}
        {{ form_errors(form.age) }}
        {{ form_widget(form.age) }}
    </div>
    
  • PHP
    <div>
        <?php echo $view['form']->label($form['age']) }} ?>
        <?php echo $view['form']->errors($form['age']) }} ?>
        <?php echo $view['form']->widget($form['age']) }} ?>
    </div>
    

En ambos casos, la etiqueta, errores y elementos gráficos del formulario HTML se reproducen con un conjunto de marcas que se incluyen de serie con Symfony. Por ejemplo, ambas plantillas anteriores reproducirán:

<div>
    <label for="form_age">Age</label>
    <ul>
        <li>This field is required</li>
    </ul>
    <input type="number" id="form_age" name="form[age]" />
</div>

para crear prototipos rápidamente y probar un formulario, puedes reproducir el formulario completo con una sola línea:

  • Twig
    {{ form_widget(form) }}
    
  • PHP
    <?php echo $view['form']->widget($formulario) }} ?>
    

El resto de esta receta debe explicar cómo se puede modificar cada parte del marcado del formulario en varios niveles diferentes. Para más información sobre la forma de reproducción en general, consulta Reproduciendo un formulario en una plantilla.

¿Qué son los temas de formulario?

Symfony utiliza fragmentos de formulario —una parte de una plantilla que sólo dibuja una pequeña parte de un formulario— para dibujar todas las partes de un formulario —etiquetas de campo, errores, campos de texto input, etiquetas select, etc.—

Los fragmentos se definen como bloques en Twig y como archivos de plantilla en PHP.

Un tema no es más que un conjunto de fragmentos que deseas utilizar al dibujar un formulario. En otras palabras, si deseas personalizar una parte de cómo dibujar un formulario, importa el tema que contiene una personalización apropiada de esos fragmentos del formulario.

Symfony viene con un tema predeterminado (form_div_layout.html.twig en Twig y FrameworkBundle:Form en PHP) que define todos y cada uno de los fragmentos necesarios para dibujar todas las partes de un formulario.

En la siguiente sección aprenderás cómo personalizar un tema redefiniendo todos o algunos de sus fragmentos.

Por ejemplo, cuando dibujas el elemento gráfico de un campo de tipo entero, se dibuja un campo input como número.

  • Twig
    {{ form_widget(form.age) }}
    
  • PHP
    <?php echo $view['form']->widget($form['age']) ?>
    

reproduce:

<input type="number" id="form_edad" name="form[edad]" required="required" value="33" />

Internamente, Symfony usa el fragmento integer_widget para dibujar el campo. Esto se debe a que el tipo de campo es entero y estás dibujando su elemento gráfico (en comparación a label o errors).

En Twig de manera predeterminada es el bloque integer_widget de la plantilla form_div_layout.html.twig.

En PHP sería más bien el archivo integer_widget.html.php ubicado en el directorio FrameworkBundle/Resources/views/Form.

La implementación predeterminada del fragmento integer_widget tiene el siguiente aspecto:

  • Twig
    {# form_div_layout.html.twig #}
    {% block integer_widget %}
        {% set type = type|default('number') %}
        {{ block('form_widget_simple') }}
    {% endblock integer_widget %}
    
  • PHP
    <!-- integer_widget.html.php -->
    <?php echo $view['form']->block($form, 'form_widget_simple', array('type' => isset($type) ? $type : "number")) ?>
    

Como puedes ver, este fragmento en sí mismo dibuja otro fragmento — form_widget_simple:

  • Twig
    {# form_div_layout.html.twig #}
    {% block form_widget_simple %}
        {% set type = type|default('text') %}
        <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
    {% endblock form_widget_simple %}
    
  • PHP
    <!-- FrameworkBundle/Resources/views/Form/form_widget_simple.html.php -->
    <input
        type="<?php echo isset($type) ? $view->escape($type) : 'text' ?>"
        <?php if (!empty($value)): ?>value="<?php echo $view->escape($value) ?>"<?php endif ?>
        <?php echo $view['form']->block($form, 'widget_attributes') ?>
    />
    

El punto es que los fragmentos dictan la salida HTML de cada parte de un formulario. Para personalizar la salida del formulario, sólo tienes que identificar y redefinir el fragmento correcto. Un conjunto de estos fragmentos de formulario personalizados se conoce como un «tema» de formulario. Al reproducir un formulario, puedes elegir el/los tema(s) que deseas aplicar al formulario.

En Twig un tema es un sólo archivo de plantilla y los fragmentos son los bloques definidos en ese archivo.

En PHP un tema es un directorio y los fragmentos son archivos de plantilla individuales en ese directorio.

Tematizando formularios

Para ver el poder del tematizado de formularios, supongamos que deseas envolver todos los campos de entrada número con una etiqueta div. La clave para hacerlo es personalizar el fragmento text_widget.

Tematizando formularios en Twig

Cuando personalizamos el bloque de campo de formulario en Twig, tienes dos opciones en donde puede vivir el bloque personalizado del formulario:

Método Pros Contras
Dentro de la misma plantilla que el formulario Rápido y fácil No se puede reutilizar en otra plantilla
Dentro de una plantilla separada Se puede reutilizar en muchas plantillas Requiere la creación de una plantilla extra

Ambos métodos tienen el mismo efecto, pero son mejores en diferentes situaciones.

Método 1: Dentro de la misma plantilla que el formulario

La forma más sencilla de personalizar el bloque integer_widget es personalizarlo directamente en la plantilla que realmente pinta el formulario.

{% extends '::base.html.twig' %}

{% form_theme form _self %}

{% block integer_widget %}
    <div class="integer_widget">
        {% set type = type|default('number') %}
        {{ block('form_widget_simple') }}
    </div>
{% endblock %}

{% block content %}
    {# ... pinta el formulario #}

    {{ form_row(form.age) }}
{% endblock %}

Al usar las etiquetas especiales {% form_theme form _self %}, Twig busca dentro de la misma plantilla cualquier bloque de formulario a sustituir. Suponiendo que el campo form.age es un campo de tipo entero, cuando se reproduzca el elemento gráfico, utilizará el bloque personalizado integer_widget.

La desventaja de este método es que los bloques personalizados del formulario no se pueden reutilizar en otros formularios reproducidos en otras plantillas. En otras palabras, este método es más útil cuando haces personalizaciones en forma que sean específicas a un único formulario en tu aplicación. Si deseas volver a utilizar una personalización a través de varios (o todos) los formularios de tu aplicación, lee la siguiente sección.

Método 2: Dentro de una plantilla independiente

También puedes optar por poner el bloque integer_widget personalizado del formulario en una plantilla completamente independiente. El código y el resultado final son el mismo, pero ahora puedes volver a utilizar la personalización de un formulario a través de muchas plantillas:

{# src/Acme/DemoBundle/Resources/views/Form/fields.html.twig #}
{% block integer_widget %}
    <div class="integer_widget">
        {% set type = type|default('number') %}
        {{ block('form_widget_simple') }}
    </div>
{% endblock %}

Ahora que has creado el bloque personalizado, es necesario decirle a Symfony que lo utilice. Dentro de la plantilla en la que estás reproduciendo tu formulario realmente, dile a Symfony que utilice la plantilla por medio de la etiqueta form_theme:

{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %}

{{ form_widget(form.age) }}

Cuando se reproduzca el form.age, Symfony utilizará el bloque integer_widget de la nueva plantilla y la etiqueta input será envuelta en el elemento div especificado en el bloque personalizado.

Tematizando formularios en PHP

Cuando usas PHP como motor de plantillas, el único método para personalizar un fragmento es crear un nuevo archivo de plantilla —esto es similar al segundo método utilizado por Twig.

El archivo de plantilla se debe nombrar después del fragmento. Debes crear un archivo integer_widget.html.php a fin de personalizar el fragmento integer_widget.

<!-- src/Acme/DemoBundle/Resources/views/Form/integer_widget.html.php -->
<div class="integer_widget">
    <?php echo $view['form']->block($form, 'form_widget_simple', array('type' => isset($type) ? $type : "number")) ?>
</div>

Ahora que has creado la plantilla del formulario personalizado, necesitas decirlo a Symfony para utilizarlo. Dentro de la plantilla en la que estás reproduciendo tu formulario realmente, dile a Symfony que utilice la plantilla por medio del método ayudante setTheme:

<?php $view['form']->setTheme($form, array('AcmeDemoBundle:Form')) ;?>

<?php $view['form']->widget($form['age']) ?>

Al reproducir el elemento gráfico form.age, Symfony utilizará la plantilla personalizada integer_widget.html.php y la etiqueta input será envuelta en el elemento div.

Refiriendo bloques del formulario base (específico de Twig)

Hasta ahora, para sustituir un bloque form particular, el mejor método consiste en copiar el bloque predeterminado desde form_div_layout.html.twig, pegarlo en una plantilla diferente y entonces, personalizarlo. En muchos casos, puedes evitarte esto refiriendo al bloque base cuando lo personalizas.

Esto se logra fácilmente, pero varía ligeramente dependiendo de si el bloque del formulario personalizado se encuentra en la misma plantilla que el formulario o en una plantilla separada.

Refiriendo bloques dentro de la misma plantilla que el formulario

Importa los bloques añadiendo una etiqueta use en la plantilla donde estás reproduciendo el formulario:

{% use 'form_div_layout.html.twig' with integer_widget as base_integer_widget %}

Ahora, cuando importes bloques desde form_div_layout.html.twig, el bloque integer_widget es llamado base_integer_widget. Esto significa que cuando redefines el bloque integer_widget, puedes referir el marcado predeterminado a través de base_integer_widget:

{% block integer_widget %}
    <div class="integer_widget">
        {{ block('base_integer_widget') }}
    </div>
{% endblock %}

Refiriendo bloques base desde una plantilla externa

Si tus personalizaciones del formulario viven dentro de una plantilla externa, puedes referir al bloque base con la función parent() de Twig:

{# src/Acme/DemoBundle/Resources/views/Form/fields.html.twig #}
{% extends 'form_div_layout.html.twig' %}

{% block integer_widget %}
    <div class="integer_widget">
        {{ parent() }}
    </div>
{% endblock %}

Nota

No es posible hacer referencia al bloque base cuando usas PHP como motor de plantillas. Tienes que copiar manualmente el contenido del bloque base a tu nuevo archivo de plantilla.

Personalizando toda tu aplicación

Si deseas que una personalización en cierto formulario sea global en tu aplicación, lo puedes lograr haciendo las personalizaciones del formulario en una plantilla externa y luego importarla dentro de la configuración de tu aplicación:

Twig

Al utilizar la siguiente configuración, los bloques personalizados del formulario dentro de la plantilla AcmeDemoBundle:Form:fields.html.twig se utilizarán globalmente al reproducir un formulario.

  • YAML
    # app/config/config.yml
    twig:
        form:
            resources:
                - 'AcmeDemoBundle:Form:fields.html.twig'
        # ...
    
  • XML
    <!-- app/config/config.xml -->
    <twig:config ...>
            <twig:form>
                <resource>AcmeDemoBundle:Form:fields.html.twig</resource>
            </twig:form>
            <!-- ... -->
    </twig:config>
  • PHP
    // app/config/config.php
    $container->loadFromExtension('twig', array(
        'form' => array(
            'resources' => array(
                'AcmeDemoBundle:Form:fields.html.twig',
            ),
        ),
    
        // ...
    ));
    

De forma predeterminada, Twig utiliza un diseño con div al reproducir formularios. Algunas personas, sin embargo, pueden preferir reproducir formularios en un diseño con tablas. Usa el recurso form_table_layout.html.twig para utilizarlo como diseño:

  • YAML
    # app/config/config.yml
    twig:
        form:
            resources: ['form_table_layout.html.twig']
        # ...
    
  • XML
    <!-- app/config/config.xml -->
    <twig:config ...>
            <twig:form>
                <resource>form_table_layout.html.twig</resource>
            </twig:form>
            <!-- ... -->
    </twig:config>
  • PHP
    // app/config/config.php
    $container->loadFromExtension('twig', array(
        'form' => array(
            'resources' => array(
                'form_table_layout.html.twig',
            ),
        ),
    
        // ...
    ));
    

Si sólo quieres hacer el cambio en una plantilla, añade la siguiente línea a tu archivo de plantilla en lugar de agregar la plantilla como un recurso:

{% form_theme form 'form_table_layout.html.twig' %}

Ten en cuenta que la variable form en el código anterior es la variable de la vista del formulario pasada a la plantilla.

PHP

Al utilizar la siguiente configuración, cualquier fragmento de formulario personalizado dentro del directorio src/Acme/DemoBundle/Resources/views/Form se usará globalmente al reproducir un formulario.

  • YAML
    # app/config/config.yml
    framework:
        templating:
            form:
                resources:
                    - 'AcmeDemoBundle:Form'
        # ...
    
  • XML
    <!-- app/config/config.xml -->
    <framework:config ...>
        <framework:templating>
            <framework:form>
                <resource>AcmeDemoBundle:Form</resource>
            </framework:form>
        </framework:templating>
        <!-- ... -->
    </framework:config>
  • PHP
    // app/config/config.php
    // PHP
    $container->loadFromExtension('framework', array(
        'templating' => array(
            'form' => array(
                'resources' => array(
                    'AcmeDemoBundle:Form',
                ),
            ),
         ),
    
         // ...
    ));
    

De manera predeterminada, el motor PHP utiliza un diseño div al reproducir formularios. Algunas personas, sin embargo, pueden preferir reproducir formularios en un diseño con tablas. Utiliza el recurso FrameworkBundle:FormTable para utilizar este tipo de diseño:

  • YAML
    # app/config/config.yml
    framework:
        templating:
            form:
                resources:
                    - 'FrameworkBundle:FormTable'
    
  • XML
    <!-- app/config/config.xml -->
    <framework:config ...>
        <framework:templating>
            <framework:form>
                <resource>FrameworkBundle:FormTable</resource>
            </framework:form>
        </framework:templating>
        <!-- ... -->
    </framework:config>
  • PHP
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        'templating' => array(
            'form' => array(
                'resources' => array(
                    'FrameworkBundle:FormTable',
                ),
            ),
        ),
    
         // ...
    ));
    

Si sólo quieres hacer el cambio en una plantilla, añade la siguiente línea a tu archivo de plantilla en lugar de agregar la plantilla como un recurso:

<?php $view['form']->setTheme($form, array('FrameworkBundle:FormTable')); ?>

Ten en cuenta que la variable $form en el código anterior es la variable de la vista del formulario que pasaste a tu plantilla.

Cómo personalizar un campo individual

Hasta ahora, hemos visto diferentes formas en que puedes personalizar elementos gráficos de todos los tipos de campo de texto. También puedes personalizar campos individuales. Por ejemplo, supongamos que tienes dos campos textfirst_name y last_name— pero sólo quieres personalizar uno de los campos. Esto se puede lograr personalizando un fragmento cuyo nombre es una combinación del atributo id del campo y cual parte del campo estás personalizando. Por ejemplo:

  • Twig
    {% form_theme form _self %}
    
    {% block _product_name_widget %}
        <div class="text_widget">
            {{ block('form_widget_simple') }}
        </div>
    {% endblock %}
    
    {{ form_widget(form.name) }}
    
  • PHP
    <!-- Plantilla principal -->
    <?php echo $view['form']->setTheme($form, array('AcmeDemoBundle:Form')); ?>
    
    <?php echo $view['form']->widget($form['name']); ?>
    
    <!-- src/Acme/DemoBundle/Resources/views/Form/_product_name_widget.html.php -->
    
    <div class="text_widget">
          echo $view['form']->block('form_widget_simple') ?>
    </div>
    

Aquí, el fragmento _product_name_widget define la plantilla a utilizar para el campo cuyo id es product_name (y nombre es product[name]).

Truco

La parte producto del campo es el nombre del formulario, el cual puedes ajustar manualmente o generar automáticamente a partir del nombre del tipo en el formulario (por ejemplo, ProductType equivale a producto). Si no estás seguro cual es el nombre del formulario, solo ve el código fuente del formulario generado.

También puedes sustituir el marcado de toda la fila de un campo usando el mismo método:

  • Twig
    {# _product_name_row.html.twig #}
    {% form_theme form _self %}
    
    {% block _product_name_row %}
        <div class="name_row">
            {{ form_label(form) }}
            {{ form_errors(form) }}
            {{ form_widget(form) }}
        </div>
    {% endblock %}
    
  • PHP
    <!-- _product_name_row.html.php -->
    
    <div class="name_row">
        <?php echo $view['form']->label($form) ?>
        <?php echo $view['form']->errors($form) ?>
        <?php echo $view['form']->widget($form) ?>
    </div>
    

Otras personalizaciones comunes

Hasta el momento, esta receta ha mostrado varias formas de personalizar una sola pieza de cómo se reproduce un formulario. La clave está en personalizar un fragmento específico que corresponde a la porción del formulario que deseas controlar (consulta nombrando bloques de formulario).

En las siguientes secciones, verás cómo puedes hacer varias personalizaciones de formulario comunes. Para aplicar estas personalizaciones, utiliza uno de los dos métodos descritos en la sección Tematizando formularios.

Personalizando la exhibición de errores

Nota

El componente form sólo se ocupa de cómo se presentan los errores de validación, y no los mensajes de error de validación reales. Los mensajes de error están determinados por las restricciones de validación que apliques a tus objetos. Para más información, ve el capítulo Validando.

Hay muchas maneras de personalizar el modo en que se representan los errores cuando se envía un formulario con errores. Los mensajes de error de un campo se reproducen cuando se utiliza el ayudante form_errors:

  • Twig
    {{ form_errors(form.age) }}
    
  • PHP
    <?php echo $view['form']->errors($form['age']); ?>
    

De forma predeterminada, los errores se representan dentro de una lista desordenada:

<ul>
    <li>This field is required</li>
</ul>

Para redefinir cómo se dibujan los errores para todos los campos, simplemente copia, pega y personaliza el fragmento form_errors.

  • Twig
    {# form_errors.html.twig #}
    {% block form_errors %}
        {% spaceless %}
            {% if errors|length > 0 %}
            <ul>
                {% for error in errors %}
                    <li>{{ error.message }}</li>
                {% endfor %}
            </ul>
            {% endif %}
        {% endspaceless %}
    {% endblock form_errors %}
    
  • PHP
    <!-- form_errors.html.php -->
    <?php if ($errors): ?>
        <ul>
            <?php foreach ($errors as $error): ?>
                <li><?php echo $error->getMessage() ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif ?>
    

Truco

Consulta Tematizando formularios para ver cómo aplicar esta personalización.

También puedes personalizar la salida de error de sólo un tipo de campo específico. Por ejemplo, algunos errores que son más globales en tu formulario (es decir, no específicos a un solo campo) se reproducen por separado, por lo general en la parte superior de tu formulario:

  • Twig
    {{ form_errors(form) }}
    
  • PHP
    <?php echo $view['form']->render($form); ?>
    

Para personalizar sólo el formato utilizado por estos errores, sigue las mismas instrucciones que el anterior, pero ahora llamamos al bloque form_errors (Twig) / el archivo form_errors.html.php (PHP). Ahora, al dibujar errores del tipo form, se utiliza tu fragmento personalizado en lugar del form_errors predeterminado.

Personalizando una «fila del formulario»

Cuando consigas manejarla, la forma más fácil para dibujar un campo de formulario es a través de la función form_row, la cual dibuja la etiqueta, errores y el elemento gráfico HTML de un campo. Para personalizar el marcadp utilizado para dibujar todas las filas de los campos del formulario, sustituye el fragmento form_row. Por ejemplo, supón que deseas agregar una clase al elemento div alrededor de cada fila:

  • Twig
    {# form_row.html.twig #}
    {% block form_row %}
        <div class="form_row">
            {{ form_label(form) }}
            {{ form_errors(form) }}
            {{ form_widget(form) }}
        </div>
    {% endblock form_row %}
    
  • PHP
    <!-- form_row.html.php -->
    <div class="form_row">
        <?php echo $view['form']->label($form) ?>
        <?php echo $view['form']->errors($form) ?>
        <?php echo $view['form']->widget($form) ?>
    </div>
    

Truco

Consulta Tematizando formularios para ver cómo aplicar esta personalización.

Añadiendo un asterisco «Requerido» a las etiquetas de campo

Si deseas denotar todos los campos obligatorios con un asterisco requerido (*), lo puedes hacer personalizando el fragmento form_label.

En Twig, si estás haciendo la personalización del formulario dentro de la misma plantilla que tu formulario, modifica la etiqueta use y añade lo siguiente:

{% use 'form_div_layout.html.twig' with form_label as base_form_label %}

{% block form_label %}
    {{ block('base_form_label') }}

    {% if required %}
        <span class="required" title="This field is required">*</span>
    {% endif %}
{% endblock %}

En Twig, si estás haciendo la personalización del formulario dentro de una plantilla separada, utiliza lo siguiente:

{% extends 'form_div_layout.html.twig' %}

{% block form_label %}
    {{ parent() }}

    {% if required %}
        <span class="required" title="This field is required">*</span>
    {% endif %}
{% endblock %}

Cuando usas PHP como motor de plantillas tienes que copiar el contenido desde la plantilla original:

<!-- form_label.html.php -->

<!-- contenido original -->
<?php if ($required) { $label_attr['class'] = trim((isset($label_attr['class']) ? $label_attr['class'] : '').' required'); } ?>
<?php if (!$compound) { $label_attr['for'] = $id; } ?>
<?php if (!$label) { $label = $view['form']->humanize($name); } ?>
<label <?php foreach ($label_attr as $k => $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?>><?php echo $view->escape($view['translator']->trans($label, array(), $translation_domain)) ?></label>

<!-- personalización -->
<?php if ($required) : ?>
    <span class="required" title="This field is required">*</span>
<?php endif ?>

Truco

Consulta Tematizando formularios para ver cómo aplicar esta personalización.

Añadiendo mensajes de «ayuda»

También puedes personalizar los elementos gráficos del formulario para que tengan un mensaje de «ayuda» opcional.

En Twig, si estás haciendo la personalización del formulario dentro de la misma plantilla que tu formulario, modifica la etiqueta use y añade lo siguiente:

{% use 'form_div_layout.html.twig' with form_widget_simple as base_form_widget_simple %}

{% block form_widget_simple %}
    {{ block('base_form_widget_simple') }}

    {% if help is defined %}
        <span class="help">{{ help }}</span>
    {% endif %}
{% endblock %}

En Twig, si estás haciendo la personalización del formulario dentro de una plantilla separada, utiliza lo siguiente:

{% extends 'form_div_layout.html.twig' %}

{% block form_widget_simple %}
    {{ parent() }}

    {% if help is defined %}
        <span class="help">{{ help }}</span>
    {% endif %}
{% endblock %}

Cuando usas PHP como motor de plantillas tienes que copiar el contenido desde la plantilla original:

<!-- form_widget_simple.html.php -->

<!-- contenido original -->
<input
    type="<?php echo isset($type) ? $view->escape($type) : 'text' ?>"
    <?php if (!empty($value)): ?>value="<?php echo $view->escape($value) ?>"<?php endif ?>
    <?php echo $view['form']->block($form, 'widget_attributes') ?>
/>

<!-- personalización -->
<?php if (isset($help)) : ?>
    <span class="help"><?php echo $view->escape($help) ?></span>
<?php endif ?>

Para reproducir un mensaje de ayuda debajo de un campo, pásalo en una variable help:

  • Twig
    {{ form_widget(form.title, {'help': 'foobar'}) }}
    
  • PHP
    <?php echo $view['form']->widget($form['title'], array('help' => 'foobar')) ?>
    

Truco

Consulta Tematizando formularios para ver cómo aplicar esta personalización.

Usando variables de formulario

La mayoría de las funciones disponibles para dibujar diferentes partes de un formulario (p. ej. el elemento gráfico del formulario, etiquetas de formulario, elementos gráficos de formulario, etc.) también te permite hacer ciertas personalizaciones directamente. Considera el ejemplo siguiente:

  • Twig
    {# pinta un elemento gráfico, pero añadiéndole la clase "foo" #}
    {{ form_widget(form.name, { 'attr': {'class': 'foo'} }) }}
    
  • PHP
    <!-- pinta un elemento gráfico, pero añadiéndole la clase "foo" -->
    <?php echo $view['form']->widget($form['name'], array(
        'attr' => array(
            'class' => 'foo',
        ),
    )) ?>
    

El arreglo pasado como segundo argumento contiene «variables» de formulario. Para más detalles sobre este concepto en Twig, ve Más sobre variables de formulario.

Bifúrcame en GitHub