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

Jea*_*ean 9 forms entities symfony

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

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

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

<option value="user_id">user_username</option>
Run Code Online (Sandbox Code Playgroud)

因此,人们可以通过使用<optgroup>标签来突出显示朋友的这种特殊功能.

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

$builder->add('bestfriend', new FriendType(...));
Run Code Online (Sandbox Code Playgroud)

FriendType类创建一个<select>具有相同组织<option>秒,但下举办<optgroup>秒.

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

Jea*_*ean 9

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

因此,你可以传递数组 choices作为参数.

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

这个功能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;
} 
Run Code Online (Sandbox Code Playgroud)

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

PS:你需要通过实体经理让它工作......