Я начал использовать 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_widget(form._token) }} // render the CSRF Token
{{ form_end(form, {'render_rest': false}) }} // do not render anything else
Это из официальной документации (v3.0), так что это, пожалуй, лучшая практика, я думаю.
{{ form_widget(form._token) }}
{{ form_rest(form) }}
идет в самом конце, после каждого поля "вручную". Если вы используете его для токена CSRF, вы всегда можете сделать его с помощью:
{# Token CSRF #}
{{ form_widget(form._token) }}
{{ form_widget(form._token) }}
{{ form_end(form, {'render_rest': false}) }}
Ситуация, в которой вы не хотите показывать какое-либо поле, предлагает плохо разработанную форму. Вы можете указать в него аргумент __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
. Таким образом, "они все еще существуют" (и, во всяком случае, обрабатываются нормально), но не отображаются пользователю.
Надеюсь, что это поможет...