Коллекция форм Symfony2: отображается индекс текущего объекта
У меня возникла проблема с отображением коллекции в моей форме.
При отображении моей коллекции объектов у меня есть что-то вроде этого:
0
Name: myInputName
Address: myInputAddress
1
Name: myInputName
Address: myInputAddress
Мой вопрос: почему Symfony2 отображает index...
И это для всех сохраненных объектов в моей коллекции...
Вот код, который я использую:
$builder
->add('person', 'collection', array(
'label' => ' ',
'type' => new PersonType(),
'prototype' => true,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
))
;
В моем файле twig:
<div>
{{ form_widget(edit_form) }}
</div>
Помогите пожалуйста
Сэм
Ответы
Ответ 1
Вы можете настроить рендеринг своей коллекции, не отображая индекс с помощью примера:
{% block _FORMNAME_person_widget %}
{% spaceless %}
{% for child in form %}
{{ form_widget(child.Name) }}
{{ form_widget(child.Address) }}
{% endfor %}
{% endspaceless %}
{% endblock %}
Ответ 2
Удаление индексов (меток) для элементов коллекции:
$builder
->add('person', 'collection', array(
...
'options' => array('label' => false)
))
;
Если вы хотите добавить собственные метки в строку, вы можете создать форму самостоятельно:
{{ form_start(edit_form) }}
{% for person in form.persons %}
{{ form_row(person, {'label': 'custom label per item' }) }}
{% endfor %}
{{ form_end(edit_form) }}
Примечание: проверено на Symfony 2.3 и 2.4
Ответ 3
Это один день назад, но потому, что я столкнулся с тем же вопросом для Symfony 3, ответ секты правильный.
Используйте
'entry_options' => ['label'=>false],
в вашем застройщике, чтобы скрыть объект объекта.
С наилучшими пожеланиями
Ответ 4
Я знаю, что это было закрыто на некоторое время. И не уверен, что это было решено в другом месте. Эта проблема на самом деле довольно проста в исправлении, и я удивлен, что в этом нет никакой документации. В PersonType или любом типе, который используется в коллекциях, просто измените vars ['name'] в buildView так, чтобы вы отображались как метка.
public function buildView(FormView $view, FormInterface $form, array $options)
{
// Adjust the view based on data passed
$this->vars['name'] = $form->getData();
// Or...
$this->vars['name'] = 'Some random string';
}
Если вы хотите, чтобы он был динамическим, вы использовали бы объект form- > getData(). Поскольку в моей проблеме я использую тему формы, переопределение ветки не является для меня вариантом.
Надеюсь, это поможет кому-то.
Ответ 5
Используя решение @MrBandersnatch ниже, мне пришлось использовать $view->vars['name']
вместо $this->vars['name']
(Symfony 2.3).
(извинения за то, что вы не добавили это как комментарий к ответу @MrBandersnatch, у меня пока нет достаточной репутации).