Я использую 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,
)
);
Как вы правильно догадались, 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 %}
Надеюсь, это поможет!
{# 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 %}
allow_add
,allow_delete
установлены вfalse
?