【问题标题】:How can i create one form who contains multiple forms as fields using collectionType in symfony 4?如何使用 symfony 4 中的 collectionType 创建一个包含多个表单作为字段的表单?
【发布时间】:2018-10-12 19:15:34
【问题描述】:

我想用 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()
    ]);
}

【问题讨论】:

  • 您写道:“使用一个提交按钮在一个页面中创建多个表单”。我认为如果只有一个提交按钮,您必须考虑它是一个表单而不是多个表单
  • 看看 craue/form-flow-bundle。它提供您所需要的。
  • 是的,我已经知道我需要创建一个表单,但是这个表单包含多个表单作为字段。 @mblaettermann 好的,我会看看这个谢谢,我会告诉你它是否很好。
  • @mblaettermann 我检查了看起来非常好的 craue 表单流程,但我发现它只需要一个模板来呈现所有表单,但我需要不同的 css 样式表来执行不同的步骤,是否可以这样做用craue形式流?

标签: php symfony symfony-forms


【解决方案1】:

这是一个来自 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',
            )
    );

【讨论】:

  • 我想创建一个包含多个表单的表单而不是创建多个表单。
  • 因此您可能想要编辑您的问题,其中显示“我想在一个页面中创建多个表单,并带有一个提交按钮”。我的回答显示了一个人如何在一个页面上有两个表单,一个提交按钮。从用户的角度来看,该解决方案似乎是一种带有一个提交按钮的表单。
  • 好的,我编辑了我的标题,但是你知道我如何在 symfony 4 中使用集合类型创建多个表单作为字段吗?您可以阅读我的主题以获取更多详细信息。
  • 我建议你从How to Embed a Collection of Forms开始。
  • 在寻求帮助之前,我已经阅读了此文档。我不知道如何在我的两个表单中应用它。
【解决方案2】:

所以解决方案是让 collectiontype 不在我的表单中,而是在我的控制器中,所以我删除了:

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

`

然后,当我想为我的表单创建一个集合类型时,我在我的控制器中写下这个:

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

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多