Как сделать 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» 🙁

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

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

 {% do form.contenu.setRendered %} 

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

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

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

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

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

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

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