web-dev-qa-db-fra.com

Comment définir un attribut de classe sur une entrée de formulaire Symfony2

Comment définir l'attribut HTMLclass sur un formulaire <input> à l'aide de FormBuilder dans Symfony2?

Quelque chose comme ça:

->add('birthdate', 'date',array(
      'input' => 'datetime',
      'widget' => 'single_text',
      'attr' => array(
          'class' => 'calendar'
      )
 ))

 {{ form_widget(form.birthdate) }}

Je veux ce champ input avec l'attribut class défini surcalendar

58
Jean-Philippe Bond

Vous pouvez le faire à partir du modèle de brindille:

{{ form_widget(form.birthdate, { 'attr': {'class': 'calendar'} }) }}

De http://symfony.com/doc/current/book/forms.html#rendering-each-field-by-hand

115
Problematic

Vous pouvez le faire avec FormBuilder. Ajoutez ceci au tableau dans votre FormBuilder:

'attr'=> array('class'=>'span2')
110
Acyra

La réponse d'Acyra est la bonne solution si vous souhaitez définir des attributs dans le contrôleur, mais comporte de nombreuses inexactitudes.

Oui, vous pouvez le faire directement avec FormBuilder en utilisant l'attribut attr (introduit ici pour la version 2.1 et ici pour le 2.0 ) dans le tableau d'options comme suit:

->add('birthdate', 'date',array(
      'input' => 'datetime',
      'widget' => 'single_text',
      'attr' => array('class'=>'calendar')
 ))

Ce n'est pas vrai que la "fonctionnalité est cassée". Il fonctionne très bien!

Il n’est pas vrai que Symfony2 applique l’attribut HTML class à la fois à l’étiquette et à l’entrée (au moins à partir de la version 2.1).

De plus, l'attribut attr étant un tableau, vous pouvez transmettre tout attribut HTML que vous souhaitez afficher pour le champ. Il est très utile de transmettre les attributs HTML5 data-.

27
JeanValjean
{{ form_widget(form.content, { 'attr': {'class': 'tinyMCE', 'data-theme': 'advanced'} })  }}
4
Kiran

Vous pouvez l'ajouter aux options de votre classe de formulaire:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\MyEntity',
        'attr' => array(
            'class' => 'form-horizontal'
        )
    ));
}
4
segli

Comme ça: 

{{ form_widget(form.description, { 'attr': {'class': 'form-control', 'rows': '5', 'style': 'resize:none;'} }) }}

Vous pouvez le faire dans Twig ou dans FormClass, comme indiqué dans les exemples ci-dessus. Mais vous voudrez peut-être décider dans le contrôleur quelle classe votre formulaire doit obtenir. Gardez juste à l'esprit de ne pas avoir beaucoup de logique dans le contrôleur en général!

    $form = $this->createForm(ContactForm::class, null, [
        'attr' => [
            'class' => 'my_contact_form'
        ]
    ]);
0
Kim

Rend le widget HTML d'un champ donné. Si vous appliquez cela à un formulaire entier ou à une collection de champs, chaque ligne de formulaire sous-jacente sera rendue.

{# render a field row, but display a label with text "foo" #} {{ form_row(form.name, {'label': 'foo'}) }}

Le second argument de form_row () est un tableau de variables. Les modèles fournis dans Symfony permettent uniquement de remplacer l'étiquette, comme indiqué dans l'exemple ci-dessus.

Voir "En savoir plus sur les variables de formulaire" pour en savoir plus sur l'argument des variables.

0
Javier Morillo