【问题标题】:Symfony2 particular data transformerSymfony2 特定的数据转换器
【发布时间】:2014-08-15 01:01:08
【问题描述】:

我有一个具有 dateFrom 和 dateTo 属性的实体日历。

现在在我的表单中,我有一个隐藏的输入,其日期格式如下:2010-01-01,2011-01-01。

如何在 Symfony2 中编写一个数据转换器,允许我将此日期转换为两个属性?

【问题讨论】:

    标签: forms symfony transformer


    【解决方案1】:

    我认为转换器本身与“属性”无关,它只是处理从一个数据结构到另一个数据结构的转换。您只需处理代码库中的新数据结构。

    变压器本身可能看起来像这样:

    class DateRangeArrayToDateRangeStringTransformer implements DataTransformerInterface
    {
        /**
         * Transforms an array of \DateTime instances to a string of dates.
         *
         * @param  array|null $dates
         * @return string
         */
        public function transform($dates)
        {
            if (null === $dates) {
                return '';
            }
    
            $datesStr = $dates['from']->format('Y-m-d').','.$dates['to']->format('Y-m-d');
    
            return $datesStr;
        }
    
        /**
         * Transforms a string of dates to an array of \DateTime instances.
         *
         * @param  string $datesStr
         * @return array
         */
        public function reverseTransform($datesStr)
        {
            $dates = array();
            $datesStrParts = explode(',', $datesStr);
    
            return array(
                'from' => new \DateTime($datesStrParts[1]),
                'to'   => new \DateTime($datesStrParts[2])
            );
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以像这样使用explode函数:

      $dates = explode(",", "2010-01-01,2011-01-01");
      echo $dates[0]; // 2010-01-01
      echo $dates[1]; // 2011-01-01
      

      然后新建两个DateTime。

      【讨论】:

      • 它与主题有什么关系?
      【解决方案3】:

      如果可能,请使用 2 个隐藏字段。然后在每个字段上使用 DateTime 到 String 数据转换器。然后您的表单在逻辑上映射到您的实体。

      【讨论】:

        【解决方案4】:

        我通过向我的实体添加自定义 getter/setter(例如,getDateIntervalString 和 setDateIntervalString)解决了类似的问题。 getter 将 dateTo 和 dateFrom 转换为间隔字符串并返回,setter 接受类似格式的字符串并使用它来设置 dateTo 和 dateFrom。然后,像这样将字段添加到表单中:

        $builder->add('dates', 'text', ['property_path' => 'date_interval_string'])
        

        通过覆盖属性路径,将使用您的自定义 getter 和 setter。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 1970-01-01
          • 2017-11-23
          相关资源
          最近更新 更多