使用optgroup在Symfony2选项字段中进行实体映射

时间:2012-11-12 13:49:39

标签: forms symfony entities

假设 Symfony2 中的实体具有字段bestfriend,该实体是从User个实体列表中选择的User个实体。复杂的要求。 您可以通过指定它是entity field type,即:

来在表单中呈现此字段
$builder->add('bestfriend', 'entity', array(
   'class' => 'AcmeHelloBundle:User',
   'property' => 'username',
));

此表单字段呈现为<select>,其中每个显示的值都采用以下格式:

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

因此,可以使用<optgroup>标记来渲染该字段,以突出显示朋友的这种特殊功能。

遵循这个原则,我创建了一个字段类型,即FriendType,它创建了this answer中的选择数组,其呈现方式如下:

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

FriendType班级使用相同的<select>组织<option>,但在<optgroup> s下进行组织。

我来问这个问题!提交表单时,框架会识别出用户字段不是User的实例,但它是一个整数。 我怎样才能让Symfony2明白传递的int是User类型实体的id?

1 个答案:

答案 0 :(得分:9)

以下是我的解决方案。 请注意, Symfony2官方文档中没有提到它,但它有效!我利用了实体字段类型is child of 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;
} 

我知道这个例子可能毫无意义,但它有效......

PS:您需要通过实体管理器才能让它正常工作......