如何使form_rest()不使用Symfony2显示字段?


70

我已经开始使用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”字段:(

您有什么问题的想法吗?


您的表格是否被称为“表格”?该解决方案在哪个版本的Symfony中适用于您?我正在尝试做同样的事情,但是没有用。
userfuser 2013年

Answers:


201

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

{% do form.contenu.setRendered %}

在PHP中将是<?php $ form ['contenu']-> setRendered(true)?>
Tomas Dermisek 2015年

2
@TomasDermisek否\Symfony\Component\Form\FormView::setRendered没有参数。而且,由于没有setUnrendered$rendered是一个私有方法,你不能用{{ form_row(form.contenu) }}后来在你的代码。
Stephan Vierkant

1
@StephanVierkant,关键是要先做{% set formDescription = form_row(form.description) %},然后{{ form_rest(form) }}{{ formDescription|raw }}
TheFrost

54

在我看来,另一种比较简单的方法是:

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

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


2
{{ form_widget(form._token) }}
abenevaut

32

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

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

34
{{ form_widget(form._token) }} {{ form_end(form, {'render_rest': false}) }}
Barno

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>具有CSS的字段中display:none属性的字段中。这样,“它们仍然在那里”(并且一定会被正常处理),但对用户不可见。

希望这可以帮助...


谢谢,但这不是我想要的(我找到了一个解决方案,请参阅我的编辑)。我想对Symfony说我已经展示了该领域;)
Ilan Coulon 2012年

更好的是添加或更新实体的不同形式。我的经验是,你将添加$isUpdateForm到您的构造函数,以后你会添加$isAdmin$isOwner,等等,等等
斯蒂芬Vierkant

@StephanVierkant到目前为止我还没有这种情况,这肯定是有可能的。但是,对于单个表格,开发人员应注意尽量减少重复(或完全不重复)。没有什么比在一个地方修复错误更糟糕的了,只是发现有一个您根本没有意识到的相同片段... :-)
Jovan Perovic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.