2014-09-03 103 views
0

我正在爲fullcalendar處理週期性事件後端,並且遇到了一個奇怪的問題。FullCalendar週期性事件數組

我的事件計算在一個名爲events.php的頁面上。日曆顯示在index.php上,並從events.php中調用事件。我在events.php上的函數爲循環事件輸出正確的字符串,但index.php上的日曆僅顯示每個循環中的第一個事件。但是,如果我複製數組產生的字符串並將其直接粘貼到events.php頁面並註釋掉render_fccalendar_events();函數並在生成字符串的events.php結尾,日曆將正確顯示所有重複事件。從我可以看到的功能的輸出,以及我粘貼到頁面中的東西都是在index.php上提供日曆完全一樣的東西。顯然有一些區別,因爲它沒有渲染它們。任何想法在這個世界上發生了什麼?

這是events.php代碼:

<?php require_once('../../Connections/local_i.php'); 
require_once('../../webassist/mysqli/rsobj.php'); 
global $wpdb; 
$wpdb = new WA_MySQLi_RS("wpdb",$local_i,0); 
$wpdb->setQuery("SELECT wpdb.id, wpdb.location, wpdb.name, wpdb.description, wpdb.recurrence, wpdb.start_date, wpdb.end_date, wpdb.repeat, wpdb.repeat_desk, wpdb.occurrence, wpdb.occurrence_desk FROM wpdb"); 
$wpdb->execute(); 
ini_set('display_errors', '0'); 
function render_fccalendar_events() { 
     $_POST['start'] = (isset($_POST['start']) ? $_POST['start'] : strtotime('2014-09-01')); 
     $_POST['end'] = (isset($_POST['end']) ? $_POST['end'] : strtotime('2014-09-30')); 
     $start = date('Y-m-d',$_POST['start']); 
     $end = date('Y-m-d', $_POST['end']); 
     $readonly = (isset($_POST['readonly'])) ? true : false;  
     $events = fcdb_query_events($start, $end);  
     render_json(process_events($events, $start, $end, $readonly)); 
} 

function process_events($events, $start, $end, $readonly) { 
    if ($events) { 
     $output = array(); 
     foreach ($events as $event) { 
      $event->view_start = $start; 
      $event->view_end = $end; 
      $event = process_event($event, $readonly, true); 
      if (is_array($event)) { 
       foreach ($event as $repeat) { 
        array_push($output, $repeat); 
       } 
      } else { 
       array_push($output, $event); 
      } 
     } 
     return $output; 
    } 
} 

function process_event($input, $readonly = false, $queue = false) { 
    $output = array(); 
    if ($repeats = generate_repeating_event($input)) { 
     foreach ($repeats as $repeat) { 
      array_push($output, generate_event($repeat)); 
     } 
    } else { 
     array_push($output, generate_event($input)); 
    } 

    if ($queue) { 
     return $output; 
    } 
    render_json($output); 
} 


function generate_event($input) { 
    $output = array(
     'id' => $input->id, 
     'title' => $input->name, 
     'start' => $input->start_date, 
     'end' => $input->end_date, 
     'allDay' => ($input->allDay) ? true : false, 
     //'className' => "cat{$repeats}", 
     'editable' => true, 
     'repeat_i' => $input->repeat_int, 
     'repeat_f' => $input->repeat_freq, 
     'repeat_e' => $input->repeat_end 
    ); 
    return $output; 
} 



function generate_repeating_event($event) { 

    $repeat_desk = json_decode($event->repeat_desk); 
    if ($event->repeat == "daily") { 
     $event->repeat_int =0; 
     $event->repeat_freq = $repeat_desk->every_day; 
    } 
    if ($event->repeat == "monthly") { 
     $event->repeat_int =2;   
     $event->repeat_freq = $repeat_desk->every_month; 
    } 
    if ($event->repeat == "weekly") { 
     $event->repeat_int =1;     
     $event->repeat_freq = $repeat_desk->every_week; 
    } 
    if ($event->repeat == "year") { 
     $event->repeat_int =3;       
     $event->repeat_freq = $repeat_desk->every_year; 
    } 

    if ($event->occurrence == "after-no-of-occurrences") { 
     if($event->repeat_int == 0){ 
      $ext = "days"; 
     } 
     if($event->repeat_int == 1){ 
      $ext = "weeks"; 
     } 
     if($event->repeat_int == 2){ 
      $ext = "months"; 
     } 
     if($event->repeat_int == 3){ 
      $ext = "years"; 
     } 
     $event->repeat_end = date('Y-m-d',strtotime("+" . $event->repeat_int . " ".$ext)); 
    } else if ($event->occurrence == "no-end-date") { 
     $event->repeat_end = "2023-04-13"; 
    } else if ($event->occurrence == "end-by-end-date") { 
     $event->repeat_end = $event->end_date; 
    } 



    if ($event->repeat_freq) { 

     $event_start = strtotime($event->start_date); 
     $event_end = strtotime($event->end_date); 
     $repeat_end = strtotime($event->repeat_end) + 86400; 
     $view_start = strtotime($event->view_start); 
     $view_end = strtotime($event->view_end); 
     $repeats = array(); 
     while ($event_start < $repeat_end) { 
      if ($event_start >= $view_start && $event_start <= $view_end) { 
       $event = clone $event; // clone event details and override dates 
       $event->start_date = date('Y-m-d', $event_start); 
       $event->end_date = date('Y-m-d', $event_end); 
       array_push($repeats, $event); 
      } 
      $event_start = get_next_date($event_start, $event->repeat_freq, $event->repeat_int); 
      $event_end = get_next_date($event_end, $event->repeat_freq, $event->repeat_int); 
     } 
     return $repeats; 
    } 
    return false; 
} 

