【问题标题】:Unrendered Symfony2 form fields impede form validation未渲​​染的 Symfony2 表单字段阻碍表单验证
【发布时间】:2015-02-23 06:38:22
【问题描述】:

我有一个可以活跃或不活跃的用户列表。

我为所有用户创建了一个选择字段,其中包含用户可以拥有的角色。

在渲染过程中,我只为活跃用户渲染字段。

表单显示完成后我使用

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

避免渲染不必要的字段。那些渲染不足的字段会阻碍表单的验证。 我试图创建一个隐藏的选择字段但失败了。

以下是相关代码:

$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}) }}

这是我想要的(注意只显示相关字段):

另一方面,如果我使用:

{{ form_end(form) }}

然后代码可以工作,但我看到显示了不必要的字段:

我也尝试将不必要的字段设为非必填,但问题仍然存在。

有什么想法吗?

【问题讨论】:

    标签: php forms validation symfony hidden-field


    【解决方案1】:

    为避免该字段被呈现,您必须将其从 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,该字段肯定会呈现。

    【讨论】:

    • 我设法通过为每个不必要的字段声明“{% do form['roleOf_' ~ key].setRendered %}”来解决它。它就像一个魅力,但......这是正确的方式吗?
    • 如果当您将roleOfX 字段设置为呈现时您的表单仍在验证,那么它们就不会成为问题。我会冒险猜测实际问题在于您没有渲染 csrf 令牌(请参阅symfony.com/doc/current/book/forms.html#csrf-protection),该令牌将在全部捕获 form_rest()/form_end(form) 或直接使用 form_row(form._token) 中呈现(如果使用默认值_token 的字段名称)。
    • @SergioNegri 我想知道为什么要向 FormType 添加一个字段,然后更改状态以呈现所有这些有什么意义?如果您不希望它出现在表单中,请不要将其添加到 FormType。
    • @laith.ar :在某些情况下它可能有意义,但在这种情况下你是对的,我混合了客户端和服务器端的行为。我要做的总是渲染字段,然后客户端显示它们与否。
    【解决方案2】:
    {{ form_end(form, {'render_rest': false}) }}
    

    如果表单的字段没有被渲染,那么他的值将被发送为NULL。 因此,如果您已经为该字段设置了值,它将被取消。

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多