9

複雑な要件を満たすエンティティのリストから選択されたエンティティである field を持つエンティティがSymfony2にあるとします。エンティティ フィールド タイプであることを指定することで、このフィールドをフォームに表示できます。つまり、次のようになります。bestfriendUserUser

$builder->add('bestfriend', 'entity', array(
   'class' => 'AcmeHelloBundle:User',
   'property' => 'username',
));

このフォーム フィールドは としてレンダリングされ、 <select>表示される各値は次の形式になります。

<option value="user_id">user_username</option>

したがって、<optgroup>タグを使用してフィールドをレンダリングし、友人のそのような特別な機能を強調します。

この原則に従って、次のようにレンダリングされるこの回答FriendTypeのように選択肢の配列を作成するフィールドタイプ、つまりを作成しました。

$builder->add('bestfriend', new FriendType(...));

FriendTypeクラスは<select>、同じ で編成された を作成しますが、の<option>下に編成され<optgroup>ます。

ここで私は問題に来ました!フォームを送信すると、フレームワークは user フィールドが User のインスタンスではなく、整数であることを認識します。渡された int がタイプ User のエンティティの ID であることを Symfony2 に理解させるにはどうすればよいですか?

4

1 に答える 1

9

ここに私の解決策があります。Symfony2 の公式ドキュメントには記載されていませんが、動作することに注意してください! エンティティ フィールド タイプが の子でchoiceあるという事実を利用しました。

したがって、配列をパラメーターとして渡すだけですchoices

$builder->add('bestfriend', 'entity', array(
   'class' => 'AcmeHelloBundle:User',
   'choices' => $this->getArrayOfEntities()
));

ここで、 functiongetArrayOfEntities()は、友人によって編成された友人の友人で選択リストを埋める関数です。

private function getArrayOfEntities(){
    $repo = $this->em->getRepository('AcmeHelloBundle:User');
    $friends = $repo->findAllFriendByComplexCriteria(...);
    $list = array();
    foreach($friends as $friend){
        $name = $friend->getUsername();
        if(count($friend->getFriends())>0){
            $list[$name] = array();
            foreach($friend->getFriends() as $ff){
                $list[$name][$ff->getUsername()] = $ff;
            }
        }
    }
    return $list;
} 

この例は無意味かもしれませんが、うまくいきます...

PS: エンティティ マネージャーを渡して機能させる必要があります...

于 2012-11-12T14:21:29.913 に答える