如何在 symfony 项目的同一个控制器中使用 2 个表单?

问题描述 投票:0回答:2

我想在我的 symfony 项目的同一个控制器“new_data”中使用 2 种形式,一种是主要形式,另一种是次要形式。我想在提交二级表格时留在同一页面上。主表单应重定向到索引页面,但辅助表单应在列表中添加数据,该列表仅在用户提交第一个表单时才提交。

我已经改变了指令:重定向....到评论。因此结果是一条错误消息,因为未提交表单。

这样做的目的是辅助表单在列表中添加数据,当用户准备好时,他通过提交主要表单来验证过程。

如果有人能帮助我,我将不胜感激。

这是我的控制器的代码:

public function new(Request $request, ArmyRepository $armyRepository, RegionRepository $regionRepository, NotificationRepository $notificationRepository): Response
{
    $army = new Army();
    $form = $this->createForm(ArmyType::class, $army);
    $form->handleRequest($request);
    $form2 = $this->createForm(SelectCUType::class, $army);
    $form2->handleRequest($request);
    $notifmenu = $notificationRepository->findBy(['statut'=>'non lu','addressee'=>$this->getUser()]);
    $regions = $regionRepository->findAll();
    $user = $this->getUser();

    if ($form->isSubmitted() && $form->isValid()) {
        $armyRepository->add($army, true);

        return $this->redirectToRoute('app_army_index', [], Response::HTTP_SEE_OTHER);
    }
    if ($form2->isSubmitted() && $form->isValid()) {
        $armyRepository->add($army, true);

        //return $this->redirectToRoute('app_army_index', [], Response::HTTP_SEE_OTHER);
    }

    return $this->renderForm('army/new.html.twig', [
        'army' => $army,
        'form2' => $form2,
        'form' => $form,
        'regions' => $regions,
        'user' => $user,
        'notifmenu'=>$notifmenu,
    ]);
}   
symfony controller symfony-forms
2个回答
0
投票

当您处理次要形式时,不再在新函数中找到主要形式,因为该项目是由次要形式创建的,或者可以说它需要创建

您可以在表单类型(和 twig 文件)中实现一个按钮来调用辅助控制器上的 new() 函数。这个过程应该是创建主要项目,因此您可以将次要项目添加到主要项目并在创建次要内容后重定向到主要项目的 edit() 函数,但您需要填写占位符等所需的数据列你的主要项目

// src/Controller/PrimaryController.php
public function new(Request $request, ArmyRepository $armyRepository, RegionRepository $regionRepository, NotificationRepository $notificationRepository): Response
{
    $army = new Army();
    $form = $this->createForm(ArmyType::class, $army);
    $form->handleRequest($request);
    $notifmenu = $notificationRepository->findBy(['statut'=>'non lu','addressee'=>$this->getUser()]);
    $regions = $regionRepository->findAll();
    $user = $this->getUser();

    if ($form->isSubmitted() && $form->isValid()) {
        $armyRepository->add($army, true);
        
        // new secondary item
        /** @var SubmitType $btnAddSecondaryStuff */
        $btnAddSecondaryStuff = $form->get('secondary_stuff_add_btn');

        if ($btnAddSecondaryStuff->isClicked()) {
            return $this->redirectToRoute('secondary_stuff_add_route', ['id' => $army->getId()], Response::HTTP_SEE_OTHER);
        }

        return $this->redirectToRoute('app_army_index', [], Response::HTTP_SEE_OTHER);
    }

    return $this->renderForm('army/new.html.twig', [
        'army' => $army,
        'form' => $form,
        'regions' => $regions,
        'user' => $user,
        'notifmenu'=>$notifmenu,
    ]);
}

也将添加按钮添加到编辑功能

// src/Controller/PrimaryController.php
public function edit(Request $request, Army $army, ArmyRepository $armyRepository, RegionRepository $regionRepository, NotificationRepository $notificationRepository): Response
{
    $form = $this->createForm(ArmyType::class, $army);
    $form->handleRequest($request);
    $notifmenu = $notificationRepository->findBy(['statut'=>'non lu','addressee'=>$this->getUser()]);
    $regions = $regionRepository->findAll();
    $user = $this->getUser();

    if ($form->isSubmitted() && $form->isValid()) {
        $armyRepository->add($army, true);

        // new secondary item
        /** @var SubmitType $btnAddSecondaryStuff */
        $btnAddSecondaryStuff = $form->get('secondary_stuff_add_btn');

        if ($btnAddSecondaryStuff->isClicked()) {
            return $this->redirectToRoute('secondary_stuff_add_route', ['id' => $army->getId()], Response::HTTP_SEE_OTHER);
        }

        // regular save
        return $this->redirectToRoute('app_army_index', [], Response::HTTP_SEE_OTHER);
    }

    $secondaryItems = $army->getSecondaryItems();

    return $this->renderForm('army/edit.html.twig', [
        'army' => $army,
        'secondary_items' => $secondaryItems,
        'form' => $form,
        'regions' => $regions,
        'user' => $user,
        'notifmenu'=>$notifmenu,
    ]);
}

在您的表单类型中,您需要添加添加按钮

// src/Form/PrimaryFormType.php
public function buildForm(FormBuilderInterface $builder, array $options): void
{
    $builder
        ...
        ->add('secondary_stuff_add_btn', SubmitType::class, [
            'label' => 'add secondary item',
        ])
    ;
}

在你的树枝文件中,你可以删除现有次要项目的列表并添加添加按钮

// templates/army/_form.html.twig
{{ form_row(form.secondary_stuff_add_btn) }}

0
投票

我不得不在我的控制器中提交更改。 当我测试它时,我有这个错误信息:

路由“app_army_edit”的参数“id”必须匹配“[^/]++”(给定的“”)才能生成相应的URL。

涉及这部分代码:

return $this->redirectToRoute('app_army_edit', ['id' => $army->getId()], Response::HTTP_SEE_OTHER);

但这对我来说似乎是正确的。 拜托,你能告诉我哪里出了问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.