我有一个datetime字段,我正在使用jquery datepicker在文本字段中选择日期 (输入[类型=文本)。
当我想创建新记录时,没有问题。当我想编辑该记录时,我必须将日期时间数据设置为文本日期格式(Y-m-d)并打印到文本字段。
我的字段(在orm.yml中):
released_at:
type: datetime
nullable: true
我的表单构建器:
$builder->add(
'releasedAt',
null,
[
'label' => 'Çıkış Tarihi',
'mapped' => false, // false because setting the datetime data in the controller
'attr' => ['class' => 'date-picker']
]
);
我的表单pre_set_data:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$game = $event->getData();
if ($game instanceof Game) {
$datetime = $game->getReleasedAt();
$form->get('releasedAt')->setData(\Datetime::createFromFormat('Y-m-d', $datetime->format('Y-m-d')));
} else {
return;
}
});
错误:
表单的视图数据应该是标量,数组或类型 \ ArrayAccess的实例,但是是DateTime类的实例。您 通过将“data_class”选项设置为“DateTime”可以避免此错误 或者通过添加转换类实例的视图转换器 DateTime到标量,数组或\ ArrayAccess的实例。
这里有什么问题?
----编辑----
我也试过这个:
$builder->add(
'releasedAt',
'datetime',
[
'label' => 'Çıkış Tarihi',
'date_widget' => 'single_text',
'date_format'=>'y-M-d',
'attr' => ['class' => 'date-picker']
]
)
但视图显示时间选择并用div包装所有字段。
我不想编辑日期时间表单视图。
第一种选择对我来说更好。
谢谢!
答案 0 :(得分:0)
解决方案:
解决方案很简单。
当我们看这个图时:
只需将PRE_SET_DATA更改为POST_SET_DATA。
代码:
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$game = $event->getData();
if($game === null || $game->getId() === null)
return;
if ($game instanceof Game) {
$datetime = $game->getReleasedAt();
$form->get('releasedAt')->setData($game->getReleasedAt()->format('Y-m-d'));
}
});