2016-10-31 94 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