====== 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()
]);