1

繰り返しイベントをスケジュールできる予約ツールがあります。私は毎日と毎週の繰り返しを理解することができましたが、月のさまざまな日のために毎月の繰り返しに電話を切りました.

目標は、たとえば毎月第 3 木曜日に予約を繰り返すことです。簡単な計算を使用して 28 の間隔でスケジュールすることでそれが得られたと思ったのですが、うまくいきませんでした。私のコードには追加の変数が必要だと思います。

数値を渡すフォームがあり、毎日および毎週の繰り返しについて述べたように機能しました。毎月の値として 28 を超えたことがわかりますが、問題が発生します。同じ日に繰り返されますが、時間の経過とともに間違った週に繰り返されます。

        <input type="radio" class="radio" name="recurring_span" value="1" checked="checked"/><img src='images/icons/calendar-select-days-span.png' alt='daily' title='Daily'>&nbsp;
    <input type="radio" class="radio" name="recurring_span" value="7"><img src='images/icons/calendar-select-days.png' alt='weekly' title='Weekly'/>&nbsp;
    <input type="radio" class="radio" name="recurring_span" value="28"><img src='images/icons/calendar-select-days.png' alt='montly' title='Monthly'/>
    </p>

処理の php は次のとおりです (入れすぎて申し訳ありませんが、PHP はあまり得意ではないと言ったので、少ないより多いほうがよいと考えました)。

//store recurring reservation
        if ($recurring_date > $reservation_date){
            $repeatid = querySQL('res_repeat');
            $keys[] = 'repeat_id';
            $values[] = "'".$repeatid."'";
        }

        // UNIX time
        $res_dat = mktime(0,0,0,(int)$m1,(int)$d1,(int)$y1);
        $recurring_date = mktime(0,0,0,(int)$m2,(int)$d2,(int)$y2);
        $recurring_date = ($recurring_date<$res_dat) ? $res_dat : $recurring_date;

        // daily or weekly recurring?
        $recurring_span = ($_POST['recurring_span']) ? $_POST['recurring_span'] : 1;

        //cut both " ' " from reservation_pax
        $res_pax = substr($_SESSION['reservation_pax'], 0, -1);
        $res_pax = substr($_SESSION['reservation_pax'], 1);

        // check if pax not '0'; prevent 'Christof Keller' bug
        if ($res_pax < 1) {
            $res_pax = 1;
        }
        //cut both " ' " from reservation_time
        $startvalue = $_SESSION['reservation_time'];
        $startvalue = substr($startvalue, 0, -1);
        $startvalue = substr($startvalue, 1);

        // do not subtract pax and table when reservation is moved
        //$res_pax = ($_SESSION['outletID'] == $_POST['old_outlet_id']) ? $res_pax : $res_pax*2;
        //$res_tbl = ($_SESSION['outletID'] == $_POST['old_outlet_id']) ? 1 : 2;

    // main loop to store all reservations ( one or recurring)  
     while ( $res_dat <= $recurring_date) {

        // build new reservation date
        $index = '';
        $index = array_search('reservation_date',$keys);
        // build for availability calculation
        $_SESSION['selectedDate'] = date('Y-m-d',$res_dat);
        if($index){
            $values[$index] = "'".$_SESSION['selectedDate']."'";
        }else{
            $keys[] = 'reservation_date';
            $values[] = "'".$_SESSION['selectedDate']."'";
        }
        $index = '';
        $index = array_search('reservation_wait',$keys);
        if($index){
            $values[$index] = '1';
        }       

        //Check Availability
        // =-=-=-=-=-=-=-=-=

        // get Pax by timeslot
        $resbyTime = reservationsByTime('pax');
        $tblbyTime = reservationsByTime('tbl');
        // get availability by timeslot
        $occupancy = getAvailability($resbyTime,$general['timeintervall']);
        $tbl_occupancy = getAvailability($tblbyTime,$general['timeintervall']);               

        $val_capacity = $_SESSION['outlet_max_capacity']-$occupancy[$startvalue];
        $tbl_capacity = $_SESSION['outlet_max_tables']-$tbl_occupancy[$startvalue]; 

        if( $res_pax > $val_capacity || $tbl_capacity  < 1 ){
            //prevent double array entry    
            $index = array_search('reservation_wait',$keys);
            if($index>0){
                if ($values[$index] == '0') {
                  // error on edit entry
                  $_SESSION['errors'][] = date($general['dateformat'],strtotime($_SESSION['selectedDate']))." "._wait_list;
                }               
                  $values[$index] = '1'; // = waitlist
            }else{
                  // error on new entry
                  $keys[] = 'reservation_wait';
                  $values[] = '1'; // = waitlist
                  $_SESSION['errors'][] = date($general['dateformat'],strtotime($_SESSION['selectedDate']))." "._wait_list; 
            }
        }
        // END Availability

        // number of database fields
        $max_keys = count($keys);
        // enter into database
        // -----
        $query = "INSERT INTO `$dbTables->reservations` (".implode(',', $keys).") VALUES (".implode(',', $values).") ON DUPLICATE KEY UPDATE ";
        // Build 'on duplicate' query
        for ($i=1; $i <= $max_keys; $i++) {
            if($keys[$i]!=''){
                $query .= $keys[$i]."=".$values[$i].",";
            }else{
                $max_keys++;
            }
        }
        // run sql query 
        //echo "Query: ".$query;                
        $query = substr($query,0,-1);                  
        $result = query($query);
        $new_id = mysql_insert_id();
        $_SESSION['result'] = $result;

        // setup the right ID
        if( isset($new_id) || $new_id != $_POST['reservation_id']){
            $history_id = $new_id;
        }else{
            $history_id = $_POST['reservation_id'];
        }
        // store changes in history
        $result = query("INSERT INTO `$dbTables->res_history` (reservation_id,author) VALUES ('%d','%s')",$history_id,$_POST['reservation_booker_name']);

        // -----
        // increase reservation date one day or week
        $d1 += $recurring_span;
        $res_dat = mktime(0,0,0,$m1,$d1,$y1);

     } // end while: reservation to store

私は PHP があまり得意ではなく、学習しようとしているわけではありません。私の経験は、既存のコードに出くわす作業に限られています。このプロジェクトでは、オープンソースのスケジューリング ツールを自分のニーズに合わせてカスタマイズおよび変更する作業を行ってきました。mktime を調査してもあまり進展がありません。前もって感謝します!

4

0 に答える 0