Как заставить форму 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) }}
Но он отображает поле "содержимое":(
У вас есть представление о том, в чем проблема?
4 answers
Другой вариант - явно пометить поле как отображаемое:
{% 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
. Таким образом, "они все еще там" (и, безусловно, обрабатываются нормально), но не видны пользователю.
Надеюсь, это поможет...