web-dev-qa-db-fra.com

Comment masquer des étiquettes dans une classe de formulaire dans symfony2?

Je sais que vous pouvez diviser un formulaire en twig et choisir de ne pas rendre l'étiquette pour un champ particulier, mais je ne peux m'empêcher de penser que vous devez pouvoir le faire à partir du classe de formulaire. La clé 'label' dans le tableau d'options vous permet de changer cette valeur en ce que vous voulez, mais en passant false ou une chaîne vide renvoie simplement le nom du champ (voir les exemples ci-dessous où 'rôles' est rendu comme étiquette).

$builder
            ->add('roles', 'entity', array(
                'class' => 'Acme\UserBundle\Entity\Role',
                'label' => '' 
            ));

$builder
            ->add('roles', 'entity', array(
                'class' => 'Acme\UserBundle\Entity\Role',
                'label' => false 
            ));

Étrangement, le passage d'un espace vide (qui semble très sale) semble rendre une étiquette complètement vide, sans espace même lors de la visualisation de la source. Quelqu'un peut-il nous éclairer sur la meilleure approche, ou même pourquoi l'espace vide semble fonctionner?

40
Mark

Depuis Symfony 2.2, vous pouvez éviter le <label> rendu utilisant la valeur false pour l'attribut label:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('Name', null, array('label' => false))
    ;
}

Source

95
cheesemacfly

Gardez vos spécifications 'View' distinctes de votre 'Model'

Si vous suivez la réponse acceptée qui dit:

$builder
        ->add('Name', null, array('label' => false))
    ;

votre formulaire n'est pas aussi réutilisable. Surtout si votre formulaire apparaît dans plusieurs endroits (ou pourrait à l'avenir).

Si vous ne voulez pas rendre l'étiquette du formulaire, il est préférable de le faire dans Twig (en supposant que vous utilisez Twig).

au lieu de rendre {{ form_row(form.name) }}, restituez chaque élément séparément et excluez le form_label

ex.

{{ form_errors(form.name) }}
 {# {{ form_label(form.name) }} <-- just dont include this #} 
{{ form_widget(form.name) }}

Si vous vouliez plus tard l'étiquette dans une instance du formulaire mais pas dans l'autre, il suffirait simplement d'ajouter {{ form_label(form.name) }}; Où changer array('label' => true) activerait l'étiquette partout

Si vous effectuez le rendu de votre formulaire avec le liner {{ form(form) }} alors vous devriez jeter un œil aux symfony docs

15
Chris

Ajoutez simplement {'label': false} à votre form_row ()

{{ form_row(form.name, {'label':false}) }}
4
PrestonDocks

Pour masquer mon étiquette, je devais restituer uniquement le widget pour le champ, et non l'étiquette, par ex.

{{ form_widget(edit_form.event) }}
{{ form_rest(edit_form) }}

Le problème avec l'étiquette '' avec un espace dedans, c'est qu'elle rend toujours l'entrée html qui est là et affecte la page.

3
jmoz

cela devrait fonctionner (bien que ce ne soit pas une solution très propre)

$builder
        ->add('roles', 'entity', array(
            'class' => 'Acme\UserBundle\Entity\Role',
            'label' => ' ' 
        ));

(notez l'espace entre les tiques)

2
philipphoffmann

Je ne comprends pas très bien votre question mais sous forme pour montrer le nom du label, personnellement j'aime ça:

  $builder
        ->add('role', 'text')

dans mon twig:

    <tr>
        <td>{{ form_widget(form.role) }} </td>
        <td>{{ form_label(form.role, "Name of Label") }}</td>
    </tr>
    <tr>
        <td>{{ form_errors(form.role) }}</td>
    </tr>
2
Nll