如何正确地将日期转换为字符串并以symfony形式返回,以便使用日期选择器

问题描述 投票:1回答:2

在我的Symfony 4应用程序中,我有一个包含日期类型字段的实体。默认情况下,Symfony将其显示为一组月,日,年的选择框。我已将其更改为文本小部件,以便我可以使用jQuery UI日期选择器。

但是我在尝试提交表单时遇到了问题。

这是我的实体上的字段:

/**
 * @ORM\Column(type="date")
 */
private $start_date;

这是我在显示字段的方式:

$builder->add('start_date', DateType::class, [
                'widget' => 'single_text',

                // prevents rendering it as type="date", to avoid HTML5 date pickers
                'html5' => false,

                // adds a class that can be selected in JavaScript
                'attr' => ['class' => 'js-datepicker'],
            ])

在我的页面上使用jquery和jqueryui,这允许显示日期选择器。

这是我目前正在尝试从日期转换为字符串,反之亦然。目前,我只是试图使用一个硬编码的日期,当我知道我在做什么时,我当然会改变。

$builder->get('start_date')
->addModelTransformer(new CallbackTransformer(
    function ( $dateAsString ) {
        return new \DateTime('2019-01-01');
    },
    function ( $dateAsDate ) {
        return '2019-01-01';
    }
));

提交表单会产生此错误:给出“DateTimeInterface”类型的预期参数,“string”。

有没有人有任何想法如何将日期作为日期类型存储在我的实体中,同时在表单中将其作为字符串显示?

symfony symfony-forms
2个回答
3
投票

我邀请你看看documentation of DateType。您会发现,您可以根据input选项以各种格式存储您的日期:

  • 丁字裤(呃2011-06-05)
  • datetime(一个DateTime对象)
  • datetime_immutable(一个DateTimeImmutable对象)
  • 数组(例如['year'=> 2011,'month'=> 06,'day'=> 05])
  • 时间戳(例如1307232000)

这是你实体中潜在的qazxsw poi。在您的示例中,您必须选择qazxsw poi,这是默认值。

你为qazxsw poi选项做出了正确的选择 - qazxsw poi。别忘了设置正确的model value。这是datetime

在您的情况下,您不需要编写自己的数据转换器。 Symfony将负责在widget中改变你的single_text,反之亦然。它通过format使用它:

view value

model value

虽然view valuenormalised value的格式各不相同,但`model data`(string, datetime, timestamp, etc.) -> `norm data` (`DateTime`) -> `view data` (string for widget=single_text, array for widget=choice) 的格式总是相同的 - `view data` (string for widget=single_text, array for widget=choice) -> `norm data` (`DateTime`) -> `model data`(string, datetime, timestamp, etc.) 。您添加的模型转换器返回view data以设置为规范化数据。这就是你得到错误的原因。


1
投票

您可以向formbuilder添加预定义格式,如下所示

model data

在这种情况下你不需要变压器,formbuilder会处理它。

© www.soinside.com 2019 - 2024. All rights reserved.