Jea*_*ean 9 forms entities symfony
假设Symfony2中的实体具有字段bestfriend,该字段是User从User满足复杂要求的实体列表中选择的实体.您可以通过指定它是实体字段类型来在表单中呈现此字段,即:
$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?
以下是我的解决方案.请注意,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:你需要通过实体经理让它工作......