2017-03-28 25 views
1

我有一個表單類,其中有幾個ChoiceType字段,它們包含一個key:value對的選項數組。表單提交後,值被保存。但是,當我渲染對象時,我想顯示Key值。Symfony2 Form ChoiceType外部數據源

示例:'Monthly'=>'1month'。存儲1個月,更喜歡輸出爲每月。

我試圖避免條件檢查值並將輸出更改爲鍵值。

我無法找到任何關於這類事情的最佳實踐的文檔。我正在考慮創建一個存儲所有選項選項數組的服務,並構建一個樹枝過濾器,用於根據服務中的數組更改呈現的輸出。

我在正確的軌道上還是有更簡單的方法?

回答

0

您可以創建枚舉類,並在你的模板中使用它,就像這樣:

class MyChoicesEnum { 

private static $choices = array(
         'Monthly' => '1month', 
         'Quarterly' => '4month', 
         // etc... 
      ); 

    public static function choices() { 
     return self::$choices; 
    } 


} 

然後你通過類方法結果模板,返回數組中:

... 
'form' => $form->createView() 
'my_choices' => MyChoicesEnum::choices() 

而且在小枝:

{{ my_choices.key }} 
+1

當提交表單時,我將對象存儲到一個會話變量,我可以通過轉儲看到()的會話變量的是#fullPayment:「2周」,#compounding:「每天」都被保存價值不是關鍵。這是與選擇陣列('月'=>'1月','雙週'=>'2周')等 – raupie

+0

你是對的。我檢查了文檔,它在最近的版本中已被更改:http://symfony.com/doc/2.8/reference/forms/types/choice.html#choices-as-values –

0

我試過服務解決方案,並得到它的工作。我不確定它是否是最優雅或有效的方式,但它完成了這項工作。該表單是一種表單類類型,我注入了一個包含選擇數組的服務。

我在FormType文件旁邊的Form文件夾中創建了一個choices.php類文件。它充當一種服務,它將選擇返回給我創建的formType和一個自定義的樹枝擴展過濾器。我必須將formType設置爲服務才能注入選擇服務。

/*choices.php*/ 
public function getChoices($choice) 
{ 
    $choices = array('paymentFrequency' => array('Monthly' => '1month', 
               'Bi-weekly' => '2weeks'), 
        'compounding' => array('Monthly' => 'monthly', 
              'Daily' => 'daily') 
    ); 

    return $choices[$choice]; 
} 

/*formType.php*/ 
->add('paymentFrequency', ChoiceType::class, array(
      'label' => 'Payment Frequency:', 
      'choices' => $this->choicesService->getChoices('paymentFrequency'), 
)) 
->add('compounding', ChoiceType::class, array(
      'label' => 'Compounding:', 
      'choices' => $this->choicesService->getChoices('compounding'), 
)) 

然後我創建了一個自定義的樹枝過濾器函數,其中的選擇服務注入到它。

/*twigExtension.php*/ 
public function renderChoicesFilter($value, $type) 
{ 

    $choices = $this->choicesService->getChoices($type); 

    return array_search($value, $choices); 
} 

/*twig template*/ 
{{ object.paymentFrequency|renderChoices('paymentFrequency') }}