Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用symfony 4中的collectionType创建一个包含多个表单作为字段的表单?_Php_Symfony_Symfony Forms - Fatal编程技术网

Php 如何使用symfony 4中的collectionType创建一个包含多个表单作为字段的表单?

Php 如何使用symfony 4中的collectionType创建一个包含多个表单作为字段的表单?,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我想用symfony在一个页面上用一个提交按钮创建多个表单。我检查了文档,发现我需要创建一个带有collectiontype字段的表单,但我不知道如何继续。我在两页中有两个表单,第一页用户告诉下一页有多少表单。我已经创建了我的第一个表单,它工作正常,我有第一个表单的数据,但现在我如何创建包含多个表单的第二个页面取决于提交的数据。 这是我的第一张表格: class OrdersType extends AbstractType { public function buildForm(For

我想用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,
    ]);
}
}
以及我的第二张表格(我想在第二页复制的那张):

和我的控制器:

/**
 * @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()
    ]);
}
        $form = $this->createForm(CollectionType::class, $tickets, ['entry_type' => TicketsType::class] );
/**
*@Route(“/”,name=“home”)
*/
公共功能主页(请求$Request,会话界面$session)
{
$Orders=新订单();
$form=$this->createForm(OrdersType::class,$Orders);
$form->handleRequest($request);
如果($form->isSubmitted()){
$formData=$form->getData();
$session->set('orders',$formData);
返回$this->redirectToRoute('ticket');
}
$repo=$this->getdoctor()->getRepository(Tickets::class);
$tickets=$repo->findAll();
返回$this->render('louvre/home.html.twig'[
'form'=>$form->createView()
]);
}
/**
*@Route(“/ticket”,name=“ticket”)
*/
公共功能票证(请求$请求,会话界面$会话)
{
$data=$session->get('orders');
$Orders=新订单()
对于($i=0;$igetNumberOfTickets();$i++){
回声“测试”;
$tickets=新票();;
$form=$this->createForm(OrdersType::class,$Orders);
$form->handleRequest($request);
};
$repo=$this->getdoctor()->getRepository(Tickets::class);
$tickets=$repo->findAll();
返回$this->render('louvre/ticket.html.twig'[
'form'=>$form->createView()
]);
}

下面是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',
            )
    );

因此,解决方案是使collectiontype不在我的表单中,而是在我的控制器中,因此我删除了:

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

然后,当我想为我的表单创建collectiontype时,我在控制器中写下:

/**
 * @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()
    ]);
}
        $form = $this->createForm(CollectionType::class, $tickets, ['entry_type' => TicketsType::class] );

您写道:“使用一个提交按钮在一个页面中创建多个表单”。我想如果只有一个提交按钮,你必须考虑它是一种形式,而不是多个看起来有一个疯狂/形式的流束。是的,我已经知道我需要创建一个表单,但是这个表单包含多个表单作为字段@mblaettermann好的,我会看一看这个谢谢,我会告诉你以后是否好。@mblaettermann我检查了craue表单流,看起来很好,但我发现它只需要一个模板来呈现所有表单,但我需要不同的css样式表来完成不同的步骤,使用craue form flow是否可以做到这一点?我希望创建一个包含多个表单的表单,而不是创建多个表单。因此,您可能希望编辑您的问题,其中会显示“我希望在一个页面中使用一个提交按钮创建多个表单”。我的回答显示了一个人如何在一个页面上有两个表单和一个提交按钮。从用户的角度来看,解决方案似乎是一个表单和一个提交按钮。好的,我编辑了我的标题,但您知道如何使用symfony 4中的集合类型创建多个表单作为字段吗?您可以阅读我的主题以了解更多详细信息。我建议您从开始。在寻求帮助之前,我已经阅读了此文档。我不知道如何将这一点应用到我的两张表格中。