gpt4 book ai didi

forms - 带有 optgroup 的 Symfony2 选择字段中的实体映射

转载 作者:行者123 更新时间:2023-12-04 03:59:01 24 4
gpt4 key购买 nike

假设在 中有一个实体Symfony2 有一个字段 bestfriend ,这是一个 UserUser 列表中选择的实体满足复杂需求的实体。
您可以通过指定它是 entity field type 来在表单中呈现此字段。 , IE。:

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

此表单字段呈现为 <select> ,其中每个显示的值都采用以下形式:
<option value="user_id">user_username</option>

因此,可以使用 <optgroup> 来渲染该字段。标签来突出 friend 的这种特殊功能。

遵循这个原则,我创建了一个字段类型,即 FriendType ,创建选项数组,如 this answer ,呈现如下:
$builder->add('bestfriend', new FriendType(...));
FriendType类创建一个 <select>组织方式相同 <option> s 但在 <optgroup> 下组织s。

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

最佳答案

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

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

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

其中函数 getArrayOfEntities()是一个用我 friend 的 friend 填充选择列表的功能,由我的 friend 组织:
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:您需要通过实体管理器才能让它工作......

关于forms - 带有 optgroup 的 Symfony2 选择字段中的实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com