2016-10-31 51 views
3

我在Symfony 3.1.6上运行,并且我在表单渲染中遇到了一些奇怪的事情。Symfony - ChoiceType浮点值

这里我的表格:

$form = $this->createFormBuilder() 
     ->add('foo', ChoiceType::class, [ 
      'choices'  => [ 
       '00 h 30' => 0.5, 
       '01 h 00' => 1.0, 
      ], 
     ]) 
     ->add('bar', ChoiceType::class, [ 
      'choices'  => [ 
       '00 h 30' => 0.5, 
       '01 h 00' => 1.0, 
       '01 h 30' => 1.5, 
      ], 
     ]) 
     ->add('baz', ChoiceType::class, [ 
      'choices'  => [ 
       '00 h 30' => 0.5, 
       '01 h 00' => 1.0, 
       '02 h 00' => 2.0, 
      ], 
     ]) 
     ->getForm(); 

而且基本呈现:

{{ form_start(form) }} 
    {{ form_widget(form.foo) }} 
    {{ form_widget(form.bar) }} 
    {{ form_widget(form.baz) }} 
{{ form_end(form) }} 

我得到这个:

<form> 
    <select id="form_foo" name="form[foo]"> 
     <option value="0.5">00 h 30</option> 
     <option value="1">01 h 00</option> 
    </select> 
    <select id="form_bar" name="form[bar]"> 
     <option value="0">00 h 30</option> 
     <option value="1">01 h 00</option> 
     <option value="2">01 h 30</option> 
    </select> 
    <select id="form_baz" name="form[baz]"> 
     <option value="0.5">00 h 30</option> 
     <option value="1">01 h 00</option> 
     <option value="2">02 h 00</option> 
    </select> 
</form> 

为什么我bar渲染不显示良好的价值观?实际上,每次我使用大于1的值而不是一个int值时,这些值都只是int增量。

回答

1

这发生,因为array的密钥必须是integerstring只(PHP Manual)。如果提供了一个浮点键,它将自动被PHP转换为整数here。让我们来看一个例子:

$cache[$choice] = true; 

// when $choice = 0.5: $cache = [0 => true] 
// when $choice = 1.0: $cache = [0 => true, 1 => true] 

然后,当$choice = 1.5this lineisset($cache[1.5]))返回true因为真的检查isset($cache[1])这个键已经存在,所以castableToString()回报false(检测为一式两份)和选择值产生递增的整数作为价值观。

我认为这是一个错误。

目前,使用choice_value选项来解决这个问题:

'choice_value' => function ($value) { 
    return $value; 
} 

我在Github上留下一个评论对这个老问题:https://github.com/symfony/symfony/issues/13817#issuecomment-257297132

已经固定在https://github.com/symfony/symfony/pull/20378

+1

感谢您的解释! – Bouffe

+0

修正于https://github.com/symfony/symfony/pull/20378 – yceruto

1

我很惊讶,它产生:

<option value="0">00 h 30</option> 

然后

<option value="0.5">00 h 30</option> 

对于同样的选择键和值(maybe because of this?)。

负责生成选项列表的类是Symfony/Component/Form/ChoiceList/ArrayChoiceList,所以我会解决我在那里的怀疑。

不过,我不知道是什么原因造成这个问题我建议你看ChoiceTypechoice_value option因为这决定每一个选择是如何转变为一个值,如果没有指定它它仅使用递增idicies 。所以也许尝试使用这个选项,只是将float转换为字符串。

请参见:ArrayChoiceList.php#L83

+1

感谢您的交代! – Bouffe