1

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

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

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

4

4 回答 4

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])
        );
    }
}
于 2013-08-01T09:47:52.733 回答
0

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

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

然后创建两个新的 DateTime。

于 2013-07-14T16:32:25.383 回答
0

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

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

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

于 2014-08-14T17:01:08.343 回答
0

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

于 2014-01-12T10:13:08.577 回答