/** * Get this event as a VObject. This can be turned into a vcalendar file data. * * @param string $method REQUEST, REPLY or CANCEL * @param Participant $updateByParticipant The participant that is generating this ICS for a response. * @param int $recurrenceTime Export for a specific recurrence time for the recurrence-id. * @param boolean $includeExdatesForMovedEvents Funambol need EXDATE lines even for appointments that have been moved. CalDAV doesn't need those lines. * * If this event is an occurence and has a exception_for_event_id it will automatically determine this value. * This option is only useful for cancelling a single occurence. Because in that case there is no event model for the occurrence. There's just an exception. * * @return Sabre\VObject\Component */ public function toVObject($method = 'REQUEST', $updateByParticipant = false, $recurrenceTime = false, $includeExdatesForMovedEvents = false) { $calendar = new Sabre\VObject\Component\VCalendar(); $e = $calendar->createComponent('VEVENT'); if (empty($this->uuid)) { $this->uuid = \GO\Base\Util\UUID::create('event', $this->id); $this->save(true); } $e->uid = $this->uuid; if (isset($this->sequence)) { $e->sequence = $this->sequence; } $e->add('dtstamp', new \DateTime("now", new \DateTimeZone('UTC'))); $mtimeDateTime = new \DateTime('@' . $this->mtime); $mtimeDateTime->setTimezone(new \DateTimeZone('UTC')); $e->add('LAST-MODIFIED', $mtimeDateTime); $ctimeDateTime = new \DateTime('@' . $this->mtime); $ctimeDateTime->setTimezone(new \DateTimeZone('UTC')); $e->add('created', $ctimeDateTime); $e->summary = (string) $this->name; // switch($this->owner_status){ // case Participant::STATUS_ACCEPTED: // $e->status = "CONFIRMED"; // break; // case Participant::STATUS_DECLINED: // $e->status = "CANCELLED"; // break; // default: // $e->status = "TENTATIVE"; // break; // } $e->status = $this->status; $dateType = $this->all_day_event ? "DATE" : "DATETIME"; // if($this->all_day_event){ // $e->{"X-FUNAMBOL-ALLDAY"}=1; // } if ($this->exception_for_event_id > 0) { //this is an exception $exception = $this->recurringEventException(); //get master event from relation if ($exception) { $recurrenceTime = $exception->getStartTime(); } } if ($recurrenceTime) { $dt = \GO\Base\Util\Date\DateTime::fromUnixtime($recurrenceTime); $rId = $e->add('recurrence-id', $dt); if ($this->_exceptionEvent->all_day_event) { $rId['VALUE'] = 'DATE'; } } $dtstart = $e->add('dtstart', \GO\Base\Util\Date\DateTime::fromUnixtime($this->start_time)); if ($this->all_day_event) { $dtstart['VALUE'] = 'DATE'; } if ($this->all_day_event) { $end_time = \GO\Base\Util\Date::clear_time($this->end_time); $end_time = \GO\Base\Util\Date::date_add($end_time, 1); } else { $end_time = $this->end_time; } $dtend = $e->add('dtend', \GO\Base\Util\Date\DateTime::fromUnixtime($end_time)); if ($this->all_day_event) { $dtend['VALUE'] = 'DATE'; } if (!empty($this->description)) { $e->description = $this->description; } if (!empty($this->location)) { $e->location = $this->location; } if (!empty($this->rrule)) { $rRule = $this->getRecurrencePattern(); $rRule->shiftDays(false); $e->add('rrule', str_replace('RRULE:', '', $rRule->createRrule())); $findParams = \GO\Base\Db\FindParams::newInstance(); if (!$includeExdatesForMovedEvents) { $findParams->getCriteria()->addCondition('exception_event_id', 0); } $stmt = $this->exceptions($findParams); while ($exception = $stmt->fetch()) { $dt = \GO\Base\Util\Date\DateTime::fromUnixtime($exception->getStartTime()); $exdate = $e->add('exdate', $dt); if ($this->all_day_event) { $exdate['VALUE'] = 'DATE'; } } } $stmt = $this->participants(); while ($participant = $stmt->fetch()) { if ($participant->is_organizer || $method == 'REQUEST' || $updateByParticipant && $updateByParticipant->id == $participant->id) { //If this is a meeting REQUEST then we must send all participants. //For a CANCEL or REPLY we must send the organizer and the current user. $e->add($participant->is_organizer ? 'organizer' : 'attendee', 'mailto:' . $participant->email, array('cn' => $participant->name, 'rsvp' => 'true', 'partstat' => $this->_exportVObjectStatus($participant->status))); } } if ($this->category) { $e->categories = $this->category->name; } if ($this->reminder > 0) { $a = $calendar->createComponent('VALARM'); // BEGIN:VALARM //ACTION:DISPLAY //TRIGGER;VALUE=DURATION:-PT5M //DESCRIPTION:Default Mozilla Description //END:VALARM $a->action = 'DISPLAY'; $a->add('trigger', '-PT' . $this->reminder / 60 . 'M', array('value' => 'DURATION')); $a->description = "Alarm"; //for funambol compatibility, the \GO\Base\VObject\Reader class use this to convert it to a vcalendar 1.0 aalarm tag. $e->{"X-GO-REMINDER-TIME"} = date('Ymd\\THis', $this->start_time - $this->reminder); $e->add($a); } if ($this->private) { $e->class = 'PRIVATE'; } return $e; }
/** * Get this task as a VObject. This can be turned into a vcalendar file data. * * @return Sabre\VObject\Component */ public function toVObject() { $calendar = new Sabre\VObject\Component\VCalendar(); $e = $calendar->createComponent('VTODO'); $e->uid = $this->uuid; $e->add('dtstamp', new \DateTime("now", new \DateTimeZone('UTC'))); $mtimeDateTime = new \DateTime('@' . $this->mtime); $mtimeDateTime->setTimezone(new \DateTimeZone('UTC')); $e->add('LAST-MODIFIED', $mtimeDateTime); $ctimeDateTime = new \DateTime('@' . $this->mtime); $ctimeDateTime->setTimezone(new \DateTimeZone('UTC')); $e->add('created', $ctimeDateTime); $e->summary = $this->name; $e->status = $this->status; $dateType = "DATE"; if (!empty($this->start_time)) { $e->add('dtstart', \GO\Base\Util\Date\DateTime::fromUnixtime($this->start_time), array('VALUE' => $dateType)); } $e->add('due', \GO\Base\Util\Date\DateTime::fromUnixtime($this->due_time), array('VALUE' => $dateType)); if ($this->completion_time > 0) { $e->add('completed', \GO\Base\Util\Date\DateTime::fromUnixtime($this->completion_time), array('VALUE' => $dateType)); } if (!empty($this->percentage_complete)) { $e->add('percent-complete', $this->percentage_complete); } if (!empty($this->description)) { $e->description = $this->description; } //todo exceptions if (!empty($this->rrule)) { $e->rrule = str_replace('RRULE:', '', $this->rrule); } switch ($this->priority) { case self::PRIORITY_LOW: $e->priority = 9; break; case self::PRIORITY_HIGH: $e->priority = 1; break; default: $e->priority = 5; } if ($this->reminder > 0) { $a = $calendar->createComponent('VALARM'); // BEGIN:VALARM //ACTION:DISPLAY //TRIGGER;VALUE=DURATION:-PT5M //DESCRIPTION:Default Mozilla Description //END:VALARM $a->action = 'DISPLAY'; $a->add('trigger', date('Ymd\\THis', $this->reminder), array('value' => 'DATE-TIME')); $a->description = "Alarm"; //for funambol compatibility, the \GO\Base\VObject\Reader class use this to convert it to a vcalendar 1.0 aalarm tag. $e->{"X-GO-REMINDER-TIME"} = date('Ymd\\THis', $this->reminder); $e->add($a); } return $e; }
/** * Render the event row in the PDF * * @param \GO\Calendar\Model\Event $event */ private function _renderEventRow(\GO\Calendar\Model\LocalEvent $event) { $html = ''; $html .= '<tcpdf method="renderLine" />'; $html .= '<b><font style="font-size:' . $this->_timeFontSize . 'px">' . \GO\Base\Util\Date\DateTime::fromUnixtime($event->getAlternateStartTime())->format('H:i') . ' - ' . \GO\Base\Util\Date\DateTime::fromUnixtime($event->getAlternateEndTime())->format('H:i') . '</font> <font style="font-size:' . $this->_nameFontSize . 'px">' . \GO\Base\Util\String::text_to_html($event->getName(), true) . '</font></b>'; $realEvent = $event->getEvent(); if (!empty($realEvent->description)) { $html .= '<br /><font style="font-size:' . $this->_descriptionFontSize . 'px">' . $realEvent->getAttribute('description', 'html') . '</font>'; } $this->writeHTML($html, true, false, false, false, 'L'); }