如何使用 "sonata_type_model" 或 symfony "entity" 呈现带有选项组的多项选择下拉列表?

How to render a multiple choice dropdown with option groups using "sonata_type_model" or symfony "entity"?

我正在尝试使用 sonata_type_modelentity 类型呈现类似于 the SO question 的多项选择下拉菜单。我有 PropertymanyToManyFeature 的实体,即 FeatureTypeoneToMany。多选下拉菜单正在 属性 创建表单中实现。

我找到了the group_by option。但是我使用 entity 收到警告并使用 sonata_type_model.

得到不正确的渲染

尝试 1

->add('features', 'entity', array(
    'class' => 'MyBundle:Feature',
    'multiple' => true,
    'group_by' => 'featureType'
))

Warning: Illegal offset type in isset or empty in vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/Factory/DefaultChoiceListFactory.php at line 334

尝试 2

->add('features', 'sonata_type_model', array(
    'multiple' => true,
    'btn_add' => null,
    'group_by' => 'featureType'
))

它只呈现下拉列表中的值,例如

尝试 3

我尝试了 choices 但出现错误

->add('features', 'sonata_type_model', array(
    'multiple' => true,
    'required' => false,
    'btn_add' => null,
    'choices' => $this->getFeatureOptionsWithGroup()
))

Warning: get_class() expects parameter 1 to be object, array given in vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php at line 58

尝试 4

我尝试了 choice_list 但出现错误

->add('features', 'sonata_type_model', array(
    'multiple' => true,
    'required' => false,
    'btn_add' => null,
    'choice_list' => $this->getFeatureOptionsWithGroup()
))

The option "choice_list" with value array is expected to be of type "null" or "Symfony\Component\Form\ChoiceList\ChoiceListInterface", but is of type "array" in vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php at line 888

方法getFeatureOptionsWithGroup()returns这样的数组

array(
    'Group 1' => array(
        1 => 'Feature 1'
        2 => 'Feature 2'
    ),
    'Group 2' => array(
        3 => 'Feature 3'
        4 => 'Feature 4'
    )
)

尝试 5

我使用 ModelChoiceList 更新了方法,但在使用 choices 时遇到了同样的错误。

Warning: get_class() expects parameter 1 to be object, array given in vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php at line 58

private function getFeatureOptionsWithGroup()
{
    return new ModelChoiceList(
        $this->modelManager,
        'MyBundle:Feature',
        null,
        null,
        $this->getRepository('MyBundle:Feature')->getFeatureOptionsWithGroup()
    );
}

我希望我有机会在没有模板覆盖的情况下渲染它。任何帮助将不胜感激。

使用类型entity

->add('features', 'entity', [
       'class'     => 'MyBundle:Feature',
       'property'  => 'name',
       'choices'   => $this->getFeatureOptionsWithGroup(),
       'multiple'  => true,
       'required'  => false,
       'btn_add'   => null,
])

确保你的函数 getFeatureOptionsWithGroup() returns 像这样

array(
       'Group 1' => array(
           1 => 'Feature Entity Object 1',
           2 => 'Feature Entity Object 2',
       ),
       'Group 2' => array(
           3 => 'Feature Entity Object 3',
           4 => 'Feature Entity Object 4',
       )
   ) 

最好的方法是使用 group_by 选项。

所以在你的情况下,你需要在你的 FeatureType 实体中传递 $property 字段的名称,然后在你的 属性 实体中,你需要实现 __toString() 功能这应该是 属性 作为字符串的名称。

解释

在你的 FeatureType 实体 table 上,属性 关联被 property_id 映射为外键,Doctrine 为你进行查询,所以你只需要指定如何你想把它们分组。