我尝试在CakePHP 3.6.14应用程序中实现this example。
(function( $ ) {
$.widget( "ui.dp", {
_create: function() {
var el = this.element.hide();
this.options.altField = el;
var input = this.input = $('<input>').insertBefore( el )
input.focusout(function(){
if(input.val() == ''){
el.val('');
}
});
input.datepicker(this.options)
if(convertDate(el.val()) != null){
this.input.datepicker('setDate', convertDate(el.val()));
}
},
destroy: function() {
this.input.remove();
this.element.show();
$.Widget.prototype.destroy.call( this );
}
});
var convertDate = function(date){
if(typeof(date) != 'undefined' && date != null && date != ''){
return new Date(date);
} else {
return null;
}
} })( jQuery );
因此在default.ctp
中,我有以下代码:
$(document).ready(function() {
$( "input.datepicker" ).dp({
dateFormat: 'dd/mm/yy',
altFormat: 'yy-mm-dd'
});
});
在edit.ctp
中,我拥有以下控制权:
echo $this->Form->control('created_date', ['class' => 'datepicker', 'type' => 'text', 'empty' => true]);
虽然它正确地提交了日期并将其存储在数据库中,但是当我再次打开编辑页面时,却看到了今天的日期,而不是数据库中的日期。数据库值为:2019-06-27,如果我将dateFormat
选项更改为yy-mm-dd
,我仍然会得到今天的日期,而不是保存在数据库中的日期。
但是在生成的html代码中,我可以看到该值是正确的:
答案 0 :(得分:1)
使用该脚本,您应该在表单控件中使用altFormat
,即dateFormat
是 display 格式,而altFormat
是值格式,并且该格式应为标准ISO格式,因为脚本会尝试将值转换为Date
对象,因此非ISO模式可能会导致错误地解析日期,或者无法对其进行解析根本就是您的价值所在,因为JavaScript Date
parser将第一个数字视为月份,而不是日期。
如果您应用的默认日期字符串转换格式与altFormat
不匹配,则必须手动进行处理,例如对于单个字段,例如:
$value = $this->Form->getSourceValue('created_date');
if ($value instanceof \DateTimeInterface) {
$value = $value->format('Y-m-d');
}
echo $this->Form->control('created_date', [
'class' => 'datepicker',
'type' => 'text',
'val' => $value
]);
还请注意,yy
表示jQuery UI日期选择器中的整年,即2019
,而不是19
,这似乎是您应用的默认设置。如果要使用后者,则需要在y
模式中使用单个dateFormat
。