Forms Symfony2表单之间的交互,验证失败时出现问题

Forms Symfony2表单之间的交互,验证失败时出现问题,forms,validation,symfony,Forms,Validation,Symfony,我有两个表格,显示以下内容: 它们是动态创建的,而不是从实体创建的 我的控制器如下所示: <?php ...create the relevant array $rolesListForForm $form = $this->createFormBuilder()->getForm(); //create empty form $HRsInThisProject = $em->getRepository('AppBundle:User')->findUsers

我有两个表格,显示以下内容:

它们是动态创建的,而不是从实体创建的

我的控制器如下所示:

<?php
...create the relevant array $rolesListForForm 
$form = $this->createFormBuilder()->getForm(); //create empty form

$HRsInThisProject = $em->getRepository('AppBundle:User')->findUsersByProject($prj);

foreach ($HRsInThisProject as $key => $HR)
    {
    $form->add('roleOf_'.$key, 'choice', array('choices'   => $rolesListForForm, 'required'  => true, 'data' => $HR['role'], 'label' => false, ));
    $form->add('isActive_'.$key, 'choice', array('choices'   => [0 => 'Inactive', 1 => 'Active'] , 'required'  => true, 'data' => $HR['is_active'], 'label' => false, ));
    }

...create the relevant array $HRsInMyDomainForForm 

$form->add('showinactive', 'checkbox', array('label' => 'Show inactive users', 'required'  => false, 'data' => true, ));
$form->add('HRid', 'choice', array('choices' => $HRsInMyDomainForForm,'required' => false, 'placeholder' => 'Choose a resource', 'label' => false, ));
$form->add('role', 'choice', array('choices' => $rolesListForForm,'required' => false, 'placeholder' => 'Choose a role', 'label' => false, ));            
$form->add('save', 'submit', array('label' => 'Save'));     

$form->handleRequest($request);

// If form is valid
if ($form->isValid()) 
    {
    ...lots of logic here to understand if persisting or not stuff on DB, then I simply refresh the current page
    return $this->redirect($this->generateUrl('hr_manage', array('projectID' => $prj->getId())));
    }

//creation of the second form
$formGlobalSearch=$this->createFormBuilder()
->add('username', 'text', array('constraints' => new UsernameExists()))
->add('role', 'choice', array('choices' => $rolesListForForm,'required' => false, 'placeholder' => 'Choose a role', 'label' => false, ))
->add('submitUsername', 'submit', array('label' => 'Search username globally'))
->getForm();

$formGlobalSearch->handleRequest($request);

if ($formGlobalSearch->isValid())
    {
        //persist stuff on DB and refresh current page
        return $this->redirect($this->generateUrl('hr_manage', array('projectID' => $prj->getId())));
    }

return $this->render('HR/show.html.twig', array('projectID' => $prj->getId(), 'hrlist' => $HRsInMyDomain, 'form' => $form->createView(), 'HRs' => $HRsInThisProject, 'formGlobalSearch' => $formGlobalSearch->createView(),));
这一切都很顺利,唯一的问题是当第二个表单抛出验证错误时。当它这样做时,顶部形状不再正确渲染,我看到如下内容:

以下是细枝的相关部分:

{{ form_start(form) }}
{{ form_row(form.showinactive) }}
<table>
<tr>
    <td>User ID</td>
    <td>Name</td>
    <td>Role</td>
    <td>Started</td>
    <td>Status</td>
</tr>

{% for key, HR in HRs %}
<tr>
    <td>{{ key }}</td>
    <td>{{ HR.name }}</td>
    <td>{{ form_row(form['roleOf_' ~ key]) }}</td>
    <td>{{ HR.started_at|date('Y-m-d H:i:s') }}</td>
    <td>{{ form_row(form['isActive_' ~ key]) }}</td>
</tr>
{% endfor %}
</table>
<br>
Add new resource:
{{ form_row(form.HRid) }}{{ form_row(form.role) }}
{{ form_row(form.save) }}
{{ form_end(form) }}
<br>
Or you can search for a user of ProJacked at global level
{{ form_start(formGlobalSearch) }}
{{ form_errors(formGlobalSearch) }}
{{ form_widget(formGlobalSearch) }}
{{ form_end(formGlobalSearch) }}

有什么想法吗?

为什么不创建一个自定义表单类型,并将其称为“将HRS传递到该项目”中,就像传递参数一样,而不是在控制器中执行操作。它可能会让您对验证等有更多的控制。同意-您应该将每个表单划分为自己的类,以便可以单独处理,并将每个表单所需的一切都包含在该类中。您应该使用表单集合类型,而不是foreach$hrsinthis项目。我无法从您发布的代码中看出为什么在发布表单时您的用户列表会损坏,但我怀疑您的“roleOf_u2;”逻辑。$key在某个地方有错误。使用集合将大大简化事情。我将尝试为我没有创建的类创建集合,因为我仅在此处使用此表单。我不认为问题出在foreach等上,因为我在showinactive字段上也有同样的问题,这是一个简单的复选框,您可以从示例中看到,它丢失了tickmarkJasonRoman和Sebastien:成功了!我不明白为什么,但它奏效了,谢谢你。