Symfony 3.4 - ChoiceType 字段和相同的标签



好的,我读了很多关于这个的内容,主要是在这里: 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选项应该有效。

最新更新