Beispiel #1
0
 private function _calculateRecurrences($event, $periodStartTime, $periodEndTime)
 {
     $origPeriodStartTime = $periodStartTime;
     $origPeriodEndTime = $periodEndTime;
     //recurrences can only be calculated correctly if we use the start of the day and the end of the day.
     //we'll use the original times later to check if they really overlap.
     $periodStartTime = \GO\Base\Util\Date::clear_time($periodStartTime) - 1;
     $periodEndTime = \GO\Base\Util\Date::clear_time(\GO\Base\Util\Date::date_add($periodEndTime, 1));
     $localEvent = new LocalEvent($event, $origPeriodStartTime, $origPeriodEndTime);
     if (!$localEvent->isRepeating()) {
         $this->_calculatedEvents[$event->start_time . '-' . $event->name . '-' . $event->id] = $localEvent;
     } else {
         $rrule = new \GO\Base\Util\Icalendar\Rrule();
         try {
             $rrule->readIcalendarRruleString($localEvent->getEvent()->start_time, $localEvent->getEvent()->rrule, true);
         } catch (\Exception $e) {
             trigger_error($e->getMessage() . " Event ID:" . $event->id);
         }
         //we need to start searching for the next occurrence at the period start
         //time minus the duration of the event in days rounded up. Because an
         //occurrence may start before the period but end in it.
         $rrule->setRecurpositionStartTime(\GO\Base\Util\Date::date_add($periodStartTime, -ceil(($event->end_time - $event->start_time) / 86400)));
         //			var_dump('=====');
         //			var_dump(\GO\Base\Util\Date::get_timestamp(\GO\Base\Util\Date::date_add($periodStartTime,-ceil(( ($event->end_time-$event->start_time) /86400)))));
         $origEventAttr = $localEvent->getEvent()->getAttributes('formatted');
         while ($occurenceStartTime = $rrule->getNextRecurrence(false, $periodEndTime)) {
             //				var_dump(\GO\Base\Util\Date::get_timestamp($occurenceStartTime));
             if ($occurenceStartTime > $localEvent->getPeriodEndTime()) {
                 break;
             }
             $localEvent->setAlternateStartTime($occurenceStartTime);
             $diff = $event->getDiff();
             $endTime = new \GO\Base\Util\Date\DateTime(date('c', $occurenceStartTime));
             $endTime->add($diff);
             $localEvent->setAlternateEndTime($endTime->format('U'));
             if ($localEvent->getAlternateStartTime() < $origPeriodEndTime && $localEvent->getAlternateEndTime() > $origPeriodStartTime) {
                 if (!$event->hasException($occurenceStartTime)) {
                     $this->_calculatedEvents[$occurenceStartTime . '-' . $origEventAttr['name'] . '-' . $origEventAttr['id']] = $localEvent;
                 }
             }
             $localEvent = new LocalEvent($event, $periodStartTime, $periodEndTime);
         }
     }
     //		if (empty($event->rrule)) {
     //			//not a recurring event
     //			$this->_calculatedEvents[] = $event->getAttributes('formatted');
     //		} else {
     //			$rrule = new \GO\Base\Util\Icalendar\Rrule();
     //			$rrule->readIcalendarRruleString($event->start_time, $event->rrule);
     //
     //			$rrule->setRecurpositionStartTime($periodStartTime);
     //
     //			$origEventAttr = $event->getAttributes('formatted');
     //
     //			while ($occurenceStartTime = $rrule->getNextRecurrence()) {
     //
     //				if ($occurenceStartTime > $periodEndTime)
     //					break;
     //
     //				$origEventAttr['start_time'] = \GO\Base\Util\Date::get_timestamp($occurenceStartTime);
     //
     //				$diff = $this->getDiff();
     //
     //				$endTime = new \GO\Base\Util\Date\DateTime(date('c', $occurenceStartTime));
     //				$endTime->addDiffCompat($diff);
     //				$origEventAttr['end_time'] = \GO\Base\Util\Date::get_timestamp($endTime->format('U'));
     //
     //				$this->_calculatedEvents[$occurenceStartTime . '-' . $origEventAttr['id']] = $origEventAttr;
     //			}
     //
     //			ksort($this->_calculatedEvents);
     //		}
 }