如何使用 Symfony2 使 form_rest() 不显示字段?
Posted
技术标签:
【中文标题】如何使用 Symfony2 使 form_rest() 不显示字段?【英文标题】:How to make form_rest() not display a field with Symfony2? 【发布时间】:2012-05-21 03:36:58 【问题描述】:我已经开始使用 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 上对你有用?我正在尝试做同样的事情,但它不起作用。 【参考方案1】:另一种选择是将字段显式标记为已渲染:
% do form.contenu.setRendered %
【讨论】:
在 php 中是 setRendered(true) ?> @TomasDermisek No\Symfony\Component\Form\FormView::setRendered
没有参数。而且由于没有setUnrendered
并且$rendered
是私有方法,因此您以后不能在代码中使用 form_row(form.contenu)
。
@StephanVierkant,诀窍是先做% set formDescription = form_row(form.description) %
然后 form_rest(form)
然后 formDescription|raw
。【参考方案2】:
另一种在我看来不那么老套的方法是:
form_widget(form._token) // render the CSRF Token
form_end(form, 'render_rest': false) // do not render anything else
它来自official documentation (v3.0),所以我猜这几乎是最佳实践。
【讨论】:
form_widget(form._token)
【参考方案3】:
form_rest(form)
在“手动”渲染每个字段之后的最后。如果您将它用于 CSRF 令牌,您始终可以使用以下方式渲染它:
# Token CSRF #
form_widget(form._token)
【讨论】:
结合 form_widget(form._token)
form_end(form, 'render_rest': false)
非常有用【参考方案4】:
您不想显示某些字段的情况表明表单设计不佳。您可以将一些参数输入它的 __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 display:none
属性的 <div>
中。这样“它们仍然存在”(并且无论如何都会正常处理)但对用户不可见。
希望这会有所帮助...
【讨论】:
谢谢,但这不是我想要的(我找到了解决方案,请参阅我的编辑)。我想对 Symfony 说我已经显示了该字段;) 更好的是添加或更新实体的不同形式。我的经验是你会在你的构造函数中添加$isUpdateForm
,稍后你会添加$isAdmin
和$isOwner
等等。
@StephanVierkant 虽然到目前为止我还没有这样的案例,但这当然是可能的。但是,对于单独的表单,开发人员应该注意尽量减少重复(或根本没有)。没有什么比在一个地方修复一个错误更糟糕的了,只是为了发现有一个你根本没有意识到的相同的 sn-p...:-)以上是关于如何使用 Symfony2 使 form_rest() 不显示字段?的主要内容,如果未能解决你的问题,请参考以下文章
显式打印 CSRF 令牌字段而不是 form_rest(form)?
Symfony2 / Doctrine 使 $statement->execute() 不“缓冲”所有值