function get_next_date($date, $freq, $int) { 
    if ($int == 0) 
     return strtotime("+" . $freq . " days", $date); 
    if ($int == 1) 
     return strtotime("+" . $freq . " weeks", $date); 
    if ($int == 2) 
     return get_next_month($date, $freq); 
    if ($int == 3) 
     return get_next_year($date, $freq); 
} 

function get_next_month($date, $n = 1) { 
    $newDate = strtotime("+{$n} months", $date); 
    // adjustment for events that repeat on the 29th, 30th and 31st of a month 
    if (date('j', $date) !== (date('j', $newDate))) { 
     $newDate = strtotime("+" . $n + 1 . " months", $date); 
    } 
    return $newDate; 
} 

function get_next_year($date, $n = 1) { 
    $newDate = strtotime("+{$n} years", $date); 
    // adjustment for events that repeat on february 29th 
    if (date('j', $date) !== (date('j', $newDate))) { 
     $newDate = strtotime("+" . $n + 3 . " years", $date); 
    } 
    return $newDate; 
} 

function render_json($output) { 
    header("Content-Type: application/json"); 
    echo json_encode(cleanse_output($output)); 
    exit; 
} 


function cleanse_output($output) { 
    if (is_array($output)) { 
     array_walk_recursive($output, create_function('&$val', '$val = trim(stripslashes($val));')); 
    } else { 
     $output = stripslashes($output); 
    } 
    return $output; 
} 

function fcdb_query_events($start, $end) { 
    global $wpdb; 
    $result = array(); 
// $limit = ($limit) ? " LIMIT {$limit}" : ""; 
while(!$wpdb->atEnd()) { 
    $item = new stdClass; 
     $item->id = $wpdb->getColumnVal('id'); 
     $item->location = $wpdb->getColumnVal('location'); 
     $item->name = $wpdb->getColumnVal('name'); 
     $item->description = $wpdb->getColumnVal('description'); 
     $item->recurrence = $wpdb->getColumnVal('recurrence'); 
     $item->start_date = $wpdb->getColumnVal('start_date'); 
     $item->end_date = $wpdb->getColumnVal('end_date'); 
     $item->repeat = $wpdb->getColumnVal('repeat'); 
     $item->repeat_desk = $wpdb->getColumnVal('repeat_desk'); 
     $item->occurrence = $wpdb->getColumnVal('occurrence'); 
     $item->occurrence_desk = $wpdb->getColumnVal('occurrence_desk'); 
     $item->allDay = false; 
     $result[] = $item; 
      $wpdb->moveNext(); 
} 
$wpdb->moveFirst(); //return RS to first record 
    return return_result($result); 
} 
function return_result($result) { 
    if ($result === false) { 
     global $wpdb; 
     $this->log($wpdb->print_error()); 
     return false; 
    } 
    return $result; 
} 
render_fccalendar_events();?> 

這是events.php頁的輸出

[{"id":"1","title":"test event","start":"2014-09-01","end":"2014-09-01","allDay":"","editable":"1","repeat_i":"1","repeat_f":"3","repeat_e":"2023-04-13"},{"id":"1","title":"test event","start":"2014-09-22","end":"2014-09-22","allDay":"","editable":"1","repeat_i":"1","repeat_f":"3","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-04","end":"2014-09-04","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-06","end":"2014-09-06","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-08","end":"2014-09-08","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-10","end":"2014-09-10","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-12","end":"2014-09-12","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-14","end":"2014-09-14","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-16","end":"2014-09-16","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-18","end":"2014-09-18","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-20","end":"2014-09-20","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-22","end":"2014-09-22","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-24","end":"2014-09-24","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-26","end":"2014-09-26","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"2","title":"test 2","start":"2014-09-28","end":"2014-09-28","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"},{"id":"3","title":"test 2","start":"2014-10-04 13:00:00","end":"2014-10-04 14:00:00","allDay":"","editable":"1","repeat_i":"0","repeat_f":"2","repeat_e":"2023-04-13"}] 

這是調用了events.php輸出的index.php代碼:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      defaultDate: '<?php echo date('Y-m-d'); ?>', 
      editable: true, 
      events: { 
       url: 'events.php', 
       type: 'POST' 
      }, 
      error: function() { 
      alert('there was an error while fetching events!'); 
     } 
     }); 

    }); 
    </script> 
