Symfony2特殊的数据转换器

时间:2013-07-14 11:54:18

标签: forms symfony transformer

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

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

如何在Symfony2中编写数据转换器,以便将此日期转换为TWO属性?

4 个答案:

答案 0 :(得分:2)

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

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

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])
        );
    }
}

答案 1 :(得分:0)

你可以像这样使用爆炸功能:

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

然后创建两个新的DateTime。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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