Вопрос по symfony, php, forms, twig – Как заставить form_rest () не отображать поле с Symfony2?

65

Я начал использовать Symfony2, но у меня возникли некоторые проблемы. Я хотел визуализировать поля вручную, но это не работает, потому что мое поле, созданное мной, отображается сform_rest() функция тоже, поэтому у меня есть два одинаковых поля.

Вот мой код:

<code><div>
     {{ form_errors(form.contenu) }}
     <textarea id="{{ form.contenu.vars.id }}" name="{{ form.contenu.vars.full_name }}">{{ form.contenu.vars.value }}</textarea>
</div>
</code>

И в конце формы я должен поместить это:

<code>{{ form_rest(form) }}
</code>

Но он отображает «contenu» поле :(

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

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

Ваш Ответ

4   ответа
188

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

{% do form.contenu.setRendered %}
Вот это да!!! Я никогда раньше не видел эту опцию. Благодарю.
Superb! делает работу отлично.
Именно то, что я искал, и оно отвечает именно на заданный вопрос.
Вау, это прекрасно!
в PHP это будет & lt;? php $ form ["contenu"] -> setRendered (true)? & gt;
32

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

{# Token CSRF #}
{{ form_widget(form._token) }}
очень полезно в сочетании с{{ 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> который имеет CSSdisplay:none приписывать. Таким образом, "они все еще там" (и, конечно, обрабатываются нормально), но не видны пользователю.

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

Иперович прав. Это хорошее и чистое решение!
Еще лучше были бы разные формы для добавления или обновления сущности. Мой опыт показывает, что вы добавите$isUpdateForm к вашему конструктору, позже вы добавите$isAdmin а также$isOwnerи т. д. и т. д.
@StephanVierkant, пока у меня не было такого случая, это, безусловно, возможно. Но тогда, с отдельными формами, dev должен обратить внимание, чтобы минимизировать дублирование (или вообще не иметь его). Нет ничего хуже, чем исправить ошибку в одном месте, просто чтобы обнаружить, что есть тот же самый фрагмент кода, о котором вы действительно не знали ... :-)
Спасибо, но это было не то, что я хочу (я нашел решение, см. Мой РЕДАКТИРОВАТЬ). Я хотел сказать Symfony, что у меня уже есть поле;) Minipipo1
38

Другаяin my opinion Менее хакерский способ сделать это так:

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

Это изофициальная документация (v3.0), так что это в значительной степениbest practise Похоже.

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

Похожие вопросы