【问题标题】:How to make form_rest() not display a field with Symfony2?如何使用 Symfony2 使 form_rest() 不显示字段?
【发布时间】: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 上对你有用?我正在尝试做同样的事情,但它不起作用。

标签: php forms symfony twig


【解决方案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...:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多