Как заставить форму 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) }}

Но он отображает поле "содержимое":(

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

Author: j0k, 2012-05-13

4 answers

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

{% do form.contenu.setRendered %}
 183
Author: Francesc Rosas, 2012-11-21 10:08:05

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

{# Token CSRF #}
{{ form_widget(form._token) }}
 32
Author: gremo, 2012-05-13 09:49:11

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

{{ form_end(form, {'render_rest': false}) }}

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

 32
Author: Andresch Serj, 2016-05-18 13:49:41

Ситуация, в которой вы не хотите показывать какое-либо поле, предполагает плохо продуманную форму. Вы могли бы ввести некоторые аргументы в __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. Таким образом, "они все еще там" (и, безусловно, обрабатываются нормально), но не видны пользователю.

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

 10
Author: Jovan Perovic, 2012-05-13 11:17:26