好的,我读了很多关于这个的内容,主要是在这里: https://github.com/symfony/symfony/issues/19953
但我仍然无法获得简单的解决方案;
我想显示包含此数据的选择:
$data = [
2 => 'Label 1',
5 => 'Label 2',
6 => 'Label 1',
11 => 'Label 3',
]
我使用optgroup
,所以我可以有几个相同的标签(Label 1
这里(。
但是我怎样才能在我的选择类型中显示它们呢?现在我有:
$builder
->add('type', ChoiceType::class, [
'label' => 'Type',
'required' => true,
'choices' => $options['data'],
'choice_label' => function ($value) {
return $value;
},
'choice_value' => function ($value) {
// how to get correct value here ?
},
])
此示例显示我的选择列表,其中包含重复项,但值类似于0, 1, 2, 3 ....
。
如果我删除choice_label
,它不会显示重复项。
我试过这个:
# app/config.yml
framework:
form:
choices_as_values: false # defaults to true
但是这个选项在Symfony 3.4上似乎不存在。有什么线索吗?
当您将 ID 作为可能来自实体的值时,您的问题似乎发生了。如果它们确实是实体,请使用实体类型!!
。话虽如此...
好的,Symfony本质上所做的是以[ label => value ]
的形式提供其选择数组,这在处理重复标签时显然是一个问题。
我相信解决这个问题的最简单方法应该是:
$new = [
(object) ['value' => 2, 'label' => 'Label 1'],
(object) ['value' => 5, 'label' => 'Label 2'],
(object) ['value' => 6, 'label' => 'Label 1'],
(object) ['value' => 11, 'label' => 'Label 3'],
];
可以通过以下方式相当快地生成
$new = [];
foreach($old_choices as $value => $label) {
$new[] = (object) ['value' => $value, 'label' => $label];
}
然后你可以设置
'choices' => $new,
'choice_label' => function($entry) { return $entry->label; },
'choice_value' => function($entry) { return $entry->value; },
(或属性路径(
我不太确定最终$form->getData()
会返回什么,但我希望这是价值。
如果仍要对值进行分组,则group_by
选项应该有效。