示例#1
0
 function add_coho_recurrence_items(&$eventArray, $calIds, $user, $tstart, $tstop, $offset, $maxRecords, $sort_mode = 'start_asc', $find = '', $customs = array())
 {
     global $prefs;
     if (count($calIds) == 0) {
         return;
     }
     $where = array();
     $bindvars = array();
     foreach ($calIds as $calendarId) {
         $where[] = "i.`calendarId`=?";
         $bindvars[] = (int) $calendarId;
     }
     $cond = "(" . implode(" or ", $where) . ") and ";
     // find all recurrences that intersect with the desired range
     $cond .= " (i.`startPeriod` < ? and (i.`endPeriod` > ? or i.`endPeriod` = 0 or i.`endPeriod` IS NULL))";
     $bindvars[] = (int) $tstop;
     $bindvars[] = (int) $tstart;
     $cond .= " and ((c.`personal`='y' and i.`user`=?) or c.`personal` != 'y')";
     $bindvars[] = $user;
     $query = "select i.`recurrenceId` as `recurrenceId`, i.`calendarId` as `calendarId`, i.`startPeriod` as `recurrenceStart`, i.`endPeriod` as `recurrenceEnd` ";
     $tblRef = "i.";
     $query .= "from `tiki_calendar_recurrence` as i left join `tiki_calendars` as c on i.`calendarId`=c.`calendarId` where ({$cond})  order by " . $tblRef . $this->convertSortMode("{$sort_mode}");
     $result = $this->query($query, $bindvars, $maxRecords, $offset);
     while ($row = $result->fetchRow()) {
         // calculate the dates/times where we would expect unchanged items to be rendered
         $recurrenceEntry = new CalRecurrence($row["recurrenceId"]);
         // want to find where to start and end the rendering, bounded by view and recurrence period
         $inview_start = $row["recurrenceStart"];
         if ($inview_start < $tstart) {
             $inview_start = $tstart;
         }
         $inview_end = $row["recurrenceEnd"];
         if ($inview_end == 0) {
             $inview_end = $tstop;
         } elseif ($inview_end > $tstop) {
             $inview_end = $tstop;
         }
         $expectedDates = $recurrenceEntry->coho_getUnchangedDates((int) $inview_start, (int) $inview_end);
         /// NOTE: only one-day events are treated here
         // query for overrides
         $override_query = "select `recurrence_override` as `recurrence_override` " . "from `tiki_calendar_items` where `recurrenceId` = ? " . "and `calendarId` = ? ";
         $override_query .= "and (`recurrence_override` >= ? and `recurrence_override` <= ?) " . "order by `recurrence_override` ASC";
         $override_bindvars = array();
         $override_bindvars[] = $row["recurrenceId"];
         $override_bindvars[] = $row["calendarId"];
         $override_bindvars[] = (int) $tstart;
         $override_bindvars[] = (int) $tstop;
         $override_result = $this->query($override_query, $override_bindvars);
         $override_date = $override_result->fetchRow();
         // simulate the result of a get_item of an actual event
         $event = $this->get_coho_unchanged_recurrence_item($row["recurrenceId"], $expectedDates[0]);
         $render = false;
         foreach ($expectedDates as $unchangedDate) {
             // unix timestamp of beginning of day
             if (!$override_date) {
                 $render = true;
             } else {
                 if ($override_date['recurrence_override'] != $unchangedDate) {
                     // no overriding event so we can render it unchanged
                     $render = true;
                 } else {
                     $render = false;
                 }
             }
             if ($render) {
                 // rendering unchanged
                 // all items in the unchanged recurring event are the same except the date
                 $tmp = str_pad($event["start_time"], 4, "0", STR_PAD_LEFT);
                 $itemhour = substr($tmp, 0, 2);
                 $itemminute = substr($tmp, -2);
                 $time_addition = $itemhour * 3600 + $itemminute * 60;
                 $eventstartTS = $unchangedDate + $time_addition;
                 $event["start"] = $eventstartTS;
                 $event["date_start"] = (int) $eventstartTS;
                 $eventendTS = $eventstartTS + $event["duration"];
                 $event["end"] = $eventendTS;
                 $event["date_end"] = (int) $eventendTS;
                 $head = TikiLib::date_format($prefs['short_time_format'], $event["start"]) . " - " . TikiLib::date_format($prefs['short_time_format'], $event["end"]);
                 $eventArray["{$unchangedDate}"][] = array("result" => $event, "calitemId" => $event["calitemId"], "calname" => $event["calname"], "time" => $event["start_time"], "end" => $event["end_time"], "type" => $event["status"], "web" => $event["url"], "startTimeStamp" => $eventstartTS, "endTimeStamp" => $eventendTS, "nl" => $event["nlId"], "prio" => $event["priority"], "location" => $event["locationName"], "category" => $event["categoryName"], "name" => $event["name"], "head" => $head, "parsedDescription" => $this->parse_data($event["description"]), "description" => str_replace("\n|\r", "", $event["description"]), "recurrenceId" => $event["recurrenceId"], "calendarId" => $event['calendarId'], "status" => $event['status']);
             } else {
                 // not rendered, will be rendered in override during non-recurrence rendering
                 // if "used up" this override_date, go to next override date
                 $override_date = $override_result->fetchRow();
             }
         }
     }
 }