9

假设Symfony2中有一个实体,它有一个字段bestfriend,它是从满足复杂要求User的实体列表中选择的一个实体。User您可以通过指定它是实体字段类型来在表单中呈现此字段,即:

$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>s 但在<optgroup>s 下组织的组织。

我来解决问题了!提交表单时,框架会识别出用户字段不是 User 的实例,而是一个整数。如何让 Symfony2 理解传递的 int 是 User 类型实体的 id?

4

1 回答 1

9

以下是我的解决方案。请注意, Symfony2 官方文档中没有提到它,但它确实有效!我利用了实体字段类型choice.

因此,您可以将数组choices作为参数传递。

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

其中函数getArrayOfEntities()是一个函数,它用我的朋友的朋友填充选择列表,由我的朋友组织:

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;
} 

I know the example could be meaningless, but it works...

PS: You need to pass the entity manager to let it working...

于 2012-11-12T14:21:29.913 回答