Рендеринг коллекции форм Symfony

1

Я использую symfony 2.3 У меня есть форма с полем типа "collection"

Код визуализации в ветке:

{% for field in form.fields %}
    {{ form_row(field.name) }}
{% endfor %}

Все работает, ожидайте, когда form.fields пуст. Тогда ничто не визуализируется в петле ветки, ведь это хорошо. Но в конце формы есть "метка" для элемента "form.fields". Только этикетка.

Временное решение:

    {% for field in form.fields %}
        {{ form_row(field.name) }}
    {% endfor %}
    <div class="hidden">
        {{ form_row(form.fields) }}

Если есть элементы, они будут отображаться в цикле. {{form_row}} будет пустым, потому что все элементы повторяются в цикле выше. Но если form.fields пуст, тогда есть "скрытая" (в div) метка.

Что мне не хватает? Почему это происходит?

Скрытый контент div:

<div class="form-group"><label class="col-sm-2 control-label required">name</label><div class="col-sm-10"><div id="my-id" data-prototype=""></div></div></div>

Конфигурация Builder:

$builder->add(
    'fieldDataMappers',
    'collection',
    array(
        'type' => new FieldDataType(),
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
    )
);
  • 0
    Это происходит, когда allow_add , allow_delete установлены в false ?
  • 0
    Да, это происходит, когда allow_add / delete имеют значение false
Теги:
forms
twig
symfony-forms

2 ответа

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

Как вы правильно догадались, Symfony TwigBridge отслеживает, что отображается, а что нет. Это полезно, так как существует функция form_rest(form), которая особенно полезна для печати скрытого поля формы и для предотвращения "большого юпитера!" Я забыл напечатать это поле! " моменты. :) Вы часто находите form_rest в конце формы, перед кнопкой отправки.

Также учтите, что коллекция представляет собой составной тип формы, содержащий список переменных дочерней формы. Если цикл for не запускается, поскольку тип формы пуст, вызов {{ form_row(form.fields) }} выводит тип формы коллекции. По умолчанию это будет печатать (вы уже догадались) этикетку коллекции и пустой div. С другой стороны, когда коллекция не пуста, Symfony рассмотрит коллекцию как визуализированную, так как все дочерние элементы уже обработаны (см. FormView :: isRendered)

Вы можете взглянуть на стандартную тему Symfony form_div_layout.html.twig, особенно на блоки form_row (которые показывают печать меток) и form_widget_compound (form_widget_compound div и for).

Итак, если вам просто нужно скрыть ярлык (быстрый и грязный, некоторые div все еще там), просто используйте:

$builder->add(
    'fieldDataMappers',
    'collection',
    array(
        'type' => new FieldDataType(),
        'label' => false,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
    )
);

Или лучше, просто выведите весь виджет коллекции, без строки:

{{ form_widget(form.fieldDataMappers) }}

Или даже лучше, вы печатаете всю коллекцию с помощью:

{{ form_row(form.fieldDataMappers) }}

... и затем добавьте тему Twig, чтобы настроить вывод коллекции с чем-то вроде (обратите внимание на синтаксис имени и отсутствующий вызов form_label):

{% block collection_row -%}
    <div>
        {{- form_errors(form) -}}
        {{- form_widget(form) -}}
    </div>
    <div class="hidden">Something here?</div>
{%- endblock collection_row %}

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

1
{# src/Acme/TaskBundle/Resources/views/Task/new.html.twig #}

{# ... #}

{{ form_start(form) }}
    {# render the task only field: description #}
    {{ form_row(form.description) }}

    <h3>Tags</h3>
    <ul class="tags">
        {# iterate over each existing tag and render its only field: name #}
        {% for tag in form.tags %}
            <li>{{ form_row(tag.name) }}</li>
        {% endfor %}
    </ul>
{{ form_end(form) }}

{# ... #}

Поваренная книга Symfony2

http://symfony.com/doc/current/cookbook/form/form_collections.html

Также поле коллекции называется fieldDataMappers not field.

Поэтому я думаю, что это должно быть

{% for field in form.fieldDataMappers %}
    {{ form_row(field.name) }}
{% endfor %}
  • 0
    Да, я использовал псевдокод: /. Основная проблема, когда коллекция пуста. Например, Symfony не помечает его как «обработанный», и в конце формы он обрабатывается.
  • 0
    Если это новая коллекция, вы должны знать, что там не будет элементов. Вам придется добавить новый элемент в коллекцию по прототипу.

Ещё вопросы

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