Comment définir l'attribut HTML
class
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
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
Vous pouvez le faire avec FormBuilder. Ajoutez ceci au tableau dans votre FormBuilder:
'attr'=> array('class'=>'span2')
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-
.
{{ form_widget(form.content, { 'attr': {'class': 'tinyMCE', 'data-theme': 'advanced'} }) }}
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'
)
));
}
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'
]
]);
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.