+0

如果只有第一個事件被渲染,似乎你可以在'process_event的問題()',它應該'返回$輸出;'但代替'render_json ($輸出);'。你能確定在這個函數中'$ queue'是否爲'true'? – 2014-09-03 19:20:36

+0

$隊列是錯誤的。將其更改爲true,但最終結果沒有差異。 – 2014-09-04 20:51:47

回答

0

這似乎工作。

<?php require_once('../../Connections/local_i.php'); 
require_once('../../webassist/mysqli/rsobj.php'); 
global $wpdb; 
$wpdb = new WA_MySQLi_RS("wpdb",$local_i,0); 
$wpdb->setQuery("SELECT wpdb.id, wpdb.location, wpdb.name, wpdb.description, wpdb.recurrence, wpdb.start_date, wpdb.end_date, wpdb.repeat, wpdb.repeat_desk, wpdb.occurrence, wpdb.occurrence_desk, wpdb.repeat_key FROM wpdb"); 
$wpdb->execute(); 
ini_set('display_errors', '0'); 
function render_fccalendar_events() { 
     //$_POST['start'] = (isset($_POST['start']) ? strtotime($_POST['start']) : strtotime('2014-09-01')); 
//  $_POST['end'] = (isset($_POST['end']) ? strtotime($_POST['end']) : strtotime('2014-09-30')); 
     $_POST['start'] = strtotime($_POST['start']); 
     $_POST['end'] = strtotime($_POST['end']); 
     $start = date('Y-m-d',$_POST['start']); 
     $end = date('Y-m-d', $_POST['end']); 
     $readonly = (isset($_POST['readonly'])) ? true : false;  
     $events = fcdb_query_events($start, $end);  
     render_json(process_events($events, $start, $end, $readonly)); 
} 

function process_events($events, $start, $end, $readonly) { 
    if ($events) { 
     $output = array(); 
     foreach ($events as $event) { 
      $event->view_start = $start; 
      $event->view_end = $end; 
      $event = process_event($event, $readonly, true); 
      if (is_array($event)) { 
       foreach ($event as $repeat) { 
        array_push($output, $repeat); 
       } 
      } else { 
       array_push($output, $event); 
      } 
     } 
     return $output; 
    } 
} 

function process_event($input, $readonly = false, $queue = false) { 
    $output = array(); 
    if ($repeats = generate_repeating_event($input)) { 
     foreach ($repeats as $repeat) { 
      array_push($output, generate_event($repeat)); 
     } 
    } else { 
     array_push($output, generate_event($input)); 
    } 

    if ($queue) { 
     return $output; 
    } 
    render_json($output); 
} 


function generate_event($input) { 
    $output = array(
     'id' => $input->id, 
     'title' => $input->name, 
     'start' => $input->start_date, 
     'end' => $input->end_date, 
     'allDay' => ($input->allDay) ? true : false, 
     //'className' => "cat{$repeats}", 
     'editable' => true, 
     'repeat_i' => $input->repeat_int, 
     'repeat_f' => $input->repeat_freq, 
     'repeat_e' => $input->repeat_end 
    ); 
    return $output; 
} 



