2

属性を持つCandidateエンティティがあり$xmlContentます。この属性は、他のエンティティ (国、市民権など) への参照を取得するために使用されます。$xmlContent 値には、次のようにこれらのエンティティの ID が含まれています。

<data>
  <countryId>2</countryId>
  <citizenship>4</citizenship>
  <!-- ... -->
</data>

注:モデルの設計がまずかったことは承知しています。変更できません。これは、作業を開始したときのプロジェクトの奇妙な制約の 1 つでした。

Idそこで、 $xmlContent 値ごとにゲッターとセッターを作成しました。

問題、

Candidate オブジェクト ($xmlContent ID を含む) を編集するフォームを作成し、これらの値を取得するためのゲッターとセッターを追加しました (getCountry()、getCitizenship()、...)

Country問題は、ユーザーが利用可能なすべての国のリストから (たとえば)の値を選択できるようにしたいことです。また、適切な国をデフォルトの国として設定する必要があります。

次に、エンティティ フィールドを使用することにしました。

    ->add('country', 'entity', array(
        'class' => 'MyBundle:Country',
        'query_builder' => function(CountryRepository $er) {
            return $er->createQueryBuilder('c')
                ->orderBy('c.rank', 'ASC');
        },
        'property' => 'Name'
    ))

しかし、ここで別の問題がありました。候補の国を取得するために使用しているゲッターは「ID」を返しますが、エンティティ フィールドはオブジェクトを期待しています。

私の質問、

これを処理する最善の方法は何ですか?

私の制約、

コードをできるだけきれいに保ちたい:)

4

2 に答える 2

1

getter と setter を追加したと言ったので、モデルを変更することは許可されていると思いますが、データベースまたはマッピングでの表現は許可されていません。

あなたのゲッター/セッターはIDを返すべきではないと思います/xmlContentを変更してください。代わりに、ゲッターは ID を読み取り、対応するエンティティが以前に構築されていない場合は構築する必要があります。セッターは以前のオブジェクトを変更するだけで、ライフサイクル コールバックを実装して、xmlContent が永続化される前に最新の状態になるようにする必要があります。

そうすれば、フォームは簡単にデータにバインドされます。

于 2012-12-04T19:48:56.110 に答える
0

たぶん、 DataTransformersEventSubscribersを調べる必要があります。

DataTransformer を使用して、xmlContent個別のプロパティに解析し、それらのフィールドに入力するcountryことができますcitizenship

EventSubscriber を使用して、 a)PRE_BINDフォーム データをxmlContent* に逆変換し、b) フォーム要素を変換します。たとえば、国を取得し、データから選択要素を作成/変更しcountryます。

* データトランスフォーマーはここでは機能しません。つまり、文字列をエンティティに変換するだけでなく、複数のフィールド (国、市民権など) のデータを単一のフィールド (xmlContent) にマージして変換する必要があるためです。

于 2012-12-05T08:32:13.300 に答える