【问题标题】:How to integrate more than one form in one controller -> error at submit - Symfony 4.*如何在一个控制器中集成多个表单->提交时出错-Symfony 4.*
【发布时间】:2019-06-21 12:13:59
【问题描述】:

我想知道如何在一个控制器中放置多个表单? 我这样做了,请参见下面的代码,在我的控制器中包含 2 个表单; 1加一匹马,1加一组马:

  /*Add a horse*/
  $cheval = new Chevaux();
    $cheval->setParticulier($user->getParticulier());

    $formAddHorse = $this->createFormBuilder($cheval)
         ->add('nom_cheval', TextType::class)
        ->add('save', SubmitType::class, array('label' => 'Ajouter'))
        ->getForm();
        $formAddHorse->handleRequest($request);

    if ($formAddHorse->isSubmitted() && $formAddHorse->isValid()) {
        $cheval = $formAddHorse->getData();
        $em = $this->getDoctrine()->getManager();
        $em->persist($cheval);
        $em->flush();

        return $this->redirectToRoute('app_acc');
    }


    /*add a group of horses*/
    $team=new Team();
    $team->setUser($user->getParticulier());

    $formAddTeam = $this->createFormBuilder($team)
      ->add('profession', EntityType::class, array(
        'class' => Profession::class,
        'choice_label' => 'nom_prof',
        'expanded' => true))
        ->add('save', SubmitType::class, array('label' => 'Nouvelle Team'))
        ->getForm();

    $formAddTeam->handleRequest($request);


    if ($formAddTeam->isSubmitted() && $formAddTeam->isValid()) {
        $team = $formAddTeam->getData();
        $em = $this->getDoctrine()->getManager();
        /*
        * Traitement des données
        */
        return $this->redirectToRoute('app_acc');
    }

在模板中:

<h2> -------Add a horse------ </h2>
{{ form_start(formHorse) }}
{{ form_widget(formHorse) }}
{{ form_end(formHorse) }}
<h2> ------------------------------ </h2>

<h2> -------Add team------ </h2>
{{ form_start(formTeam) }}
{{ form_widget(formTeam) }}
{{ form_end(formTeam) }}
<h2> ------------------------------ </h2>

但是,当我提交其中一个表单时,似乎两者都已发送。所以它抛出错误:

此表单不应包含额外字段

以我没有提交的形式。 数据已正确发送到数据库中,但错误在这里并告诉我我做错了什么。我该如何以正确的方式做到这一点?

【问题讨论】:

  • 你想通过向一个控制器添加 2 个表单来完成什么?
  • 我想让用户可以在一个页面(他们的帐户页面)中同时进行(添加一匹马和一组马)这避免了他们必须转到另一个页面专门为每种形式制作。我很好地回答了你的问题 Lunin Roman 吗?
  • @Marilou 只保留一个组马表单处理程序不是更好吗,以便用户可以通过它提交一匹或多匹马?
  • 我认为@BenjaminKozlowski 已经回答了我的问题,我今晚必须更深入地尝试,但它似乎有效!非常感谢本杰明!

标签: forms symfony controller symfony-forms


【解决方案1】:

我曾经遇到过这样的情况,我就是这样做的:

$form = $this->createForm(ProfileForm::class, $user);
$formPassword = $this->createForm(ChangePasswordForm::class, $user);
$form->handleRequest($request);
$formPassword->handleRequest($request);

if ($form->isSubmitted()) {
    if ($form->isValid()) {
        // My code to save some things...
    }
}

if ($formPassword->isSubmitted()) {
    if ($formPassword->isValid()) {
        // My code to save some things...
    }
}

它对我有用,但乍一看,它似乎就像你所做的那样。

也许这是您在模板中处理它的方式?

【讨论】:

  • 我试过了,但它对我的情况也不起作用,奇怪的是它对你有用而不是对我有用。我添加了模板的代码,你觉得呢?
  • 当您使用form_widget 时,它应该会生成它就好了。我看到的唯一区别是我没有使用SubmitType 类,我添加了一个input“手动”。我将在我的应用程序中使用SubmitType 进行一些测试以更改它,看看是否会改变一些东西。
  • 是的,我刚刚尝试更改表单类中字段的“手动”提交按钮,但我遇到了完全相同的问题。我想这似乎是 symfony 的一个错误,你应该在 symfony github 的 repo 中报告一个错误(尽可能多地提供细节)。你可以像我一样在你的form_end 前面加上一个input
【解决方案2】:

您正在寻找可以像这样使用的allow_extra_fields 选项。

$formBuilder = $this->createFormBuilder($team, array('allow_extra_fields' =>true))...

或者喜欢FormType

public function setDefaultOptions(OptionsResolver $resolver)
{
        $resolver->setDefaults(
        array(
            'allow_extra_fields' => true
        )
    );
}

option 允许您提交一些额外的数据,这些数据未在表单构建器中指定。正如官方文档所说

通常,如果您提交未在您的 表单,你会得到一个“这个表单不应该包含额外的字段”。 验证错误。

您可以通过启用 表单上的 allow_extra_fields 选项。

【讨论】:

  • 很抱歉它不起作用,我想说问题最严重,因为它会处理所有表单,甚至是我没有提交的表单,所以 symfony 尝试将空数据放入我没有提交的表单的数据库...它删除了初始错误(此表单包含额外的字段)但不是问题..
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多