【问题标题】:Symfony2 Form Builder PRE_SET_DATA Convert Datetime to String DateSymfony2 表单生成器 PRE_SET_DATA 将日期时间转换为字符串日期
【发布时间】:2014-08-29 18:54:21
【问题描述】:

我有一个日期时间字段,我正在使用 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 包装所有字段。

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

第一个选项更适合我。

谢谢!

【问题讨论】:

    标签: php symfony datetime formbuilder


    【解决方案1】:

    解决方案:

    解决方案很简单。

    当我们看这张图时:

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

    【讨论】:

    • 图中的“标准化”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2021-05-31
    • 2019-04-12
    • 2011-09-08
    • 2015-03-24
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多