假设 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?
答案 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:您需要通过实体管理器才能让它正常工作......