Как я могу создать одну форму, которая содержит несколько форм в виде полей, используя collectionType в Symfony 4? - PullRequest
0 голосов
/ 12 октября 2018

Я хочу создать несколько форм на одной странице с одной кнопки отправки с Symfony.Я проверил документацию и увидел, что мне нужно будет сделать форму с полем collectiontype, но я не знаю, как действовать дальше.У меня есть две формы на двух страницах, на первой странице пользователь сообщает, сколько форм будет на следующей странице.Я уже создал свою первую форму и она работает нормально, у меня есть данные первой формы, но теперь, как я могу создать вторую страницу, которая содержит несколько форм в зависимости от поданных данных.Вот моя первая форма:

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

И моя вторая форма (ту, которую я хочу дублировать на моей второй странице):

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

и мой контроллер:

/**
 * @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()
    ]);
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Так что решение было сделать коллекционный тип не в моей форме, а в моем контроллере, поэтому я удалил:

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

`

Затем, когда я хочу создать коллекционный тип моей формыя пишу это в моем контроллере:

        $form = $this->createForm(CollectionType::class, $tickets, ['entry_type' => TicketsType::class] );
0 голосов
/ 13 октября 2018

Вот пример из symfony 3.4, который показывает две разные формы на одной странице с помощью одной кнопки отправки.Обратите внимание, что глава домохозяйства является субъектом-членом, а домохозяйство является субъектом домохозяйства:

    $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',
            )
    );
...