使用带有整数的ChoiceType作为选择值

时间:2016-02-22 17:38:29

标签: symfony symfony-forms

在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';
    }


}

3 个答案:

答案 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,您仍然可以使用(depreceatedchoice_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';
    }
}