Symfony2表单ChoiceType外部数据源

时间:2017-03-28 11:54:36

标签: php symfony symfony-forms

我有一个带有几个ChoiceType字段的表单类,这些字段包含一个带有键:值对的选项数组。提交表单后,将保存该值。但是,当我渲染对象时,我希望显示Key值。

示例:'每月' => '1个月&#39 ;.存储1个月,更喜欢输出为每月。

我试图避免条件检查值并将输出更改为键值。

我无法找到有关此类事情的最佳做法的任何文档。我正在考虑创建一个存储所有选项数组的服务,并构建一个twig过滤器,用于根据服务中的数组更改呈现的输出。

我是在正确的轨道上还是有更简单的方法?

2 个答案:

答案 0 :(得分: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 :(得分: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') }}