Symfony2 Form Builder PRE_SET_DATA将Datetime转换为String Date

时间:2014-08-29 18:54:22

标签: php symfony datetime formbuilder

我有一个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包装所有字段。

我不想编辑日期时间表单视图。

第一种选择对我来说更好。

谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案:

解决方案很简单。

当我们看这个图时:

enter image description here

只需将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'));
    }
});