【问题标题】:Symfony2 Form ChoiceType External DatasourceSymfony 表单 ChoiceType 外部数据源
【发布时间】:2017-03-28 11:54:36
【问题描述】:

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

示例:“每月”=>“1 个月”。存储 1 个月,希望输出为每月。

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

我找不到任何有关此类事情最佳实践的文档。我正在考虑创建一个存储所有选择选项数组的服务,并构建一个树枝过滤器,用于根据服务中的数组更改渲染输出。

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

【问题讨论】:

    标签: php symfony symfony-forms


    【解决方案1】:

    我尝试了服务解决方案并使其正常工作。我不确定这是否是最优雅或最有效的方式,但它确实完成了工作。该表单是一个表单类类型,我注入了一个包含选择数组的服务。

    我在 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'),
     ))
    

    然后我创建了一个自定义 twig 过滤器函数,其中将选择服务注入其中。

    /*twigExtension.php*/
    public function renderChoicesFilter($value, $type)
    {
    
        $choices = $this->choicesService->getChoices($type);
    
        return array_search($value, $choices);
    }
    
    /*twig template*/
    {{ object.paymentFrequency|renderChoices('paymentFrequency') }}
    

    【讨论】:

      【解决方案2】:

      您可以创建枚举器类并在模板中使用它,如下所示:

      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 }}
      

      【讨论】:

      • 提交表单后,我将对象存储到会话变量中,我可以通过该会话变量的 dump() 看到 #fullPayment: "2weeks", #compounding: "daily" 是与值而不是键一起保存。选择数组为 ('Monthly' => '1month', 'Bi-weekly' => '2weeks') 等
      • 你是对的。我检查了文档,它在最近的版本中有所改变:symfony.com/doc/2.8/reference/forms/types/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多