如何让form_rest()不显示Symfony2的字段?

时间:2012-05-13 07:22:48

标签: php forms symfony twig

我已经开始使用Symfony2,但我遇到了一些问题。 我想手工渲染字段,但它不起作用,因为我呈现的字段也显示form_rest()函数,所以我有两个相同的字段。

这是我的代码:

<div>
     {{ form_errors(form.contenu) }}
     <textarea id="{{ form.contenu.vars.id }}" name="{{ form.contenu.vars.full_name }}">{{ form.contenu.vars.value }}</textarea>
</div>

而且,在表格的最后,我必须把它:

{{ form_rest(form) }}

但它显示“contenu”字段:(

你知道这是什么问题吗?

4 个答案:

答案 0 :(得分:188)

另一种选择是明确地将字段标记为已渲染:

{% do form.contenu.setRendered %}

答案 1 :(得分:41)

我认为另一个 这样做的方法不那么简单:

{{ form_widget(form._token) }} // render the CSRF Token
{{ form_end(form, {'render_rest': false}) }} // do not render anything else

它来自official documentation(v3.0)所以我认为它几乎是最佳实践

答案 2 :(得分:32)

{{ form_rest(form) }}在最后,在“手动”渲染每个字段之后。如果您将其用于CSRF令牌,则始终可以使用以下内容进行渲染:

{# Token CSRF #}
{{ form_widget(form._token) }}

答案 3 :(得分:10)

您不希望显示某些字段的情况表明设计错误。您可以将一些参数提供给它__construct以使其成为条件(例如,包含/排除某些字段),或者您可以创建单独的Form类(在我看来,这有点)矫枉过正)。

几个月前,当用户插入/更新记录时表单不同,我遇到了一些常见情况。它是这样的:

...
public function __construct($isUpdateForm){
    $this->isUpdateForm= $isUpdateForm;
}

public function buildForm(FormBuilder $builder, array $options){
    ....
    $builder->add('some_filed', 'text', ..... );

    if ( $this->isUpdateForm ){
        $builder->add(.....);
    }
    ....
}
....

如果由于某些原因您无法重构表单类,您仍然可以显示不需要的字段,但将它们包装到具有CSS <div>属性的display:none中。这样“他们仍然在那里”(并且无论如何都会正常处理),但用户看不到。

希望这会有所帮助......