Как заставить form_rest () не отображать поле с Symfony2?

65

Я начал использовать 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: (

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

  • 0
    Случайно ли ваша форма называется "формой"? На какой версии Symfony это решение работало для вас? Я пытаюсь сделать то же самое, но это не работает.
Теги:
forms
twig

4 ответа

196
Лучший ответ

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

{% do form.contenu.setRendered %}
  • 7
    Именно то, что я искал, и оно отвечает именно на заданный вопрос.
  • 2
    Superb! делает работу отлично.
Показать ещё 4 комментария
38

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

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

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

  • 6
    Не забудьте отрисовать токен CSRF вручную.
  • 2
    {{ form_widget(form._token) }}
32

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

{# Token CSRF #}
{{ form_widget(form._token) }}
  • 34
    очень полезно в сочетании с {{ form_widget(form._token) }} {{ form_end(form, {'render_rest': false}) }}
10

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

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

  • 0
    Иперович прав. Это хорошее и чистое решение!
  • 0
    Спасибо, но это было не то, что я хочу (я нашел решение, см. Мой РЕДАКТИРОВАТЬ). Я хотел сказать Symfony, что у меня уже есть поле;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню