8

エンティティ User とエンティティ Address があります。User と Address の間には 1 対多の関係があります。

    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) }}
    [...]

わかった。では、1 つまたは複数のアドレスのフィールドを表示する方法は? (いいえ{{ for_widget(form.adresses.zipcode) }}{{ for_widget(form.adresses[0].zipcode) }}...)

何か案は ?

4

2 に答える 2

7

これは、フォーム テンプレートで行った方法です。

{{ 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 によって駆動される小さなアクション バーを使用して、ユーザーがアドレスを追加および削除できるようにしています。これは、適切な HTML コードを使用してコンテナーに新しい div を追加する単純なスクリプトです。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]" ...>

注: 3 つのドットは の代替ですrequired="required" maxlength="255"が、必要に応じて変更できます。

AddressTypeブラウザのDOMにまったく新しいものを追加するには、それよりも多くのHTMLコードが必要になりますが、これで一般的なアイデアが得られます.

よろしく、
マット

于 2011-05-10T22:08:54.590 に答える
5

フィールドを動的に追加する場合は、 UserType のコレクション フィールドでキー 'allow_add' を true に設定する必要があるという事実を補足する必要があります。

...

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

何が欠けているのかを把握するのに何時間も費やしましたが、私が書いている時点では、ドキュメントにはまだ言及されていません。仲間の開発者に役立つことを願っています。

于 2011-07-21T16:03:50.197 に答える