[ Symfony 2 ] Enlever les labels des formulaires

J’utilise Foundation avec Symfony 2.0, je voulais faire des beaux formulaires, des « nice form » avec « inline label ». Evidemment si on laisse le label au dessus c’est moche…. Pour les petits formulaires on peut le faire en passant par le fichier Twig, mais si on pouvait gérer ça dans le buildForm directement ça serait parfait…

J’ai trouvé une très grande partie de la solution sur le groupe Google de Symfony 2, elle a été donnée par Martin Schnabel, mais pas expliquée.

Voici donc ce que vous devez faire :

Créer le fichier : Foo\BarBundle\Form\Extension\LabelFormTypeExtension.php et mettre ceci dedans :

namespace Foo\BarBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
class LabelFormTypeExtension extends AbstractTypeExtension {

    public function buildForm(FormBuilder $builder, array $options) {
        if (array_key_exists('label', $options) && $options['label'] === false) {
            $builder->setAttribute('label', false);
        }
    }

    public function getExtendedType() {
        return 'field';
    }
}

Ensuite il faut ajouter dans le fichier Foo\BarBundle\Resources\config\services.yml sous services:

foo_bar.form.label_extension:
class: Foo\BarBundle\Form\Extension\LabelFormTypeExtension
tags:
- { name: form.type_extension, alias: field }

Après ajouter le fichier Foo\BarBundle\Resources\views\Form\fields.html.twig

{% block generic_label %}
    {% spaceless %}
    {% if label is not sameas(false) %}
        {% if required %}
            {% set attr = attr|merge({'class': attr.class|default('') ~ 'required'}) %}
        {% endif %}
        <label for="">{{ label|trans }}</label>
    {% endif %}
    {% endspaceless %}
{% endblock %}

Dans le fichier Foo\BarBundle\Form\entiteForm.php, il suffit de définir le label à false

................
public function buildForm(FormBuilder $builder, array $options) {
    $builder->add('champ', 'text', array (
        'attr' => array(
             'placeholder' => 'Champ',
             'class' => "input-text"
         ),
        'label' => false
    )
)
................

Enfin pour que ça fonctionne, il faut dire au formulaire de se servir de fields.html.twig

Dans votre twig qui affiche le formulaire, juste avant il faut insérer une ligne

{% form_theme form 'foobarBundle:Form:fields.html.twig' %}
{{ form_widget(form) }}

Le tour est joué !