diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 7f660f32..107a764c 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -670,22 +670,34 @@ class kolab_calendar extends kolab_storage_folder_api $i = 0; while ($next_event = $recurrence->next_instance()) { - $datestr = $next_event['start']->format('Ymd'); + $datestr = $next_event['start']->format('Ymd'); $instance_id = $next_event['start']->format($recurrence_id_format); // use this event data for future recurring instances if ($futuredata[$datestr]) $overlay_data = $futuredata[$datestr]; + $rec_id = $event['uid'] . '-' . $instance_id; + $exception = $exdata[$datestr] ?: $overlay_data; + $event_start = $next_event['start']; + $event_end = $next_event['end']; + + // copy some event from exception to get proper start/end dates + if ($exception) { + $event_copy = $next_event; + kolab_driver::merge_exception_dates($event_copy, $exception); + $event_start = $event_copy['start']; + $event_end = $event_copy['end']; + } + // add to output if in range - $rec_id = $event['uid'] . '-' . $instance_id; - if (($next_event['start'] <= $end && $next_event['end'] >= $start) || ($event_id && $rec_id == $event_id)) { + if (($event_start <= $end && $event_end >= $start) || ($event_id && $rec_id == $event_id)) { $rec_event = $this->_to_driver_event($next_event, false, false); $rec_event['_instance'] = $instance_id; $rec_event['_count'] = $i + 1; - if ($overlay_data || $exdata[$datestr]) // copy data from exception - kolab_driver::merge_exception_data($rec_event, $exdata[$datestr] ?: $overlay_data); + if ($exception) // copy data from exception + kolab_driver::merge_exception_data($rec_event, $exception); $rec_event['id'] = $rec_id; $rec_event['recurrence_id'] = $event['uid']; diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index c2810ee9..ec60b509 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -1393,7 +1393,6 @@ class kolab_driver extends calendar_driver } } - /** * Merge certain properties from the overlay event to the base event object * @@ -1408,25 +1407,9 @@ class kolab_driver extends calendar_driver if (is_array($blacklist)) $forbidden = array_merge($forbidden, $blacklist); - // compute date offset from the exception - if ($overlay['start'] instanceof DateTime && $overlay['recurrence_date'] instanceof DateTime) { - $date_offset = $overlay['recurrence_date']->diff($overlay['start']); - } - foreach ($overlay as $prop => $value) { if ($prop == 'start' || $prop == 'end') { - if (is_object($event[$prop]) && $event[$prop] instanceof DateTime) { - // set date value if overlay is an exception of the current instance - if (substr($overlay['_instance'], 0, 8) == substr($event['_instance'], 0, 8)) { - $event[$prop]->setDate(intval($value->format('Y')), intval($value->format('n')), intval($value->format('j'))); - } - // apply date offset - else if ($date_offset) { - $event[$prop]->add($date_offset); - } - // adjust time of the recurring event instance - $event[$prop]->setTime($value->format('G'), intval($value->format('i')), intval($value->format('s'))); - } + // handled by merge_exception_dates() below } else if ($prop == 'thisandfuture' && $overlay['_instance'] == $event['_instance']) { $event[$prop] = $value; @@ -1434,6 +1417,38 @@ class kolab_driver extends calendar_driver else if ($prop[0] != '_' && !in_array($prop, $forbidden)) $event[$prop] = $value; } + + self::merge_exception_dates($event, $overlay); + } + + /** + * Merge start/end date from the overlay event to the base event object + * + * @param array The event object to be altered + * @param array The overlay event object to be merged over $event + */ + public static function merge_exception_dates(&$event, $overlay) + { + // compute date offset from the exception + if ($overlay['start'] instanceof DateTime && $overlay['recurrence_date'] instanceof DateTime) { + $date_offset = $overlay['recurrence_date']->diff($overlay['start']); + } + + foreach (array('start', 'end') as $prop) { + $value = $overlay[$prop]; + if (is_object($event[$prop]) && $event[$prop] instanceof DateTime) { + // set date value if overlay is an exception of the current instance + if (substr($overlay['_instance'], 0, 8) == substr($event['_instance'], 0, 8)) { + $event[$prop]->setDate(intval($value->format('Y')), intval($value->format('n')), intval($value->format('j'))); + } + // apply date offset + else if ($date_offset) { + $event[$prop]->add($date_offset); + } + // adjust time of the recurring event instance + $event[$prop]->setTime($value->format('G'), intval($value->format('i')), intval($value->format('s'))); + } + } } /**