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

Symfony 3.4 - ChoiceType field and same labels

好的,我读了很多关于这个的内容,主要是在这里:https://github.com/symfony/symfony/issues/19953

但是我还是得不到简单的解决办法;

我想用这个数据显示 select :

$data = [
   2 => 'Label 1',
   5 => 'Label 2',
   6 => 'Label 1', 
   11 => 'Label 3',
]

我使用optgroup,所以我可以有几个相同的标签(这里是Label 1)。

但是如何在我的 ChoiceType 中显示它们?现在我有:

 $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 ?
            },
        ])

此示例显示了我的 select 列表,其中包含重复项,但值类似于 0, 1, 2, 3 ....

如果我删除 choice_label,它不会显示重复项。

我试过了:

# app/config.yml
framework:
    form:
        choices_as_values: false # defaults to true

但是这个选项似乎在 Symfony 3.4 上不存在。有什么线索吗?

当您将 ID 作为可能实体的值时,您的问题似乎 会发生。如果它们确实是实体,请使用 EntityType!!!

...也就是说...

好吧,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 选项应该有效。