Outils pour utilisateurs

Outils du site


symfony4:formulaires

Formulaires

Création du formulaire

Dans une méthode d'un contrôleur :

use App\Entity\Article;
 
public function create() {
    $article = new Article();
 
    $form = $this->createFormBuilder($article)
                 ->add('title')
                 ->add('content')
                 ->add('image')
                 ->getForm();
 
    return $this->render('articles/create.html.twig', [
        'formArticle' => $form->createView(),
    ]);
}

Si l'on désire forcer l'utilisation de types de champs :

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
...
->add('title', TextType::class)
->add('content', TextareaType::class)

La liste des types disponibles en standard est reprise dans la documentation sur les formulaires : Built-in Field Types

Intégration du formulaire dans un template Twig

Forme la plus simple, mais on n'a aucun contrôle sur le rendu :

{{ form(formArticle) }}

Forme décomposée, permettant de structurer le formulaire comme on veut :

{{ form_start(formArticle) }}
 
<div class="form-group">
    <label for="">Titre</label>
    {{ form_widget(formArticle.title) }}
</div>
 
<div class="form-group">
    <label for="">Contenu</label>
    {{ form_widget(formArticle.content) }}
</div>
 
{{ form_end(formArticle) }}

Note : tous les champs qu'on n'a pas inclus explicitement avec form_widget seront inclus automatiquement à la fin du formulaire.

Avec l'ajout d'attributs et l'utilisation de form_row au lieu de form_widget :

{{ form_start(formArticle) }}
 
{{ form_row(formArticle.title, {
    'attr': {'placeholder': "Titre de l'article"}})
}}
{{ form_row(formArticle.content, {
    'attr': {'placeholder': "Contenu de l'article"}})
}}
 
<button type="submit" class="btn btn-primary">Ajouter l'article</button>
 
{{ form_end(formArticle) }}

Moteur de rendu Bootstrap 4

Doc : https://symfony.com/doc/current/form/bootstrap4.html

Les différents moteurs de rendu de Twig se trouvent dans le dossier vendor/symfony/twig-bridge/Resources/views/Form/

Pour pouvoir utiliser le layout bootstrap_4_layout.html.twig, il faut d'abord le déclarer dans les options de Twig.

Éditer le fichier config/packages/twig.yaml et ajouter cette ligne :

twig:
    form_themes: ['bootstrap_4_layout.html.twig']

Puis ajouter ceci au début du template contenant un formulaire :

{% form_theme formArticle 'bootstrap_4_layout.html.twig' %}
{# remplacer formArticle par le nom du formulaire #}

Ensuite le formulaire peut se résumer à ceci :

    {{ form_start(formArticle) }}
    {{ form_widget(formArticle) }}
    <button type="submit" class="btn btn-primary">Enregistrer</button>
    {{ form_end(formArticle) }}

Le bouton Enregistrer est volontairement ajouté en html, comme cela formArticle peut être utilisé aussi bien dans le cas d'un ajout que d'une modification (avec différents boutons).

Relations dans les formulaires

Exemple avec une relation Category dans l'entité Article :

use App\Entity\Article;
use App\Entity\Category;
 
...
 
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 
...
 
    $form = $this->createFormBuilder($article)
                 ->add('title')
                 ->add('content')
                 ->add('category', EntityType::class, [
                   'class'        => Category::class,
                   'choice_label' => 'title',
                 ])
                 ->add('image')
                 ->getForm();

Et au niveau du template :

{{ form_row(formArticle.category) }}
symfony4/formulaires.txt · Dernière modification: 2019/08/08 05:58 (modification externe)