public function testVeventDtstartMustComeBeforeDtend() { $this->expectException(new qCal_Exception_InvalidProperty('DTSTART property must come before DTEND')); $event = new qCal_Component_Vevent(array('dtstart' => new qCal_Property_Dtstart('09/09/2009'), 'dtend' => new qCal_Property_Dtend('09/08/2009'))); $event->validate(); }
public function eventToIcal($_event) { if ($_event instanceof Tinebase_Record_RecordSet) { foreach ($_event as $event) { $this->eventToIcal($event); } return $this->_vcalendar; } // NOTE: we deliver events in originators tz $_event->setTimezone($_event->originator_tz); if (!in_array($_event->originator_tz, $this->_attachedTimezones)) { $this->_vcalendar->attach(self::getVtimezone($_event->originator_tz)); $this->_attachedTimezones[] = $_event->originator_tz; } if ($_event->is_all_day_event) { $dtstart = new qCal_Property_Dtstart($_event->dtstart->format('Ymd'), array('VALUE' => 'DATE')); $dtend = new qCal_Property_Dtend($_event->dtend->format('Ymd'), array('VALUE' => 'DATE')); } else { $dtstart = new qCal_Property_Dtstart(qCal_DateTime::factory($_event->dtstart->format('Ymd\\THis'), $_event->originator_tz), array('TZID' => $_event->originator_tz)); $dtend = new qCal_Property_Dtend(qCal_DateTime::factory($_event->dtend->format('Ymd\\THis'), $_event->originator_tz), array('TZID' => $_event->originator_tz)); } $vevent = new qCal_Component_Vevent(array('uid' => $_event->uid, 'sequence' => $_event->seq, 'summary' => $_event->summary, 'dtstart' => $dtstart, 'dtend' => $dtend)); foreach (self::$veventMap as $icalProp => $tineField) { if (isset($_event[$tineField])) { $vevent->addProperty($icalProp, $_event->{$tineField}); } } // rrule if ($_event->rrule) { $vevent->addProperty('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 ($exdateArray = $_event->exdate) { // use multiple EXDATE for the moment, as apple ical uses them foreach ($_event->exdate as $exdate) { $exdates = new qCal_Property_Exdate(qCal_DateTime::factory($exdate->format('Ymd\\THis'), $_event->originator_tz), array('TZID' => $_event->originator_tz)); $vevent->addProperty($exdates); } // $exdates = new qCal_Property_Exdate(qCal_DateTime::factory(array_shift($exdateArray)->format('Ymd\THis'), $_event->originator_tz), array('TZID' => $_event->originator_tz)); // foreach($exdateArray as $exdate) { // $exdates->addValue(qCal_DateTime::factory($exdate->format('Ymd\THis'), $_event->originator_tz)); // } // // $vevent->addProperty($exdates); } } // recurid if ($_event->isRecurException()) { $originalDtStart = $_event->getOriginalDtStart(); $originalDtStart->setTimezone($_event->originator_tz); $vevent->addProperty(new qCal_Property_RecurrenceId(qCal_DateTime::factory($originalDtStart->format('Ymd\\THis'), $_event->originator_tz), array('TZID' => $_event->originator_tz))); } // organizer $organizerId = $_event->organizer instanceof Addressbook_Model_Contact ? array($_event->organizer->getId()) : array($_event->organizer); $organizer = Addressbook_Controller_Contact::getInstance()->getMultiple($organizerId, TRUE)->getFirstRecord(); if ($organizer && ($organizerEmail = $organizer->getPreferedEmailAddress())) { $vevent->addProperty(new qCal_Property_Organizer("mailto:{$organizerEmail}", array('CN' => $organizer->n_fileas))); } // attendee if ($_event->attendee) { Calendar_Model_Attender::resolveAttendee($_event->attendee, FALSE); foreach ($_event->attendee as $attender) { $attenderEmail = $attender->getEmail(); if ($attenderEmail) { $vevent->addProperty(new qCal_Property_Attendee("mailto:{$attenderEmail}", array('CN' => $attender->getName(), 'CUTYPE' => self::$cutypeMap[$attender->user_type], 'EMAIL' => $attenderEmail, 'PARTSTAT' => $attender->status, 'ROLE' => "{$attender->role}-PARTICIPANT", 'RSVP' => 'FALSE'))); } } } // alarms if ($_event->alarms) { foreach ($_event->alarms as $alarm) { $valarm = new qCal_Component_Valarm(array('ACTION' => 'DISPLAY', 'DESCRIPTION' => $_event->summary)); // qCal only support DURATION ;-( $diffSeconds = $_event->dtstart->php52compat_diff($alarm->alarm_time); $valarm->addProperty(new qCal_Property_Trigger($diffSeconds)); // if (is_numeric($alarm->minutes_before)) { // $valarm->addProperty(new qCal_Property_Trigger("-PT{$alarm->minutes_before}M")); // } else { // $valarm->addProperty(new qCal_Property_Trigger(qCal_DateTime::factory($alarm->alarm_time->format('Ymd\THis'), $_event->originator_tz)), array('TZID' => $_event->originator_tz)); // } $vevent->attach($valarm); } } // @todo status $this->_vcalendar->attach($vevent); return $this->_vcalendar; }
/** * Generate icalendar data output. * * @return String */ function generate() { $properties = array(); $properties['prodid'] = '-//vtiger/Mobile/NONSGML 1.0//EN'; $ical = new qCal($properties); // TODO Configure timezone information. $fieldnames = array('activityid', 'subject', 'description', 'activitytype', 'location', 'reminder_time', 'date_start', 'time_start', 'due_date', 'time_end', 'modifiedtime'); $query = "SELECT " . implode(',', $fieldnames) . " FROM vtiger_activity\n\t\t\tINNER JOIN vtiger_crmentity ON\n\t\t\t(vtiger_activity.activityid=vtiger_crmentity.crmid \tAND vtiger_crmentity.deleted = 0 AND vtiger_crmentity.smownerid = ?)\n\t\t\tLEFT JOIN vtiger_activity_reminder ON vtiger_activity_reminder.activity_id=vtiger_activity.activityid\n\t\t\tWHERE vtiger_activity.activitytype != 'Emails'"; $result = $this->db->pquery($query, array($this->userfocus->id)); while ($resultrow = $this->db->fetch_array($result)) { $properties = array(); $properties['uid'] = $resultrow['activityid']; $properties['summary'] = $this->formatValue(decode_html($resultrow['subject'])); $properties['description'] = $this->formatValue(decode_html($resultrow['description'])); $properties['class'] = 'PRIVATE'; $properties['dtstart'] = $this->formatDateTime($resultrow['date_start'], $resultrow['time_start']); $properties['dtend'] = $this->formatDateTime($resultrow['due_date'], $resultrow['time_end']); $properties['dtstamp'] = $this->formatDateTimestamp($resultrow['modifiedtime']); $properties['location'] = $this->formatValue($resultrow['location']); if ($resultrow['activitytype'] == 'Task') { // Tranform the parameter $properties['due'] = $properties['dtend']; unset($properties['dtend']); $icalComponent = new qCal_Component_Vtodo($properties); } else { $icalComponent = new qCal_Component_Vevent($properties); if (!empty($resultrow['reminder_time'])) { $alarmProperties = array(); $alarmProperties['trigger'] = $resultrow['reminder_time'] * 60; $icalComponent->attach(new qCal_Component_Valarm($alarmProperties)); } } $ical->attach($icalComponent); } return $ical->render(); }
/** * only certain components can be attached to eachother */ public function testInvalidAttaching() { $this->expectException(new qCal_Exception_InvalidComponent('VCALENDAR cannot be attached to VEVENT')); // calendars cannot be attached to anything (except perhaps other calendars) $cal = new qCal(); $event = new qCal_Component_Vevent(); $event->attach($cal); }