Как заставить 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» :(

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


person Ilan Coulon    schedule 13.05.2012    source источник
comment
Ваша форма случайно не называется формой? В какой версии Symfony у вас работало это решение? Я пытаюсь сделать то же самое, но это не работает.   -  person userfuser    schedule 29.09.2013


Ответы (4)


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

{% do form.contenu.setRendered %}
person Francesc Rosas    schedule 21.11.2012
comment
в PHP это будет ‹?php $form['contenu']-›setRendered(true) ?› - person Tomas Dermisek; 11.02.2015
comment
@TomasDermisek Нет, \Symfony\Component\Form\FormView::setRendered не имеет аргументов. И поскольку setUnrendered не существует, а $rendered является приватным методом, вы не сможете использовать {{ form_row(form.contenu) }} позже в своем коде. - person Stephan Vierkant; 24.06.2018
comment
@StephanVierkant, хитрость в том, чтобы сначала сделать {% set formDescription = form_row(form.description) %}, затем {{ form_rest(form) }}, а затем {{ formDescription|raw }}. - person TheFrost; 04.04.2019

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

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

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

person Andresch Serj    schedule 18.05.2016

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

{# Token CSRF #}
{{ form_widget(form._token) }}
person gremo    schedule 13.05.2012
comment
очень полезно в сочетании с {{ form_widget(form._token) }} {{ form_end(form, {'render_rest': false}) }} - person Barno; 19.12.2013

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

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

person Jovan Perovic    schedule 13.05.2012
comment
Спасибо, но это не то, что я хочу (я нашел решение, см. мой РЕДАКТИРОВАТЬ). Я хотел сказать Symfony, что я уже отобразил поле;) - person Ilan Coulon; 15.05.2012
comment
Еще лучше были бы разные формы для добавления или обновления объекта. По моему опыту, вы добавите $isUpdateForm в свой конструктор, позже вы добавите $isAdmin и $isOwner и т. д. и т. д. - person Stephan Vierkant; 24.06.2018
comment
@StephanVierkant, хотя у меня пока не было такого случая, это, безусловно, возможно. Но тогда, с отдельными формами, разработчик должен обратить внимание на то, чтобы свести к минимуму дублирование (или не иметь его вообще). Нет ничего хуже, чем исправить ошибку в одном месте, просто чтобы обнаружить, что есть такой же фрагмент, о котором вы на самом деле вообще не знали... :-) - person Jovan Perovic; 24.06.2018