为了账号安全,请及时绑定邮箱和手机立即绑定

数据库中的时间段被预订 php 代码复制而不是跳过

数据库中的时间段被预订 php 代码复制而不是跳过

PHP
慕田峪4524236 2023-04-28 17:43:33
我正在使用 Fullcalendar 4 创建一个预订系统,供客户预订设备维修的标注时段。到目前为止,在此处用户的帮助下,我已经设法让日历对象将预订的时段填充到日历中,而且我几乎也使用单独的 eventSouce 并在 php 上将其添加到免费的未预订时段中服务器端一天中哪些时段被占用并跳过它们。$cDate是 Fullcalendar 发送的请求的 DateTime 转换开始日期。$eDate是 Fullcalendar 发送的请求的 DateTime 转换结束日期。$daysInRange是一个 datediff 变量,我在页面上进一步计算它以查看 $cDate 和 $eDate 之间有多少天。典型的 url 如下来自 ajax 请求:getBookings.php?start=2020-06-05T00%3A00%3A00&end=2020-06-05T00%3A00%3A00&timeZone=Europe%2FLondon$bookingStart = new DateTime( $_GET[ 'start' ] );$bookingEnd = new DateTime( $_GET[ 'end' ] );//Get The Start Date/Time seperately and End Date/Time Seperately.$startdate = date_format( $bookingStart, 'Y-m-d' );$starttime = date_format( $bookingStart, 'H:i:s' );$enddate = date_format( $bookingEnd, 'Y-m-d' );$endtime = date_format( $bookingEnd, 'H:i:s' );上面的代码可以工作,但是例如,如果 2020-06-05 在 09:00:00 - 11:00:00 有一个时段,范围是 2020-06-01 到 2020-06-08 那么我在 5 号上午 9 点到上午 11 点预订了红色时段,绿色时段也是免费时段。我不知道为什么我得到这个..
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

我接近它的方式是:

  1. 在 1 天内创建一系列可用插槽。

  2. 在请求的日期范围内创建一个新的可用时段数组,创建一个包含字段datestartendisbooked的新数组。

    现在我有一个数组,其中包含整个请求日期范围的槽时间和日期,我面临的最后一个问题是如何在 foreach 循环中完成它并更改原始值?我偶然发现了 StackOverflow 上的另一个答案,它为我回答了这个问题,因此,我能够在最终数组上执行最终的 foreach 循环,并遍历每个数据库结果以检查它是否与 foreach 显示的时间段上的日期匹配然后将isbooked标志设置为 true。

最后!我有一组工作代码可以创建我需要的 JSON 返回值。没有重复,只有免费插槽和预订插槽很好地坐在一起。

我的最终代码如下:

    for ( $i = 0; $i <= $daysInRange; $i++ ) {


    //for the current date we need to go through each slot. 

    foreach ( $freeSlots as $slot ) {


        $slotStart = new DateTime( $slot[ 'start' ] );

        $slotEnd = new DateTime( $slot[ 'end' ] );




                $aSlot[ 'date' ] = $cDate->format( "Y-m-d" );

                $aSlot[ 'start' ] = $slotStart->format( "H:i:s" );

                $aSlot[ 'end' ] = $slotEnd->format( "H:i:s" );

                $aSlot[ 'isbooked' ] = false;

                $allSlots[] = $aSlot;   



    }




    //Now add 1 day to the cDate and then check if its greater than the eDate

    $cDate->modify( '+1 Day' );

    if ( $cDate > $eDate ) {

        break;

    }


}

//var_export($allSlots);

#check new array against database and mark booked slots 

foreach($allSlots as &$slot){


    foreach($bookingResult as $booking) {


        if($booking['bookingdate'] == $slot['date'] && $booking['bookingstarttime'] == $slot['start'] && $booking['bookingendtime'] == $slot['end']){

            $slot['isbooked'] = true;

        }


    }


}

//Now booked slots are marked we can now create the JSON.

foreach ( $allSlots as $slot ) {


    $slotStart = new DateTime( $slot[ 'start' ] );

    $slotEnd = new DateTime( $slot[ 'end' ] );

    $slotDate = new DateTime( $slot[ 'date' ] );



    if ( $slot[ 'isbooked' ] == false ) {

        $bookingsAsJSON[ 'title' ] = 'Unbooked Timeslot';

        $bookingsAsJSON[ 'start' ] = $slotDate->format("Y-m-d"). ' ' . $slotStart->format( "H:i:s" );

        $bookingsAsJSON[ 'end' ] = $slotDate->format( "Y-m-d" ) . ' ' . $slotEnd->format( "H:i:s" );

        $bookingsAsJSON[ 'extendedProps' ][ 'bookingActualDate' ] = $slotDate->format( "Y-m-d" );

        $bookingsAsJSON[ 'extendedProps' ][ 'bookingActualStartTime' ] = $slotStart->format( "H:i:s" );

        $bookingsAsJSON[ 'extendedProps' ][ 'bookingActualEndTime' ] = $slotEnd->format( "H:i:s" );

        $calendarEvents[] = $bookingsAsJSON;

    }

}

日历上的输出如下所示:

//img1.sycdn.imooc.com/644b95710001961b06530367.jpg

查看完整回答
反对 回复 2023-04-28
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信