我有一个带有dateFrom和dateTo属性的实体日历。
现在,在我的表单中,我有一个隐藏的输入日期格式如下:2010-01-01,2011-01-01。
如何在Symfony2中编写数据转换器,以便将此日期转换为TWO属性?
答案 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。