我有一个具有 dateFrom 和 dateTo 属性的实体日历。
现在在我的表单中,我有一个隐藏的输入,其日期格式如下:2010-01-01,2011-01-01。
如何在 Symfony2 中编写一个数据转换器,允许我将此日期转换为两个属性?
我有一个具有 dateFrom 和 dateTo 属性的实体日历。
现在在我的表单中,我有一个隐藏的输入,其日期格式如下:2010-01-01,2011-01-01。
如何在 Symfony2 中编写一个数据转换器,允许我将此日期转换为两个属性?
我认为转换器本身与“属性”无关,它只是处理从数据结构到另一个数据结构的转换。您只需要处理代码库中的新数据结构。
变压器本身可能看起来像这样:
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])
);
}
}
您可以像这样使用explode函数:
$dates = explode(",", "2010-01-01,2011-01-01");
echo $dates[0]; // 2010-01-01
echo $dates[1]; // 2011-01-01
然后创建两个新的 DateTime。
我通过向我的实体添加自定义 getter/setter(例如,getDateIntervalString 和 setDateIntervalString)解决了类似的问题。getter 将 dateTo 和 dateFrom 转换为间隔字符串并返回,setter 接受类似格式的字符串并使用它来设置 dateTo 和 dateFrom。然后,将字段添加到表单中,如下所示:
$builder->add('dates', 'text', ['property_path' => 'date_interval_string'])
通过覆盖属性路径,将使用您的自定义 getter 和 setter。
如果可能,请使用 2 个隐藏字段。然后在每个字段上使用 DateTime 到 String 数据转换器。然后您的表单在逻辑上映射到您的实体。