/** * beforeGetProperties * * This method handler is invoked before any after properties for a * resource are fetched. This allows us to add in any CalDAV specific * properties. * * @param string $path * @param \Sabre\DAV\INode $node * @param array $requestedProperties * @param array $returnedProperties * @return void */ public function beforeGetProperties($path, \Sabre\DAV\INode $node, &$requestedProperties, &$returnedProperties) { if ($node instanceof \Sabre\CalDAV\ICalendar || $node instanceof Calendar_Frontend_WebDAV) { $vcalendar = new \Sabre\VObject\Component\VCalendar(); $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vevent-datetime'; if (in_array($property, $requestedProperties)) { unset($requestedProperties[array_search($property, $requestedProperties)]); $valarm = $vcalendar->create('VALARM'); $valarm->add('ACTION', 'NONE'); $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME')); $valarm->add('UID', 'E35C3EB2-4DC1-4223-AA5D-B4B491F2C111'); // Taking out \r to not screw up the xml output $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize()); } $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vevent-date'; if (in_array($property, $requestedProperties)) { unset($requestedProperties[array_search($property, $requestedProperties)]); $valarm = $vcalendar->create('VALARM'); // $valarm->add('ACTION', 'AUDIO'); // $valarm->add('ATTACH', 'Basso', array('VALUE' => 'URI')); // $valarm->add('TRIGGER', '-PT15H'); $valarm->add('ACTION', 'NONE'); $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME')); $valarm->add('UID', '17DC9682-230E-47D6-A035-EEAB602B1229'); // Taking out \r to not screw up the xml output $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize()); } $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vtodo-datetime'; if (in_array($property, $requestedProperties)) { unset($requestedProperties[array_search($property, $requestedProperties)]); $valarm = $vcalendar->create('VALARM'); $valarm->add('ACTION', 'NONE'); $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME')); $valarm->add('UID', 'D35C3EB2-4DC1-4223-AA5D-B4B491F2C111'); // Taking out \r to not screw up the xml output $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize()); } $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vtodo-date'; if (in_array($property, $requestedProperties)) { unset($requestedProperties[array_search($property, $requestedProperties)]); $valarm = $vcalendar->create('VALARM'); // $valarm->add('ACTION', 'AUDIO'); // $valarm->add('ATTACH', 'Basso', array('VALUE' => 'URI')); // $valarm->add('TRIGGER', '-PT15H'); $valarm->add('ACTION', 'NONE'); $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME')); $valarm->add('UID', '27DC9682-230E-47D6-A035-EEAB602B1229'); // Taking out \r to not screw up the xml output $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize()); } } }
/** * convert calendar event to \Sabre\VObject\Component * * @param Tasks_Model_Task $_vtodo * @param Tasks_Model_Task $mainTask * @return \Sabre\VObject\Component */ protected function _convertTasksModelTask(Sabre\VObject\Component\VCalendar $vcalendar, Tasks_Model_Task $task, Tasks_Model_Task $mainTask = null) { // clone the event and change the timezone $task = clone $task; if (!empty($task->originator_tz)) { $task->setTimezone($task->originator_tz); } $vtodo = $vcalendar->create('VTODO'); $vtodo->add('CREATED', $task->creation_time->getClone()->setTimezone('UTC')); $lastModifiedDateTime = $task->last_modified_time ? $task->last_modified_time : $task->creation_time; $vtodo->add('LAST-MODIFIED', $lastModifiedDateTime->getClone()->setTimezone('UTC')); $vtodo->add('DTSTAMP', Tinebase_DateTime::now()); $vtodo->add('UID', $task->uid); $vtodo->add('SEQUENCE', !empty($task->seq) ? $task->seq : 1); if (isset($task->dtstart)) { $vtodo->add('DTSTART', $task->dtstart); } if (isset($task->due)) { $vtodo->add('DUE', $task->due); } if (isset($task->completed)) { $vtodo->add('COMPLETED', $task->completed); } switch ($task->priority) { case 'LOW': $vtodo->add('PRIORITY', 9); break; case 'NORMAL': $vtodo->add('PRIORITY', 0); break; case 'HIGH': case 'URGENT': $vtodo->add('PRIORITY', 1); break; } if (!empty($task->percent)) { $vtodo->add('PERCENT-COMPLETE', $task->percent); } // task organizer if (!empty($task->organizer)) { $organizerContact = $task->resolveOrganizer(); if ($organizerContact instanceof Addressbook_Model_Contact && !empty($organizerContact->email)) { $organizer = $vtodo->add('ORGANIZER', 'mailto:' . $organizerContact->email, array('CN' => $organizerContact->n_fileas, 'EMAIL' => $organizerContact->email)); } } $optionalProperties = array('class', 'description', 'geo', 'location', 'summary', 'status', 'url'); foreach ($optionalProperties as $property) { if (!empty($task->{$property})) { $vtodo->add($property, $task->{$property}); } } // categories if (!isset($task->tags)) { $task->tags = Tinebase_Tags::getInstance()->getTagsOfRecord($task); } if (isset($task->tags) && count($task->tags) > 0) { $vtodo->add('CATEGORIES', (array) $task->tags->name); } if ($task->alarms) { // fake X-MOZ-LASTACK $vtodo->add('X-MOZ-LASTACK', $task->creation_time->getClone()->setTimezone('UTC'), array('VALUE' => 'DATE-TIME')); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' event ' . print_r($task->alarms, TRUE)); } foreach ($task->alarms as $alarm) { $valarm = $vcalendar->create('VALARM'); $valarm->add('ACTION', 'DISPLAY'); $valarm->add('DESCRIPTION', $task->summary); if (is_numeric($alarm->minutes_before)) { if ($task->dtstart == $alarm->alarm_time) { $periodString = 'PT0S'; } else { $interval = $task->due->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 = $valarm->add('TRIGGER', $periodString); $trigger['VALUE'] = "DURATION"; } else { # TRIGGER;VALUE=DATE-TIME:... $trigger = $valarm->add('TRIGGER', $alarm->alarm_time->getClone()->setTimezone('UTC')->format('Ymd\\THis\\Z')); $trigger['VALUE'] = "DATE-TIME"; } $vtodo->add($valarm); } } $vcalendar->add($vtodo); }