2013-05-24 5 views
21

У меня простая проблема.Symfony2 -> Twig -> Form -> Field -> Set rendered = true

У меня есть форма с полем, например:

$builder 
    ->add('x') 
    ->add('y') 
    ->add('z') 
; 

В моих прута файлов я использовал несколько блоков, и я хочу, чтобы остановить визуализации полей ... Я рассматриваю b.html.twig файл!

a.html.twig

{% block body %} 
    {% block form %} 
     {{ form_widget(form) }} 
    {% endblock form %} 
{% endblock body %} 

b.html.twig

{% block form %} 
    {{ form.x.set('rendered', true) | default() }} 
    {{ parent() }} 
{% endblock form %} 

Если я удалить "по умолчанию()" я получаю ошибку, что объект ханжества преобразуется в строку. И на самом деле форма отображает все поля ... Включает поле x. Но они не должны визуализировать поле x ...

Спасибо заранее!

ответ

65

Я пропускаю вопрос здесь? Если вы хотите установить поле оказанной, даже если это не простой вызов:

{% do form.x.setRendered %} 

Если я неправильно понял, мои извинения.

3

Вы должны удалить (или добавить) поле формы в свой FormType, включив в него какую-то логику решения.

Например, проверка наличия/значения переменной цераина.

Эта переменная может быть затем введена в конструктор.

Извлечение из шаблона - это логика приложения, которая не входит в ваш шаблон.

Если у вас нет другого выбора, посмотрите на метод FormView::setRendered().

Вы можете получить доступ к методам объекта с помощью Ветки attribute function:

{{ attribute(object, method, arguments) }} 
+0

Проблема в том, что я использую тему глобальной формы, которая содержит «form_widget (form)» по умолчанию. Мне нужно поле внизу, и потому, что я установил rendered = true. Тогда я мог бы использовать его внизу, а моя глобальная тема не отображала бы поле ... – PatrickB

+0

обновил мой ответ ... ваш точный вопрос - как вызвать setRendered() для строки в форме вручную? – nifr

+0

Вопрос в том, как сделать это с помощью twig (only) ^^ В данный момент я использую самодельную функцию твига: public function renderState (поле FormView $) {$ field-> setRendered (true); } – PatrickB

2

Вы можете использовать следующую форму закрытия заявление для предотвращения визуализации полой формы, которые определены в форме, но не описанные в шаблоне:

{{ form_end(form, {'render_rest': false}) }} 

Например, мы определяем следующий вид:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'id', 
      HiddenType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'name', 
      TextType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'comment', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ) 
     ->add(
      'amount', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ); 
} 

Для в этой форме мы описываем следующий шаблон, но мы не хотим отображать поле id, поэтому мы можем использовать опцию render_rest в form_end блок для пропуска визуализации поля id:

{{ form_start(form) }} 
{{ form_row(form.name) }} 
{{ form_row(form.comment) }} 
{{ form_row(form.amount) }} 
{{ form_end(form, {'render_rest': false}) }} 
+4

Этот ответ был бы лучше, если бы вы добавили объяснение. – johnnyRose

+0

Но это работает для всех полей. Также для _csrf_token SO вам нужно будет запомнить поле _csrf вручную – Tom

 Смежные вопросы

  • Нет связанных вопросов^_^