2016-02-22 50 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'; 
    } 
}