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
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.
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,
]);
}
}