如何让form_rest()不显示Symfony2的字段?

Ila*_*lon 66 php forms symfony twig

我已经开始使用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>
Run Code Online (Sandbox Code Playgroud)

而且,在表格的最后,我必须把它:

{{ form_rest(form) }}
Run Code Online (Sandbox Code Playgroud)

但它显示"contenu"字段:(

你知道问题是什么吗?

Fra*_*sas 194

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

{% do form.contenu.setRendered %}
Run Code Online (Sandbox Code Playgroud)

  • 正是我正在寻找的东西,它正好回答了问题. (8认同)
  • 高超!完美的工作. (3认同)
  • @TomasDermisek没有\ Symfony \ Component \ Form \ FormView :: setRendered`没有参数。而且由于没有`setUnrendered`和$$ rendered`是私有方法,所以以后不能在代码中使用`{{form_row(form.contenu)}}`。 (2认同)

And*_*erj 44

在我看来,另一个不那么黑客的方法就是:

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

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

  • 不要忘记手动呈现CSRF令牌. (6认同)
  • `{{form_widget(form._token)}}` (2认同)

gre*_*emo 32

{{ form_rest(form) }}在"手动"渲染每个字段之后,最后一步.如果您将其用于CSRF令牌,则始终可以使用以下内容呈现它:

{# Token CSRF #}
{{ form_widget(form._token) }}
Run Code Online (Sandbox Code Playgroud)

  • 与`{{form_widget(form._token)}}``{{form_end(form,{'render_rest':false})}}结合使用非常有用 (34认同)

Jov*_*vic 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(.....);
    }
    ....
}
....
Run Code Online (Sandbox Code Playgroud)

如果由于某些原因你无法重构表单类,你仍然可以显示不需要的字段,但将它们包装到<div>具有CSS display:none属性的字段中.这样"他们仍然在那里"(并且通过一切正常处理)但用户不可见.

希望这可以帮助...