在Symfony 2.8上遇到一个小问题。我有几个db字段,一个是整数,一个是十进制。当我构建表单时,这些字段是下拉列表,因此我使用的是ChoiceType而不是IntegerType或NumberType。
表单实际上运行正常,两者之间的差异显然不会导致问题,我可以选择一个值并正确保存到数据库。
现在的问题出在听众身上。当某些字段被更改时,我需要启动一个额外的进程,所以我有一个事件监听器并使用getEntityChangeSet()命令。
我注意到它正在报告这些字段已更改,因为它识别出我在Vardump输出上可以看到的1000和“1000”之间的差异:
"baths" => array:2 [▼
0 => 1.5
1 => "1.5"
]
这导致侦听器总是触发我的钩子,即使值确实没有改变。如果我将表单类型更改为Integer,那只是一个文本条目,我丢失了我的下拉列表。如何强制下拉ChoiceType将数字视为数字?
在我的实体中,这是正确定义的:
/**
* @var float
*
* @ORM\Column(name="baths", type="decimal", precision=10, scale=1, nullable=true)
*/
private $baths;
以我的常规形式:
->add('baths', BathsType::class)
拉入:
class BathsType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'choices' => array_combine(range(1,10,0.5),range(1,10,0.5)),
'label' => 'Bathrooms:',
'required' => false,
'placeholder' => 'N/A',
'choices_as_values' => true,
]);
}
public function getParent()
{
return 'Symfony\Component\Form\Extension\Core\Type\ChoiceType';
}
}
答案 0 :(得分:4)
您应该只将值传递给choices
选项,它们将被数字键索引,这些数字键用作“隐藏”html输入值的字符串,这些值将在场景后面进行映射。
然后使用choice_label
将标签(可见值)设置为转换为字符串的选项:
class BathsType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'choices' => range(1,10,0.5),
'label' => 'Bathrooms:',
'required' => false,
'placeholder' => 'N/A',
'choices_as_values' => true,
'choice_label' => function ($choice) {
return $choice;
},
]);
}
public function getParent()
{
return 'Symfony\Component\Form\Extension\Core\Type\ChoiceType';
}
}
答案 1 :(得分:0)
使用Symfony2.8,您仍然可以使用(depreceated
)choice_list
选项:
....
'choice_list' => new ChoiceList(
range(1,10,0.5),
range(1,10,0.5)
)
....
答案 2 :(得分:0)
在symfony 4中,choices_as_values不存在,因此解决方案与Heah answer相同,但没有该选项:
class BathsType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'choices' => range(1,10,0.5),
'label' => 'Bathrooms:',
'required' => false,
'placeholder' => 'N/A',
'choice_label' => function ($choice) {
return $choice;
},
]);
}
public function getParent()
{
return 'Symfony\Component\Form\Extension\Core\Type\ChoiceType';
}
}