如何使用 "sonata_type_model" 或 symfony "entity" 呈现带有选项组的多项选择下拉列表?
How to render a multiple choice dropdown with option groups using "sonata_type_model" or symfony "entity"?
我正在尝试使用 sonata_type_model
或 entity
类型呈现类似于 the SO question 的多项选择下拉菜单。我有 Property
的 manyToMany
到 Feature
的实体,即 FeatureType
的 oneToMany
。多选下拉菜单正在 属性 创建表单中实现。
我找到了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 为你进行查询,所以你只需要指定如何你想把它们分组。
我正在尝试使用 sonata_type_model
或 entity
类型呈现类似于 the SO question 的多项选择下拉菜单。我有 Property
的 manyToMany
到 Feature
的实体,即 FeatureType
的 oneToMany
。多选下拉菜单正在 属性 创建表单中实现。
我找到了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 为你进行查询,所以你只需要指定如何你想把它们分组。