Как работать с Form Collection на бета-версии Symfony2? - PullRequest
7 голосов
/ 05 мая 2011

У меня есть сущность User и Entity Address.Существует отношение «один ко многим» между пользователем и адресом:

    class User
    {
        /**
        * @orm:OneToMany(targetEntity="Address")
        */
        protected $adresses;

        [...]

    }

У меня есть класс AddressType и класс UserType:

    class UserType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('addresses', 'collection', array('type' => new AddressType()));

        }

        [...]
    }

В моем контроллере я создаю форму с:

    $form = $this->get('form.factory')->create(new UserType()); 

... и создать представление с помощью:

    return array('form' => $form->createView());

Я отображаю поле формы в шаблоне ветки с помощью:

    {{ form_errors(form.name) }}
    {{ form_label(form.name) }}
    {{ form_widget(form.name) }}
    [...]

Хорошо.Теперь, как отобразить поля для одного или нескольких адресов?(это не {{ for_widget(form.adresses.zipcode) }} и не {{ for_widget(form.adresses[0].zipcode) }} ...)

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 11 мая 2011

Вот как я это сделал в шаблоне формы:

{{ form_errors(form.addresses) }}

{% for address in form.addresses %}
    <div id="{{ 'address%sDivId'|format(loop.index) }}" class="userAddressItem">
        <h5> Address #{{ loop.index }}</h5>

        {{ form_errors(address) }}
        {{ form_widget(address) }}
    </div>
{% endfor %}

И у меня есть небольшая панель действий, управляемая jQuery, которая позволяет пользователю добавлять и удалять адреса. Это простой скрипт, добавляющий новый div в контейнер с правильным HTML-кодом. Для HTML я просто использовал тот же вывод, что и Symfony, но с обновленным индексом. Например, это будет вывод для входного текста улицы формы AddressType:

<input id="user_addresses_0_street" name="user[addresses][0][street]" ...>

Тогда следующий индекс, который Symfony примет, равен 1, поэтому добавляемое новое поле ввода будет выглядеть так:

<input id="user_addresses_1_street" name="user[addresses][1][street]" ...>

Примечание: три точки являются заменой для required="required" maxlength="255", но могут меняться в зависимости от ваших потребностей.

Вам понадобится больше HTML-кода, чем для добавления нового AddressType в DOM браузера, но это даст вам общее представление.

С уважением,
Matt

5 голосов
/ 21 июля 2011

Я должен дополнить это тем, что если вы хотите динамически добавлять поля, вам нужно установить для ключа 'allow_add' значение true в поле вашей коллекции в UserType:

...

$builder->add('addresses', 'collection', array(
    'type' => new AddressType(),
    'allow_add' => true
));

Просто потраченные часыпытаясь выяснить, чего не хватало, и в то время, когда я пишу документ, об этом пока не говорится.Надеюсь, это поможет коллегам-разработчикам.

...