2 votes

Comment puis-je créer un formulaire qui contient plusieurs formulaires comme champs en utilisant collectionType dans symfony 4 ?

Je veux créer plusieurs formulaires dans une page avec un seul bouton de soumission avec Symfony. J'ai consulté la documentation et j'ai vu que je devais créer un formulaire avec un champ de type collection mais je ne sais pas comment procéder. J'ai deux formulaires dans deux pages, la première page l'utilisateur dit combien de formulaires la page suivante aura. J'ai déjà créé mon premier formulaire et il fonctionne bien, j'ai les données du premier formulaire mais maintenant comment puis-je créer la deuxième page qui contient plusieurs formulaires en fonction des données soumises. Voici mon premier formulaire :

class OrdersType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add ('tickets', CollectionType::class, [
                'entry_type' => TicketsType::class,
                'allow_add' => true
            ])
            ->add('numberOfTickets', ChoiceType::class, [
                'attr' => [
                    'class' => 'form-control'
                ],
                'choices' => [
                    '1' => 1,
                    '2' => 2,
                    '3' => 3,
                    '4' => 4,
                    '5' => 5,
                ]
            ])
            ->add('date', DateType::class, [
                'attr' => [
                    'class' => 'form-control'
                ],
                'widget' => 'single_text'
            ])
            ->add('type', ChoiceTYpe::class, [
            'attr' => [
            'class' => 'form-control'
            ],
            'choices' => [
            'Journée' => 1,
            'Demi-journée(à partir de 14 heures)' => 0,
        ]
    ])
        ;
    }

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Orders::class,
    ]);
}
}

Et mon deuxième formulaire (celui que je veux dupliquer dans ma deuxième page) :

class TicketsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('category', CheckboxType::class, [
                'attr' => [
                    'class' => 'form-control'
                ]
            ])
            ->add('firstname', TextType::class, [
                'attr' => [
                    'class' => 'form-control'
                ]
            ])
            ->add('lastname', TextType::class, [
                'attr' => [
                    'class' => 'form-control'
                ]
            ])
            ->add('country', TextType::class, [
                'attr' => [
                    'class' => 'form-control'
                ]
            ])
            ->add('dateOfBirth', DateType::class, [
                'attr' => [
                    'class' => 'form-control'
                ],
                'widget' => 'single_text'
            ])
        ;
    }

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Tickets::class,
    ]);
}
}

et mon contrôleur :

/**
 * @Route("/", name="home")
 */
public function home(Request $request, SessionInterface $session)
{
    $Orders = new Orders();
    $form = $this->createForm(OrdersType::class, $Orders);
    $form->handleRequest($request);
    if($form->isSubmitted()){
        $formData = $form->getData();
        $session->set('orders', $formData);
        return $this->redirectToRoute('ticket');
        }

    $repo = $this->getDoctrine()->getRepository(Tickets::class);
    $tickets = $repo->findAll();
    return $this->render('louvre/home.html.twig', [
        'form' => $form->createView()
    ]);

}

/**
 * @Route("/ticket", name="ticket")
 */
public function ticket(Request $request, SessionInterface $session)
{
    $data = $session->get('orders');
    $Orders = new Orders()
    for ($i=0; $i<$data->getNumberOfTickets() ;$i++){
    echo 'test';
    $tickets = new Tickets();;
    $form = $this->createForm(OrdersType::class, $Orders);
    $form->handleRequest($request);
    };
    $repo = $this->getDoctrine()->getRepository(Tickets::class);
    $tickets = $repo->findAll();
    return $this->render('louvre/ticket.html.twig', [
        'form' => $form->createView()
    ]);
}

0voto

geoB Points 2950

Voici un exemple tiré de symfony 3.4 qui montre deux formulaires différents sur la même page avec un seul bouton d'envoi. Notez que le chef de famille est une entité Membre et que le foyer est une entité Ménage :

    $form = $this->createForm(HouseholdType::class, $household);
    $formHead = $this->createForm(MemberType::class, $head);
    $form->handleRequest($request);
    $formHead->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid() && $formHead->isSubmitted() && $formHead->isValid()) {
        //relevant logic 
    }

    return $this->render(
            'Household/new.html.twig',
            array(
                'formType' => 'New Household',
                'form' => $form->createView(),
                'formHead' => $formHead->createView(),
                'title' => 'New Household',
            )
    );

0voto

mohasalim Points 47

Donc la solution était de faire la collectiontype non pas dans mon formulaire mais dans mon contrôleur, donc j'ai supprimé :

 `->add ('tickets', CollectionType::class, [
                'entry_type' => TicketsType::class,
                'allow_add' => true
            ])

`

Ensuite, lorsque je veux créer un type de collection pour mon formulaire, j'écris ceci dans mon contrôleur :

        $form = $this->createForm(CollectionType::class, $tickets, ['entry_type' => TicketsType::class] );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X