Symfony2,Doctrine Extensions Tree:生成类似"树"的下拉列表选择列表

Con*_*nce 6 html forms symfony doctrine-orm

我有一个使用Tree架构构建的Categories表,使用Doctrine Tree Extension,它看起来像这样

id  parent_id   title   lft lvl rgt root
864 (NULL)  Movies  1   0   18  864
865 864 Packs   2   1   3   864
866 864 Dubbed  4   1   5   864
Run Code Online (Sandbox Code Playgroud)

在视觉上像这样:

Movies
|
|
|->Packs
|->Dubbed
Run Code Online (Sandbox Code Playgroud)

现在我想生成用于添加评论的表单,并将类别作为每个电影的下拉列表加载,所以我在我的电影评论表单类型中

public function buildForm(FormBuilder $builder, array $options)
{

    $builder->add('name');
    $builder->add('file');
    $builder->add('cover');
    $builder->add('category','entity',           array('class'=>'Tracker\MembersBundle\Entity\Category', 'property'=>'title', ));           
}
Run Code Online (Sandbox Code Playgroud)

这会生成一个正常的下拉菜单:

在此输入图像描述

我如何配置我的菜单设置,所以它会这样生成一个Tree-Like-dropdown select

在此输入图像描述

小智 14

我不确定这是一个好主意:用户将无法输入他们的选择.

尚未测试此解决方案,但它应该工作:

首先,您可以按root和lft值对这三个值进行排序以正确显示它,因此添加查询构建器:

'query_builder' => function($er) {
    return $er->createQueryBuilder('c')
        ->orderBy('c.root', 'ASC')
        ->addOrderBy('c.lft', 'ASC');
},
Run Code Online (Sandbox Code Playgroud)

然后,您需要向getIndentedTitle实体添加方法:

public function getIndentedTitle() {
    return str_repeat("--", $this->lvl).$this->title;
}
Run Code Online (Sandbox Code Playgroud)

最后,在构建表单时向选项添加属性选项,以显示虚拟属性indentedTitle而不是title:

'property' => 'indentedTitle'
Run Code Online (Sandbox Code Playgroud)

请参阅:http://symfony.com/doc/current/reference/forms/types/entity.html