2016-10-31 2 views
3

Symfony 3.1.6을 실행하고 폼 렌더링과 함께 이상하게 보입니다. 여기Symfony - ChoiceType float 값

내 양식 :

$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

이 일이 integer 또는 string 만 (PHP Manual). 부동 소수점 키가 제공되면 PHP에 의해 자동으로 here 정수로 형변환됩니다. 정말 isset($cache[1]) 확인하고이 키가 이미 존재하기 때문에 $choice = 1.5this line (isset($cache[1.5])가) true을 반환 다음

$cache[$choice] = true; 

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

, 그래서 castableToString() 반환 false (중복으로 감지) 및 선택 값이 생성되는 증가 된 정수의 예를 살펴 보자 값으로.

나는 버그라고 생각합니다. 지금은

, 그 문제를 해결하기 위해 choice_value 옵션을 사용

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

나는 Github에서이 오래된 문제에 대한 코멘트를 남겼습니다 : https://github.com/symfony/symfony/issues/13817#issuecomment-257297132

이미 고정 된 explaination에 대한 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> 

와 같은 선택 키와 값 (maybe because of this?)에 대한 다음

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

.

선택 목록 생성을 담당하는 클래스는 Symfony/Component/Form/ChoiceList/ArrayChoiceList이므로 여기에 나의 의혹을 말합니다.

그러나, 나는이 각 선택은 값으로 변환되는 방법을 결정하기 때문에 내가 당신을 권 해드립니다이 문제가 ChoiceType 필드의 choice_value option보고 원인을 모르는이 지정되어 있지 않은 경우 그냥 idicies을 증가 사용합니다 . 그래서이 옵션을 사용하여 float를 문자열로 변환하십시오.

참조 : array의 키가 있어야하기 때문에 ArrayChoiceList.php#L83

+1

감사에! – Bouffe