我正在尝试构建一个填充了数据库实体的select html元素。我需要从非默认实体值中选择select元素中的标签和值,因此我使用'choice_label'和'choice_value'选项。
问题是任何具有重复'choice_value'(区域)值的实体都被删除(替换?)。
这是我的表单构建器:
$builder->add('country', EntityType::class, array(
'class' => 'AcmeCheckoutBundle:Country',
'label' => 'Country',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.name', 'ASC');
},
'choice_label' => 'name',
'choice_value' => 'territory'
));
这就是我的期望:
<select>
<option value="1">United Kingdom</option>
<option value="2">France</option>
<option value="2">Germany</option>
<option value="3">Brazil</option>
<option value="3">Canada</option>
</select>
这就是我得到的:
<select>
<option value="1">United Kingdom</option>
<option value="2">Germany</option>
<option value="3">Canada</option>
</select>
如果我从表单构建器中删除'choice_value',我会得到所有记录,但显然有错误的值。
答案 0 :(得分:0)
ChoiceType的先前symfony3选择数组具有以下结构:
$choices = [
'value1' => 'label1',
'value2' => 'label2', ...
];
因此,当您使用元素填充此数组时,将覆盖具有重复值的元素。由于symfony2.7选择数组被重新编写,现在它具有反转结构:
$choices = [
'label1' => 'value1',
'label2' => 'value2', ...
];
现在您可以拥有重复值,但必须具有唯一标签。此结构是在symfony2.7中引入的,但默认情况下未启用,默认情况下在symfony3中使用。
要在symfony2.7中启用此结构,您可以使用选项choices_as_values
(http://symfony.com/doc/2.7/reference/forms/types/choice.html#choices-as-values)。
实际上在EntityType symfony文档中没有提到这个选项,但是当EntityType扩展ChoiceType时它应该可以工作。如果不是,您可以使用ChoiceType而不是EntityType并手动提供选择。