【问题标题】:Entity mapping in a Symfony2 choice field with optgroup带有 optgroup 的 Symfony2 选择字段中的实体映射
【发布时间】:2012-10-31 22:44:34
【问题描述】:

假设在 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>

因此,可以通过使用&lt;optgroup&gt; 标签来渲染该字段以突出显示朋友的这种特殊功能。

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

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

FriendType 类创建了一个&lt;select&gt;,以相同的&lt;option&gt;s 组织但在&lt;optgroup&gt;s 下组织。

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

【问题讨论】:

  • 老实说,我不明白你的问题,但我认为你可以用 DataTransformer 解决它
  • @nikita2206 看看我自己的答案。

标签: forms symfony entities


【解决方案1】:

下面是我的解决方案。 请注意,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:你需要通过实体管理器才能让它工作......

【讨论】:

  • 有什么办法可以在finishView方法中做到吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多