在cakephp 3中使用带有日期选择器的本地化日期格式

时间:2016-09-02 15:40:31

标签: date cakephp datepicker locale cakephp-3.0

我正在构建一个cakephp 3应用程序(cakephp v3.3.2),我在选择的语言环境(de_DE)中显示日期时遇到问题。

我的示例中的数据库字段是invoice_date,其类型为DATE(存储在mysql数据库中)。

我想在网页中使用日期选择器(“zebra_datepicker”),因此在视图中我使用单个文本输入字段作为日期,而不是默认显示的三个下拉菜单:

echo $this->Form->input('invoice_date', [ 'type' => 'text' ]);

要以德语格式dd.mm.YY显示日期,我将全局区域设置更改为

ini_set('intl.default_locale', 'de_DE');
config/bootstrap.php中的

为了进行测试,我在数据库中创建了一条新记录,并将invoice_date设置为2016-09-02(Y-M-D)。

如果我现在调用控制器的edit操作,我会在表单中获得默认值02.09.16,这是正确的。但是,如果我提交表单,则该字段的数据库值将更改为2002-09-16

我是否需要控制器中的一些额外代码才能将日期格式更改回原始格式?这是cakephp的本地化代码中的错误还是我错过了什么?请注意,我的控制器只使用patchEntity来处理发布的数据。

我已经尝试在表对象的validationDefault方法中添加date('invoice_date', 'dmy'),但这并没有改变任何内容:

    $validator
        ->date('invoice_date', 'dmy')
        ->requirePresence('invoice_date', 'create')
        ->notEmpty('invoice_date');

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决问题的方法:在bootstrap.php中,我不得不添加:

Type::build('date')->useLocaleParser();
Type::build('datetime')->useLocaleParser();

这样,我可以输入31.12.16(d.m.y)之类的日期,并将日期正确保存在数据库中。这适用于简单的验证器:

$validator
        ->date('invoice_date')
        ->notEmpty('invoice_date');

为了支持31.12.2016(d.m.Y)这样的日期,我不得不在日期验证器中添加一个额外的参数,如下所示:

$validator
        ->date('invoice_date', 'dmy')
        ->notEmpty('invoice_date');