如何使用 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 属性的 &lt;div&gt; 中。这样“它们仍然存在”(并且无论如何都会正常处理)但对用户不可见。

希望这会有所帮助...

【讨论】:

谢谢,但这不是我想要的(我找到了解决方案,请参阅我的编辑)。我想对 Symfony 说我已经显示了该字段;) 更好的是添加或更新实体的不同形式。我的经验是你会在你的构造函数中添加$isUpdateForm,稍后你会添加$isAdmin$isOwner等等。 @StephanVierkant 虽然到目前为止我还没有这样的案例,但这当然是可能的。但是,对于单独的表单,开发人员应该注意尽量减少重复(或根本没有)。没有什么比在一个地方修复一个错误更糟糕的了,只是为了发现有一个你根本没有意识到的相同的 sn-p...:-)

以上是关于如何使用 Symfony2 使 form_rest() 不显示字段?的主要内容,如果未能解决你的问题,请参考以下文章

显式打印 CSRF 令牌字段而不是 form_rest(form)?

Symfony2,如何使表单标签类/属性与​​其输入不同?

Symfony2 / Doctrine 使 $statement->execute() 不“缓冲”所有值

如何创建将在 Symfony2 中过期/销毁会话的命令控制台?

自定义 Symfony2 过滤器未使用自定义树枝标签触发

在 Symfony2 中使用自定义身份验证提供程序