Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript cakephp3.x-Edit:日期在提交时有空字段,尽管它们已经存在_Javascript_Mysql_Cakephp_Save_Daterangepicker - Fatal编程技术网

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
在Sessions表中,我有一个使用Daterangepicker jQuery脚本的日期字段

<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);