====== Formulaire avec bouton Annuler ====== Doc: [[https://symfony.com/doc/current/form/multiple_buttons.html]] ===== Formulaire ===== Un formulaire d'édition d'article avec deux boutons : ''Enregistrer'' et ''Annuler''. ^ IMPORTANT | Le bouton "Annuler" a l'attribut ''formnovalidate'' afin que le navigateur ne tente pas de valider un formulaire non rempli. | class ArticleTpe extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('reference', StringType::class) ->add('denomination', StringType::class) ->add('couleur', StringType::class) // Bouton "Enregistrer" ->add('save', SubmitType::class, [ 'label' => 'Enregistrer', 'attr' => [ 'class' => 'btn btn-primary' ] ]) // Bouton "Annuler" ->add('cancel', SubmitType::class, [ 'label' => 'Annuler', 'attr' => [ 'class' => 'btn btn-secondary' 'formnovalidate' => 'formnovalidate' ] ]) ; ] } ===== Template ===== {{ form_start(form) }} {{ form_row(form.reference) }} {{ form_row(form.denomination) }} {{ form_row(form.couleur) }} {{ form_widget(form.save) }} {{ form_widget(form.cancel) }} {{ form_end(form) }} ===== Contrôleur ===== Dans le formulaire, agir de façon différente selon le bouton qui a été cliqué : // Le formulaire a-t-il été soumis ? if($form->isSubmitted()) { // L'utilisateur a-t-il cliqué sur "Enregistrer" ? if($form->get('save')->isClicked()) { // Les données du formulaire sont-elles valides ? if($form->isValid()) { // On enregistre l'article $manager->persist($article); $manager->flush(); // ENREGISTREMENT EFFECTUÉ // On redirige vers la liste d'articles return $this->redirectToRoute('liste_articles'); } } // L'utilisateur a-t-il cliqué sur "Annuler" ? else { // ENREGISTREMENT ANNULÉ // On redirige vers la liste d'articles return $this->redirectToRoute('liste_articles'); } } // FORMULAIRE PAS ENCORE SOUMIS // On affiche simplement la vue contenant le formulaire return $this->render(edit.html.twig', [ 'form' => $form->createView() ]);