Symfony 4多重表单循环Twig提交

3

我需要将每个div转化为一个表单。我已经完成了这个任务,但是当我提交其中一个表单时,所有表单都被提交了。


我的控制器向twig模板发送了一组表单数组。

首先,我实例化了所有的表单:

$forms = [];
foreach ($data as $index => $something)
{
            // create form
            $formData = new FormData($data);   
            $forms[$index] = $this->createForm(MyForm::class, $formData);
}                                                                                                                                                                                                                        

完成后,我遍历表单以处理提交:
foreach ($forms as $form)                                                                    
{
    $form->handleRequest($request);                                                          
    if ($form->isSubmitted())
    {                                                              
        if ($form->isValid())                                                                
        {
                // I do stuff
        }
    }
}

我认为问题出在上面的代码:我执行了“//我做一些事情”的代码,而不是只针对一个生成的表单。每个表单都被提交了,而不仅仅是点击的那一个。
然后,我渲染这些表单:
foreach ($forms as &$form)                                                                   
{                                                                                            
    $form = $form->createView();                                                             
}

并将它们发送到我从控制器呈现的twig模板中:
// render template                                                                           
return $this->render('prestations.html.twig', array(                                         
    'forms' => $forms,                                                                       
    'error' => $error                                                                        
));

在twig模板中,我循环遍历表单:

{% for stuff in stuffs %}
<div>
    <p>{{ loop.index0 }}</p>                                                                 
    {{ form_start(forms[loop.index0]) }}                                                     
    {{ form_widget(forms[loop.index0]) }}                                                    
    {{ form_end(forms[loop.index0]) }}
</div>      
{% endfor %}

这个表单包含一个输入框和一个提交按钮。

如何让提交按钮只提交一个表单而不是所有表单?


如果您检查代码,您的表单中HTML名称是否不同? - goto
1
@goto 不行,所有表单都有相同的名称属性。有没有办法为每个表单生成不同的名称属性? - NanoPish
1个回答

6
当您提交表单时,如果它们具有相同的HTML名称属性,则所有表单都会被修改。
为了区分您的表单,您需要以不同的名称命名您的表单,以便获得类似以下的内容:
form1_[input]
[...]
form1_[submit]


form2_[input]
[...]
form2_[submit]

您可以像这样创建一个任意名称的表单:

您可以创建一个任意名称的表单,如下所示

$forms[$index] = $this->container
    ->get('form.factory')
    ->createNamed('form' . $index, MyForm::class, $formData);

这与助手 $this->createForm(MyForm::class, $formData); 几乎一样,只是第一个参数是自定义表单名称。


谢谢,但是我如何在 getBlockPrefix() 中生成不同的前缀? - NanoPish
@NanoPish,不用管BlockPrefix了,我找到了我要找的方法:] 如果可以的话,请告诉我它是否有效,因为我无法测试。 - goto
完全可行!而且它是一种很好的语法糖。谢谢 :) - NanoPish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接