Symfony2:同一页面中的两个表单

sca*_*amp 20 php forms symfony

我在同一页面上有两个表单.

我的问题是当我尝试提交表单时,就像它尝试在页面中提交下面的第二个表单一样.

如下,你可以找到我的2个表格:

public function createSuiviForm() {

    return $form = $this->createFormBuilder(null)
            ->add('numero', 'text', array('label' => 'N° : ',
                'constraints' => array(
                    new Assert\NotBlank(array('message' => 'XXXX')),
                    new Assert\Length(array('min' => 19, 'max' => 19, 'exactMessage' => 'XXX {{ limit }} XXX')))))
            ->add('xxxx', 'submit')
            ->getForm();
}

public function createModificationForm() {

    return $form = $this->createFormBuilder(null)
            ->add('modification', 'submit', array('label' => 'XXXXXXXXXXXXXXXXXXXX'))
            ->getForm();
}
Run Code Online (Sandbox Code Playgroud)

我的第二个表单只是一个提交按钮.

我将它们传递给我的渲染并使用以下方式显示它们:

<div class="well">
    <form method="post" action='' {{form_enctype(form)}} >
        {{ form_widget(form) }}
        <input type="submit" class="btn btn-primary"/>
    </form>
    <div class='errors'>
        {{ form_errors(form) }}
     </div>
</div>
Run Code Online (Sandbox Code Playgroud)

'form'是我的变量到第一个表单的名称,'update'是我的第二个表单.

当我试图提交我的第二张表格时,我需要点击两次,最后我得到:

"This form should not contain extra fields."
And all non valid input for the remainding form.
Run Code Online (Sandbox Code Playgroud)

我试图将validation_group添加到false但无效.

我不明白为什么我收到此错误,因为我的表单根本没有嵌入

我希望你能理解......

Mic*_*ick 24

您必须单独处理表单:

if('POST' === $request->getMethod()) {

    if ($request->request->has('form1name')) {
        // handle the first form  
    }

    if ($request->request->has('form2name')) {
        // handle the second form  
    }
}
Run Code Online (Sandbox Code Playgroud)

这在Symfony2多种形式:与嵌入式表格不同中得到了很好的解释


tot*_*tas 11

这在Symfony 3中为我做了伎俩(也应该适用于Symfony 2):

$form1 = $this->createForm(
    MyFirstFormType::class
);

$form2 = $this->createForm(
    MySecondFormType::class
);

if ($request->isMethod('POST')) {

    $form1->handleRequest($request);
    $form2->handleRequest($request);

    if ($form1->isSubmitted()) {
        // Handle $form1
    } else if ($form2->isSubmitted()) {
        // Handle $form2
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 它也适用于没有检查方法对我:) (4认同)

Mae*_*lyn 8

问题是你有两个无名表单(输入名称inputname代替formname[inputname],而且当你将请求绑定到表单并且它被验证时它会检测到一些额外的字段(另一个表单),因此它是无效的.

短期解决方案是通过表单工厂创建一个命名构建器,而不是:

$form = $this->createFormBuilder(null)
Run Code Online (Sandbox Code Playgroud)

你应该使用:

$form = $this->get("form.factory")->createNamedBuilder("my_form_name")
Run Code Online (Sandbox Code Playgroud)

长期解决方案是创建自己的表单类,这样您就可以将表单代码与控制器分开.