Hvordan håndtere Form Collection på Symfony2 Beta?

stemmer
7

Jeg har en enhet bruker og en enhet-adresse. Det er en sammenheng En-til-mange mellom Bruker og adresse:

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

        [...]

    }

Jeg har en klasse AddressType, og klasse brukertype:

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

        }

        [...]
    }

I min kontrolleren, jeg bygge skjema med:

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

... og skape visning med:

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

Jeg viser skjemafelt i min kvist mal med:

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

Greit. Nå, hvordan du viser felt for en eller flere adresser? (det er ikke {{ for_widget(form.adresses.zipcode) }}heller {{ for_widget(form.adresses[0].zipcode) }}...)

Noen ideer ?

Publisert på 05/05/2011 klokken 08:11
kilden bruker
På andre språk...                            


2 svar

stemmer
7

Dette er hvordan jeg gjorde det på min skjemamal:

{{ 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 %}

Og jeg har en liten handling bar, drevet av jQuery, som lar brukeren legge til og fjerne adresser. Det er et enkelt script sette inn en ny div til beholderen med riktig HTML-kode. For HTML, brukte jeg akkurat den samme produksjonen har Symfony men med oppdatert indeks. For eksempel vil dette være utgang for gaten skrive inn tekst på AddressTypeformen:

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

Deretter Neste indeksen Symfony vil godta er en så ny input-feltet du legger vil se slik ut:

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

Merk: De tre prikkene er en REMPLACEMENT for required="required" maxlength="255", men kan endres avhengig av dine behov.

Du vil trenge mer HTML-kode enn det å legge en helt ny AddressTypetil DOM av nettleseren, men dette vil gi deg den generelle ideen.

Hilsen,
Matt

Svarte 10/05/2011 kl. 22:08
kilden bruker

stemmer
5

Jeg skal fylle det opp med det faktum at hvis du ønsker å legge til felt dynamisk, må du sette nøkkelen 'allow_add' til stede i samlingen din felt i brukertype:

...

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

Nettopp tilbrakt timer prøver å finne ut hva som mangler, og på den tiden jeg skriver doc nevner ikke dette ennå. Håper det vil hjelpe andre utviklere.

Svarte 21/07/2011 kl. 16:03
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more