Как бороться с коллекцией форм в бета-версии Symfony2?

У меня есть пользователь объекта и адрес объекта. Существует отношение One-to-Many между User и 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) }}...)

Есть идеи ?


person barbacan    schedule 05.05.2011    source источник
comment
Ваше правописание очень непоследовательно в вашем примере кода; уверены ли вы, что правильно пишете вещи (имена переменных, функции и т. д.) в своей среде разработки?   -  person Derek Stobbe    schedule 10.05.2011


Ответы (2)


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

{{ 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 браузера, но это дает вам общее представление.

С уважением,
Мэтт

person Matt    schedule 10.05.2011
comment
Спасибо! Это помогло мне отладить мой код. Symfony2 успешно генерирует поля, включая шаблон (имеет индекс $$name$$). он должен быть скрыт и использоваться для отображения пользователю пустых групповых полей с индексом 0, 1, 2... - person barbacan; 12.05.2011
comment
Хорошо, и спасибо за подсказку о выкройке. Я не думал об использовании прототипа в качестве шаблона для простого поиска и замены новых полей. Это отличная идея, и она уменьшит мой код js. Недурно! - person Matt; 13.05.2011
comment
Просто к вашему сведению, это адрес, а не адрес - person Ryall; 16.11.2011
comment
Упс, спасибо, я привык писать по-французски, пишется adresse. Я отредактировал свой ответ, чтобы исправить эту опечатку. - person Matt; 18.11.2011

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

...

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

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

person flochtililoch    schedule 21.07.2011