Как сделать form_rest() не отображать поле с Symfony2?

Я начал использовать 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: (

У вас есть идея, что проблема?

Ответ 1

Другой вариант - явно указать поле как отображаемое:

{% do form.contenu.setRendered %}

Ответ 2

Другой, на мой взгляд, менее хакерский способ сделать это так:

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

Это из официальной документации (v3.0), так что это, пожалуй, лучшая практика, я думаю.

Ответ 3

{{ form_rest(form) }} идет в самом конце, после каждого поля "вручную". Если вы используете его для токена CSRF, вы всегда можете сделать его с помощью:

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

Ответ 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(.....);
    }
    ....
}
....

Если по каким-то причинам вы не можете использовать класс формы рефакторинга, вы можете отображать нежелательные поля, но переносите их в <div> с атрибутом CSS display:none. Таким образом, "они все еще существуют" (и, во всяком случае, обрабатываются нормально), но не отображаются пользователю.

Надеюсь, что это поможет...