Подтвердить что ты не робот

Коллекция форм 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>

Помогите пожалуйста

Сэм

4b9b3361

Ответ 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, у меня пока нет достаточной репутации).