2016-02-22 25 views
1

在Symfony 2.8上遇到一个小问题。我有几个数据库字段,一个是整数,一个是十进制。当我构建表单时,这些字段是下拉列表,所以我使用ChoiceType而不是IntegerType或NumberType。使用ChoiceType和Integers作为选择值

表格实际上工作正常,两者之间的内部差异显然不会导致问题,我可以选择一个值,它可以正确保存到数据库。

现在的问题是在Listener中。当某些字段改变时,我需要启动一个额外的进程,所以我有一个事件监听器,并使用getEntityChangeSet()命令。

什么我注意到的是,它的汇报这些领域的变化,因为它确认1000和“1000”之间的区别,我可以在Vardump输出看到:

"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

随着Symfony2.8你仍然可以使用(depreceatedchoice_list选项:

.... 
'choice_list' => new ChoiceList(
    range(1,10,0.5), 
    range(1,10,0.5) 
) 
.... 
1

您只应将值传递给您的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'; 
    } 
}