====== 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 : [[https://symfony.com/doc/current/forms.html#built-in-field-types|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) }}
{{ form_widget(formArticle.title) }}
{{ form_widget(formArticle.content) }}
{{ 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"}}) }} {{ 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) }} {{ 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) }}