2014-12-25 49 views
0

我有一个可以激活或不激活的用户列表。未呈现的Symfony2表单域阻碍表单验证

对于所有用户,我使用用户可以拥有的角色创建选择字段。

在渲染过程中,我仅渲染活动用户的字段。

一旦形式显示结束我使用

{{form_end(形式,{ 'render_rest':假})}}

,以避免要呈现的不必要的字段。那些不受重视的领域妨碍了表格的验证。 我试图创建一个隐藏的选择字段,但失败。

下面是相关代码:

$form = $this->createFormBuilder()->getForm(); //create empty form 
foreach ($HRsInThisProject as $key => $HR) 
    { 
     $form->add('roleOf_'.$key, 'choice', array('choices' => $rolesListForForm,'required' => true,'data' => $HR['role'], 'label' => false,)); 
    } 
$form->add('save', 'submit', array('label' => 'Save')); 

在我的树枝,我有:

<table> 
<tr> 
    <td>User ID</td> 
    <td>Name</td> 
    <td>Role</td> 
    <td>Started</td> 
</tr> 

{% for key, HR in HRs %} 
    {% if HR.is_active %} 
    <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> 
    </tr> 
    {% endif %} 
{% endfor %} 
</table> 
<br> 
{{ form_row(form.save) }} 
{{ form_end(form, {'render_rest': false}) }} 

这是想什么,我有(即只显示相关字段通知): enter image description here

如果另一方面如果我使用:

{{form_end(形式)}}

然后代码的工作,但我看到显示unnnecessary字段:

enter image description here

我还试图使所需要的不必要的字段作为无,但问题依然存在。

有什么想法?

回答

0

为了避免被渲染,你必须从FormType删除它,在实体

Class User { 

    protected $unnecessary = "Some Value"; 

} 

指定该字段的默认值,或者您可以使用FormEvents指定为默认值即场物业

http://symfony.com/doc/current/components/form/form_events.html

或者你可以渲染场为隐藏

http://symfony.com/doc/current/reference/forms/types/hidden.html

底线是您将属性添加到FormType该字段将被肯定呈现。

+0

我设法通过为每个不必要的字段声明“{%do form ['roleOf_'〜key] .setRendered%}”来解决它。它的作用像一个魅力,但......这是正确的方式吗? –

+0

如果你的表单在你设置'roleOfX'字段被渲染时仍然有效,那么它们就不会成为问题。我会冒险猜测,实际的问题在于你没有呈现csrf标记(请参阅http://symfony.com/doc/current/book/forms.html#csrf-protection),它将呈现在捕获所有'form_rest()/ form_end(form)'或直接使用'form_row(form._token)'(如果使用'_token'的默认字段名称)。 – qooplmao

+0

@SergioNegri我不知道为什么你添加一个字段到FormType,然后改变状态来呈现所有这一切的重点?如果你不希望它在表单中,则不要将它添加到FormType中。 – trrrrrrm

0
{{ form_end(form, {'render_rest': false}) }} 

如果窗体的字段没有呈现,那么他的价值将被作为NULL。 所以如果你已经为这个字段设置了一个值,它将被取消。