71

我已经开始使用 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

4 回答 4

205

另一种选择是将字段显式标记为已渲染:

{% do form.contenu.setRendered %}
于 2012-11-21T10:08:05.553 回答
60

在我看来,另一种不那么老套的方法是:

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

它来自官方文档(v3.0),所以我猜这几乎是最佳实践。

于 2016-05-18T13:49:41.143 回答
32

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

{# Token CSRF #}
{{ form_widget(form._token) }}
于 2012-05-13T09:49:11.223 回答
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(.....);
    }
    ....
}
....

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

希望这可以帮助...

于 2012-05-13T11:17:26.157 回答