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); }
/** * 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); }