function generate_repeating_event($event) { 

    $repeat_desk = json_decode($event->repeat_desk); 
    if ($event->repeat == "daily") { 
     $event->repeat_int =0; 
     $event->repeat_freq = $repeat_desk->every_day; 
    } 
    if ($event->repeat == "monthly") { 
     $event->repeat_int =2;   
     $event->repeat_freq = $repeat_desk->every_month; 
    } 
    if ($event->repeat == "weekly") { 
     $event->repeat_int =1;     
     $event->repeat_freq = $repeat_desk->every_week; 
    } 
    if ($event->repeat == "year") { 
     $event->repeat_int =3;       
     $event->repeat_freq = $repeat_desk->every_year; 
    } 

    if ($event->occurrence == "after-no-of-occurrences") { 
     if($event->repeat_int == 0){ 
      $ext = "days"; 
     } 
     if($event->repeat_int == 1){ 
      $ext = "weeks"; 
     } 
     if($event->repeat_int == 2){ 
      $ext = "months"; 
     } 
     if($event->repeat_int == 3){ 
      $ext = "years"; 
     } 
     $event->repeat_end = date('Y-m-d',strtotime("+" . $event->repeat_int . " ".$ext)); 
    } else if ($event->occurrence == "no-end-date") { 
     $event->repeat_end = "2023-04-13"; 
    } else if ($event->occurrence == "end-by-end-date") { 
     $event->repeat_end = $event->end_date; 
    } 



    if ($event->repeat_freq) { 
     // explode skipped events string (from database) into array $list_of_skipped_events 
     $event_start = strtotime($event->start_date); 
     $event_end = strtotime($event->end_date); 
     $repeat_end = strtotime($event->repeat_end) + 86400; 
     $view_start = strtotime($event->view_start); 
     $view_end = strtotime($event->view_end); 
     $repeats = array(); 
     $counter = 1; 
     while ($event_start < $repeat_end) { 
      if ($event_start >= $view_start && $event_start <= $view_end) { 
       $event = clone $event; // clone event details and override dates 
       $event->start_date = date('Y-m-d', $event_start); 
       $event->end_date = date('Y-m-d', $event_end); 
       //if counter is in list of events to skip, don't do the next line 
       //if(! in_array($counter, $list_of_skipped_events)) 
       array_push($repeats, $event); 
      } 
      $event_start = get_next_date($event_start, $event->repeat_freq, $event->repeat_int); 
      $event_end = get_next_date($event_end, $event->repeat_freq, $event->repeat_int); 
      $counter++; 

     } 
     return $repeats; 
    } 
    return false; 
} 

function get_next_date($date, $freq, $int) { 
    if ($int == 0) 
     return strtotime("+" . $freq . " days", $date); 
    if ($int == 1) 
     return strtotime("+" . $freq . " weeks", $date); 
    if ($int == 2) 
     return get_next_month($date, $freq); 
    if ($int == 3) 
     return get_next_year($date, $freq); 
} 

function get_next_month($date, $n = 1) { 
    $newDate = strtotime("+{$n} months", $date); 
    // adjustment for events that repeat on the 29th, 30th and 31st of a month 
    if (date('j', $date) !== (date('j', $newDate))) { 
     $newDate = strtotime("+" . $n + 1 . " months", $date); 
    } 
    return $newDate; 
} 

function get_next_year($date, $n = 1) { 
    $newDate = strtotime("+{$n} years", $date); 
    // adjustment for events that repeat on february 29th 
    if (date('j', $date) !== (date('j', $newDate))) { 
     $newDate = strtotime("+" . $n + 3 . " years", $date); 
    } 
    return $newDate; 
} 

function render_json($output) { 
    header("Content-Type: application/json"); 
    echo json_encode(cleanse_output($output)); 
    exit; 
} 


function cleanse_output($output) { 
    if (is_array($output)) { 
     array_walk_recursive($output, create_function('&$val', '$val = trim(stripslashes($val));')); 
    } else { 
     $output = stripslashes($output); 
    } 
    return $output; 
} 

function fcdb_query_events($start, $end) { 
    global $wpdb; 
    $result = array(); 
// $limit = ($limit) ? " LIMIT {$limit}" : ""; 
while(!$wpdb->atEnd()) { 
    $item = new stdClass; 
     $item->id = $wpdb->getColumnVal('id'); 
     $item->location = $wpdb->getColumnVal('location'); 
     $item->name = $wpdb->getColumnVal('name'); 
     $item->description = $wpdb->getColumnVal('description'); 
     $item->recurrence = $wpdb->getColumnVal('recurrence'); 
     $item->start_date = $wpdb->getColumnVal('start_date'); 
     $item->end_date = $wpdb->getColumnVal('end_date'); 
     $item->repeat = $wpdb->getColumnVal('repeat'); 
     $item->repeat_desk = $wpdb->getColumnVal('repeat_desk'); 
     $item->occurrence = $wpdb->getColumnVal('occurrence'); 
     $item->occurrence_desk = $wpdb->getColumnVal('occurrence_desk'); 
     $item->allDay = false; 
     $result[] = $item; 
      $wpdb->moveNext(); 
} 
$wpdb->moveFirst(); //return RS to first record 
    return return_result($result); 
} 
function return_result($result) { 
    if ($result === false) { 
     global $wpdb; 
     $this->log($wpdb->print_error()); 
     return false; 
    } 
    return $result; 
} 
render_fccalendar_events();?> 

<script type="text/javascript"> 
    $(document).ready(function() { 

     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      defaultDate: '<?php echo date('Y-m-d'); ?>', 
      editable: true, 
      events: { 
       url: 'events.php', 
       type: 'POST' 
      }, 
      error: function() { 
      alert('there was an error while fetching events!'); 
     } 
     }); 

    }); 
    </script>