Archives mensuelles : mars 2026

Symfony : Conserver les données d’un multi step form après au clic sur un bouton précédent

La version 7.4 de symfony propose un nouveau compposant, le « Multi-Step Forms ».
Pour configurer la navigation dans celui-ci vous devez créer une classe qui gère le fonctionnement des bouton et l’indiquer sur votre formulaire principal

$builder->add('navigator', MySecoursNavigatorType::class);

Par défaut le clic sur le bouton précédent, écrase les valeurs de l’étape en cours, ce qui à pour conséquence que si vous êtes à l’étape 4 et que vous revenez à l’étape 1 en cliquant sur précédent à multiple reprise, tous les données des étapes 2,3 et 4 seront effacés. L’astuce est de modifier la configuration par défaut du bouton précédent en passant « ‘clear_submission’ => false ». Cela aura aussi pour effet de soumettre l’étape courante, vous pouvez éventuellement ajouter l’option « ‘validation_groups’ => false, » si la validation de cette étape ne vous intéresse pas lors du clic sur précédent, elle sera a nouveau faite par la suite lors du clic sur le bouton suivant.

<?php

namespace App\Form\MultiStep;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Flow\FormFlowCursor;
use Symfony\Component\Form\Flow\Type\FinishFlowType;
use Symfony\Component\Form\Flow\Type\NextFlowType;
use Symfony\Component\Form\Flow\Type\PreviousFlowType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyNavigatorType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('previous', PreviousFlowType::class, [
                'label' => 'Précédent',
                'include_if' => fn (FormFlowCursor $cursor) => !$cursor->isFirstStep(),
                'clear_submission' => false,
                'validation_groups' => false,
            ])
            ->add('next', NextFlowType::class, [
                'label' => 'Suivant',
                'include_if' => fn (FormFlowCursor $cursor) => !$cursor->isLastStep(),
            ])
            ->add('finish', FinishFlowType::class, [
                'label' => 'Valider',
                'include_if' => fn (FormFlowCursor $cursor) => $cursor->isLastStep(),
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'label' => false,
            'mapped' => false,
        ]);
    }
}