Javascript cakephp3.x-Edit:日期在提交时有空字段,尽管它们已经存在
我有三张桌子:Javascript cakephp3.x-Edit:日期在提交时有空字段,尽管它们已经存在,javascript,mysql,cakephp,save,daterangepicker,Javascript,Mysql,Cakephp,Save,Daterangepicker,我有三张桌子: 预订(表格所在位置) 会话(其中属性date\u start和date\u end为 在Sessions表中,我有一个使用Daterangepicker jQuery脚本的日期字段 <input class='form-control' type="text" name="daterange" id="daterange" placeholder='Session dates'/> 例如,如果
- 预订(表格所在位置)
- 会话(其中属性
和date\u start
为date\u end
<input class='form-control' type="text" name="daterange" id="daterange"
placeholder='Session dates'/>
例如,如果date\u start=2017-02-02
和date\u end=2017-02-03
,则daterange
表单输入将在转换为我的本地日期格式后显示:
2017年2月2日-2017年2月3日
$booking引用控制器中设置为视图的此语句:
$booking = $this->Bookings->get($id,[
'contain'=>['Sessions']
]);
当我打印$booking->session['date\u start']
或$booking->session['date\u end']
时,我可以看到日期。在CakePHP变量中,我还可以正确地看到日期。只有在提交请求并看到请求数据时,它们才是空的,patchEntity的调试也显示了同样多的内容
例如,如果在使用编辑表单之前,日期开始=2017-02-02和日期结束=2017-02-03,然后执行pr($booking->session['date\u start'])
,我将得到2017年2月2日(本地日期格式)的打印
此外,这些是隐藏的date\u start
和date\u end
输入,如果填充了daterange
输入,则会自动填充这些输入
<?php
echo $this->Form->hidden('session[date_start][year]', ['id' => 'start_year']);
echo $this->Form->hidden('session[date_start][month]', ['id' => 'start_month']);
echo $this->Form->hidden('session[date_start][day]', ['id' => 'start_day']);
echo $this->Form->hidden('session[date_end][year]', ['id' => 'end_year']);
echo $this->Form->hidden('session[date_end][month]', ['id' => 'end_month']);
echo $this->Form->hidden('session[date_end][day]', ['id' => 'end_day']);
?>
预订表的初始化功能如下:
<script>
$(document).ready(function () {
var daterange = '<?= h($booking->session->date_start->i18nFormat('dd/MM/YYYY') . ' - ' . $booking->session->date_end->i18nFormat('dd/MM/YYYY'));?>';
$('#daterange').val(daterange);
});
</script>
public function initialize(array $config)
{
parent::initialize($config);
$this->table('bookings');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Artists', [
'foreignKey' => 'artist_id',
'joinType' => 'INNER'
]);
$this->hasMany('Payments', [
'foreignKey' => 'booking_id'
]);
$this->hasOne('Sessions', [
'foreignKey' => 'booking_id'
]);
}
只有在提交请求并看到请求数据时,它们才是空的
当您将数组代替实体值传递给patchEntity时,可能会发生奇怪/特殊的情况
如您输出的$this->request->data()
所示,有一个设置为date\u start
&end的值,该数组包含:
Array
(
[year] =>
[month] =>
[day] =>
)
调用patchEntity时,它将尝试将$booking->session->date\u start
和date\u end
设置到该数组(['year'=>'','month'=>'','day'=>'')
)
调用patchEntity或newEntity时,CakePHP将更新提供的每个数组键的实体值。即使值为空,或者在本例中包含非空数组,它仍将尝试更新该键的值
由于该字段上的类型可能是日期
,因此在编组值时,它最终会尝试将其类型转换为日期格式的字符串。如果这些键都是空的,它基本上只是删除该数组,将其转换为null
。如果这些键有值,它将把它们转换为日期字符串(如“2017-02-02”)
同样,解决此问题的一种方法是确保不将带有空键的数组传递给patchEntity,请求数据的格式看起来更像:
可能有一个原因,这些是空白提交然而-当他们不应该在第一位。解决这个问题也会解决这个问题,因为他们最终不会制作这个空白数组。根据示例代码检查这些字段的值(
$(“#开始_年”).val()
等),这些字段不应为空。'apply.daterangepicker'
函数是否按预期调用?应用的值(picker.startDate.format('YYYY')
等)是否如预期的那样?您使用的是什么DateRangePicker JS库?你能给我们这个库的链接吗?所以我尝试了这个建议,并在if($this->request->is(['patch','post','put'])之前和之后取消了它们的设置。这两次,date_start和date_end仍然显示为空。如果没有更多信息,很难进一步排除故障。你能发布整个提交功能的代码吗?$this->request->data()的内容以及实体关系(在Bookings表的initalize函数中)也可能对延迟回复很有帮助。我添加了$this->request->data()打印输出,以及预订表的初始化函数。对于提交函数,它相当大,有很多JS和jQuery脚本。如果我在帖子中添加了它,只是表单和表单输入,没有JS&jQuery,除了DateRangePicker之外,已经足够了吗?哦,我的意思是PHP函数也被提交了——但是看看“$this->request->data()”的输出,当你为
date\u start`和date\u end
发送一个数组时,这将在CakePHP中产生一种奇怪的效果。当它调用patchEntity
(假定这就是您保存此文件的方式)时,它将有效地取消设置这两个文件的值。稍后我会更新我的答案来说明这一点。这似乎成功了。谢谢你对此的解释。
public function initialize(array $config)
{
parent::initialize($config);
$this->table('bookings');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Artists', [
'foreignKey' => 'artist_id',
'joinType' => 'INNER'
]);
$this->hasMany('Payments', [
'foreignKey' => 'booking_id'
]);
$this->hasOne('Sessions', [
'foreignKey' => 'booking_id'
]);
}
Array
(
[year] =>
[month] =>
[day] =>
)
$data = $this->request->data();
if(empty($data['session']['date_start']['year']) || empty($data['session']['date_start']['month']) || empty($data['session']['date_start']['day'])) {
unset($data['session']['date_start']);
}
if(empty($data['session']['date_end']['year']) || empty($data['session']['date_end']['month']) || empty($data['session']['date_end']['day'])) {
unset($data['session']['date_end']);
}
$booking = $this->Bookings->patchEntity($booking, $data);