예제 #1
0
 function testGetDateTimeCached()
 {
     $tz = new DateTimeZone('Europe/Amsterdam');
     $dt = new DateTime('1985-07-04 01:30:00', $tz);
     $dt->setTimeZone($tz);
     $elem = new Sabre_VObject_Element_DateTime('DTSTART');
     $elem->setDateTime($dt);
     $this->assertEquals($elem->getDateTime(), $dt);
 }
예제 #2
0
 /**
  * convert calendar event to Sabre_VObject_Component
  * 
  * @param Calendar_Model_Event $_event
  * @param Calendar_Model_Event $_mainEvent
  * @return Sabre_VObject_Component
  */
 protected function _convertCalendarModelEvent(Calendar_Model_Event $_event, Calendar_Model_Event $_mainEvent = null)
 {
     // clone the event and change the timezone
     $event = clone $_event;
     $event->setTimezone($event->originator_tz);
     $vevent = new Sabre_VObject_Component('VEVENT');
     $lastModifiedDatTime = $event->last_modified_time ? $event->last_modified_time : $event->creation_time;
     $created = new Sabre_VObject_Element_DateTime('CREATED');
     $created->setDateTime($event->creation_time, Sabre_VObject_Element_DateTime::UTC);
     $vevent->add($created);
     $lastModified = new Sabre_VObject_Element_DateTime('LAST-MODIFIED');
     $lastModified->setDateTime($lastModifiedDatTime, Sabre_VObject_Element_DateTime::UTC);
     $vevent->add($lastModified);
     $dtstamp = new Sabre_VObject_Element_DateTime('DTSTAMP');
     $dtstamp->setDateTime(Tinebase_DateTime::now(), Sabre_VObject_Element_DateTime::UTC);
     $vevent->add($dtstamp);
     $vevent->add(new Sabre_VObject_Property('UID', $event->uid));
     $vevent->add(new Sabre_VObject_Property('SEQUENCE', $event->seq));
     if ($event->isRecurException()) {
         $originalDtStart = $event->getOriginalDtStart();
         $originalDtStart->setTimezone($_event->originator_tz);
         $recurrenceId = new Sabre_VObject_Element_DateTime('RECURRENCE-ID');
         if ($_mainEvent && $_mainEvent->is_all_day_event == true) {
             $recurrenceId->setDateTime($originalDtStart, Sabre_VObject_Element_DateTime::DATE);
         } else {
             $recurrenceId->setDateTime($originalDtStart);
         }
         $vevent->add($recurrenceId);
     }
     // dtstart and dtend
     if ($event->is_all_day_event == true) {
         $dtstart = new Sabre_VObject_Element_DateTime('DTSTART');
         $dtstart->setDateTime($event->dtstart, Sabre_VObject_Element_DateTime::DATE);
         // whole day events ends at 23:59:(00|59) in Tine 2.0 but 00:00 the next day in vcalendar
         $event->dtend->addSecond($event->dtend->get('s') == 59 ? 1 : 0);
         $event->dtend->addMinute($event->dtend->get('i') == 59 ? 1 : 0);
         $dtend = new Sabre_VObject_Element_DateTime('DTEND');
         $dtend->setDateTime($event->dtend, Sabre_VObject_Element_DateTime::DATE);
     } else {
         $dtstart = new Sabre_VObject_Element_DateTime('DTSTART');
         $dtstart->setDateTime($event->dtstart);
         $dtend = new Sabre_VObject_Element_DateTime('DTEND');
         $dtend->setDateTime($event->dtend);
     }
     $vevent->add($dtstart);
     $vevent->add($dtend);
     // event organizer
     if (!empty($event->organizer)) {
         $organizerContact = Addressbook_Controller_Contact::getInstance()->getMultiple(array($event->organizer), TRUE)->getFirstRecord();
         if ($organizerContact instanceof Addressbook_Model_Contact && !empty($organizerContact->email)) {
             $organizer = new Sabre_VObject_Property('ORGANIZER', 'mailto:' . $organizerContact->email);
             $organizer->add('CN', $organizerContact->n_fileas);
             $vevent->add($organizer);
         }
     }
     $this->_addEventAttendee($vevent, $event);
     $optionalProperties = array('class', 'description', 'geo', 'location', 'priority', 'summary', 'transp', 'url');
     foreach ($optionalProperties as $property) {
         if (!empty($event->{$property})) {
             $vevent->add(new Sabre_VObject_Property(strtoupper($property), $event->{$property}));
         }
     }
     // categories
     if (isset($event->tags) && count($event->tags) > 0) {
         $vevent->add(new Sabre_VObject_Property_List('CATEGORIES', (array) $event->tags->name));
     }
     // repeating event properties
     if ($event->rrule) {
         if ($event->is_all_day_event == true) {
             $vevent->add(new Sabre_VObject_Property_Recure('RRULE', preg_replace_callback('/UNTIL=([\\d :-]{19})(?=;?)/', function ($matches) {
                 $dtUntil = new Tinebase_DateTime($matches[1]);
                 $dtUntil->setTimezone((string) Tinebase_Core::get(Tinebase_Core::USERTIMEZONE));
                 return 'UNTIL=' . $dtUntil->format('Ymd');
             }, $event->rrule)));
         } else {
             $vevent->add(new Sabre_VObject_Property_Recure('RRULE', preg_replace('/(UNTIL=)(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})/', '$1$2$3$4T$5$6$7Z', $event->rrule)));
         }
         if ($event->exdate instanceof Tinebase_Record_RecordSet) {
             $deletedEvents = $event->exdate->filter('is_deleted', true);
             foreach ($deletedEvents as $deletedEvent) {
                 $exdate = new Sabre_VObject_Element_DateTime('EXDATE');
                 $dateTime = $deletedEvent->getOriginalDtStart();
                 if ($event->is_all_day_event == true) {
                     $dateTime->setTimezone($event->originator_tz);
                     $exdate->setDateTime($dateTime, Sabre_VObject_Element_DateTime::DATE);
                 } else {
                     $exdate->setDateTime($dateTime, Sabre_VObject_Element_DateTime::UTC);
                 }
                 $vevent->add($exdate);
             }
         }
     }
     // add alarms only to vcalendar if current user attends to this event
     if ($event->alarms) {
         $ownAttendee = Calendar_Model_Attender::getOwnAttender($event->attendee);
         if ($ownAttendee && $ownAttendee->alarm_ack_time instanceof Tinebase_DateTime) {
             $xMozLastAck = new Sabre_VObject_Element_DateTime('X-MOZ-LASTACK');
             $xMozLastAck->setDateTime($ownAttendee->alarm_ack_time, Sabre_VObject_Element_DateTime::UTC);
             $vevent->add($xMozLastAck);
         }
         if ($ownAttendee && $ownAttendee->alarm_snooze_time instanceof Tinebase_DateTime) {
             $xMozSnoozeTime = new Sabre_VObject_Element_DateTime('X-MOZ-SNOOZE-TIME');
             $xMozSnoozeTime->setDateTime($ownAttendee->alarm_snooze_time, Sabre_VObject_Element_DateTime::UTC);
             $vevent->add($xMozSnoozeTime);
         }
         foreach ($event->alarms as $alarm) {
             $valarm = new Sabre_VObject_Component('VALARM');
             $valarm->add('ACTION', 'DISPLAY');
             $valarm->add('DESCRIPTION', $event->summary);
             if (is_numeric($alarm->minutes_before)) {
                 if ($event->dtstart == $alarm->alarm_time) {
                     $periodString = 'PT0S';
                 } else {
                     $interval = $event->dtstart->diff($alarm->alarm_time);
                     $periodString = sprintf('%sP%s%s%s%s', $interval->format('%r'), $interval->format('%d') > 0 ? $interval->format('%dD') : null, $interval->format('%h') > 0 || $interval->format('%i') > 0 ? 'T' : null, $interval->format('%h') > 0 ? $interval->format('%hH') : null, $interval->format('%i') > 0 ? $interval->format('%iM') : null);
                 }
                 # TRIGGER;VALUE=DURATION:-PT1H15M
                 $trigger = new Sabre_VObject_Property('TRIGGER', $periodString);
                 $trigger->add('VALUE', "DURATION");
                 $valarm->add($trigger);
             } else {
                 # TRIGGER;VALUE=DATE-TIME:...
                 $trigger = new Sabre_VObject_Element_DateTime('TRIGGER');
                 $trigger->add('VALUE', "DATE-TIME");
                 $trigger->setDateTime($alarm->alarm_time, Sabre_VObject_Element_DateTime::UTC);
                 $valarm->add($trigger);
             }
             $vevent->add($valarm);
         }
     }
     return $vevent;
 }
 public static function updateVCalendarFromRequest($request, $vcalendar)
 {
     $title = $request["title"];
     $location = $request["location"];
     $categories = isset($request["categories"]) ? $request["categories"] : null;
     $allday = isset($request["allday"]);
     $from = $request["from"];
     $fromtime = $request["fromtime"];
     $to = $request["to"];
     $totime = $request["totime"];
     $description = $request["description"];
     //$repeat = $request["repeat"];
     /*switch($request["repeatfreq"]){
     			case "DAILY":
     				$repeatfreq = "DAILY";
     			case "WEEKLY":
     				$repeatfreq = "WEEKLY";
     			case "WEEKDAY":
     				$repeatfreq = "DAILY;BYDAY=MO,TU,WE,TH,FR"; //load weeksdayss from userconfig when weekdays are choosable
     			case "":
     				$repeatfreq = "";
     			case "":
     				$repeatfreq = "";
     			case "":
     				$repeatfreq = "";
     			default:
     				$repeat = "false";
     		}*/
     $repeat = "false";
     $now = new DateTime();
     $vevent = $vcalendar->VEVENT[0];
     $last_modified = new Sabre_VObject_Element_DateTime('LAST-MODIFIED');
     $last_modified->setDateTime($now, Sabre_VObject_Element_DateTime::UTC);
     $vevent->__set('LAST-MODIFIED', $last_modified);
     $dtstamp = new Sabre_VObject_Element_DateTime('DTSTAMP');
     $dtstamp->setDateTime($now, Sabre_VObject_Element_DateTime::UTC);
     $vevent->DTSTAMP = $dtstamp;
     $vevent->SUMMARY = $title;
     $dtstart = new Sabre_VObject_Element_DateTime('DTSTART');
     $dtend = new Sabre_VObject_Element_DateTime('DTEND');
     if ($allday) {
         $start = new DateTime($from);
         $end = new DateTime($to . ' +1 day');
         $dtstart->setDateTime($start, Sabre_VObject_Element_DateTime::DATE);
         $dtend->setDateTime($end, Sabre_VObject_Element_DateTime::DATE);
     } else {
         $timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London");
         $timezone = new DateTimeZone($timezone);
         $start = new DateTime($from . ' ' . $fromtime, $timezone);
         $end = new DateTime($to . ' ' . $totime, $timezone);
         $dtstart->setDateTime($start, Sabre_VObject_Element_DateTime::LOCALTZ);
         $dtend->setDateTime($end, Sabre_VObject_Element_DateTime::LOCALTZ);
     }
     $vevent->DTSTART = $dtstart;
     $vevent->DTEND = $dtend;
     unset($vevent->DURATION);
     if ($location != "") {
         $vevent->LOCATION = $location;
     } else {
         unset($vevent->LOCATION);
     }
     if ($description != "") {
         $vevent->DESCRIPTION = $description;
     } else {
         unset($vevent->DESCRIPTION);
     }
     if (!empty($categories)) {
         $vevent->CATEGORIES = join(',', $categories);
     } else {
         unset($vevent->CATEGORIES);
     }
     /*if($repeat == "true"){
     			$vevent->RRULE = $repeat;
     		}*/
     return $vcalendar;
 }
 /**
  * @depends testValues
  */
 function testComplexExclusions()
 {
     $ev = new Sabre_VObject_Component('VEVENT');
     $ev->UID = 'bla';
     $ev->RRULE = 'FREQ=YEARLY;COUNT=10';
     $dtStart = new Sabre_VObject_Element_DateTime('DTSTART');
     $tz = new DateTimeZone('Canada/Eastern');
     $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz), Sabre_VObject_Element_DateTime::LOCALTZ);
     $exDate1 = new Sabre_VObject_Element_MultiDateTime('EXDATE');
     $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz)), Sabre_VObject_Element_DateTime::LOCALTZ);
     $exDate2 = new Sabre_VObject_Element_MultiDateTime('EXDATE');
     $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz)), Sabre_VObject_Element_DateTime::LOCALTZ);
     $ev->add($dtStart);
     $ev->add($exDate1);
     $ev->add($exDate2);
     $vcal = Sabre_VObject_Component::create('VCALENDAR');
     $vcal->add($ev);
     $it = new Sabre_VObject_RecurrenceIterator($vcal, (string) $ev->uid);
     $this->assertEquals('yearly', $it->frequency);
     $this->assertEquals(1, $it->interval);
     $this->assertEquals(10, $it->count);
     $max = 20;
     $result = array();
     foreach ($it as $k => $item) {
         $result[] = $item;
         $max--;
         if (!$max) {
             break;
         }
     }
     $this->assertEquals(array(new DateTime('2011-01-01 13:50:20', $tz), new DateTime('2013-01-01 13:50:20', $tz), new DateTime('2015-01-01 13:50:20', $tz), new DateTime('2017-01-01 13:50:20', $tz), new DateTime('2018-01-01 13:50:20', $tz), new DateTime('2019-01-01 13:50:20', $tz), new DateTime('2020-01-01 13:50:20', $tz)), $result);
 }