Пример #1
0
 function get_repeats_between($event, $gmt_start, $gmt_end, $limit, $events)
 {
     global $ICAL_EVENTS_REPEAT_INTERVALS;
     $rrule = $event['Repeat'];
     $repeats = array();
     //print_r($rrule);
     if (isset($ICAL_EVENTS_REPEAT_INTERVALS[$rrule['Interval']])) {
         $interval = $ICAL_EVENTS_REPEAT_INTERVALS[$rrule['Interval']] * ($rrule['Frequency'] ? $rrule['Frequency'] : 1);
         $repeat_days = ICalEvents::get_repeat_days($rrule['RepeatDays']);
         $t = getdate($event['StartTime']);
         $exceptions_array = array();
         $exceptions_array = $rrule['Exceptions'];
         foreach ($events as $value) {
             if ($value['UID'] == $event['UID'] && !empty($value['RecurrenceID'])) {
                 $exceptions_array[] = $value['RecurrenceID'];
             }
         }
         $repeat = null;
         $count = 0;
         while ($count <= ICAL_EVENTS_MAX_REPEATS) {
             if (isset($rrule['ByMonthDay'])) {
                 if ($count > 0) {
                     $repeat = $event;
                     unset($repeat['Repeat']);
                     $repeat['StartTime'] = mktime($t['hours'], $t['minutes'], $t['seconds'], $t['mon'] + $count, $rrule['ByMonthDay'], $t['year']);
                     $repeat['EndTime'] = $repeat['StartTime'] - $event['StartTime'];
                     if (!ICalEvents::is_duplicate($repeat, $event) && ICalEvents::falls_between($repeat, $gmt_start, $gmt_end) && !@in_array($repeat['StartTime'], $exceptions_array)) {
                         $repeats[] = $repeat;
                     }
                 }
             } else {
                 if ($repeat_days) {
                     foreach ($repeat_days as $repeat_day => $repeat_week) {
                         $repeat = ICalEvents::get_repeat($event, $interval, $count, $repeat_day, $repeat_week);
                         if (!ICalEvents::is_duplicate($repeat, $event) and ICalEvents::falls_between($repeat, $gmt_start, $gmt_end) && !@in_array($repeat['StartTime'], $exceptions_array)) {
                             $repeats[] = $repeat;
                         }
                         if (ICalEvents::after_rrule_end_time($repeat, $rrule)) {
                             break;
                         }
                     }
                 } else {
                     $repeat = ICalEvents::get_simple_repeat($event, $interval, $count);
                     if (!ICalEvents::is_duplicate($repeat, $event) and ICalEvents::falls_between($repeat, $gmt_start, $gmt_end) && !@in_array($repeat['StartTime'], $exceptions_array)) {
                         $repeats[] = $repeat;
                     }
                 }
             }
             if (ICalEvents::after_rrule_end_time($repeat, $rrule)) {
                 break;
             }
             // Don't repeat past the user-defined limit, if one exists
             if ($limit and $count >= $limit) {
                 break;
             }
             ++$count;
         }
     } else {
         echo "Unknown repeat interval: {$rr['Interval']}";
     }
     return $repeats;
 }