public function set_attribute($attr, $value, $params=NULL) { switch ($attr) { case 'UID': if (strpos($value, '@') !== FALSE) { $this->setUID(substr($value, 0, strpos($value, '@'))); } else { $this->setUID($value); } break; case 'RECURRENCE-ID': $this->recurid = $value; break; case 'DESCRIPTION': $this->setDescription(iCalendar::ical_unescape_text($value)); break; case 'LOCATION': $this->setLocation(iCalendar::ical_unescape_text($value)); break; case 'SUMMARY': $this->setSummary(iCalendar::ical_unescape_text($value)); break; case 'CATEGORIES': $categories = explode(',', $value); $this->categories = array(); foreach ($categories as $category) { $this->categories[] = trim(iCalendar::ical_unescape_text($category)); } break; case 'URL': $this->url = iCalendar::ical_unescape_text($value); break; case 'SEQUENCE': $this->sequence = $value; break; case 'STATUS': $this->status = $value; break; case 'CREATED': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->created = $datetime->format('U'); break; case 'LAST-MODIFIED': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->updated = $datetime->format('U'); break; case 'DTSTAMP': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->dtstamp = $datetime->format('U'); break; case 'DTSTART': case 'DTEND': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $timestamp = $datetime->format('U'); if (!$this->range) { if (strpos($value, 'T')!== FALSE) { $this->setRange(new TimeRange($timestamp)); } else { $this->setRange(new DayRange($timestamp)); } if (isset($this->properties['duration'])) { $this->range->set_end($this->get_start() + $this->properties['duration']); unset($this->properties['duration']); } } else { if ($attr=='DTEND' && ($timestamp > $this->get_start()) && (($timestamp - $this->get_start()) % 86400 == 0)) { // make all day events end at 11:59:59 so they don't overlap next day $timestamp -= 1; } switch ($attr) { case 'DTSTART': $this->range->set_start($timestamp); $this->starttime= $timestamp; break; case 'DTEND': $this->range->set_end($timestamp); break; } } break; case 'TRANSP': $this->transparency = $value; break; case 'DURATION': // todo: // if this tag comes before DTSTART we will break if (preg_match('/^P([0-9]{1,2}[W])?([0-9]{1,3}[D])?([T]{0,1})?([0-9]{1,2}[H])?([0-9]{1,2}[M])?([0-9]{1,2}[S])?/', $value, $bits)) { $value = 0; switch (count($bits)) { case 7: $value += $bits[6]; //seconds case 6: $value += (60*$bits[5]); //minutes case 5: $value += (3600*$bits[4]); //hours case 4: case 3: $value += (86400*$bits[2]); //days case 2: $value += (604800*$bits[1]); //weeks } } if ($this->range) { $this->range->set_end($this->get_start() + $value); } else { $this->properties['duration'] = $value; } break; case 'RRULE': $this->add_rrule($value); break; case 'EXDATE': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->exdates[] = $datetime->format('U'); // start time break; case 'TZID': // this only gets called by ICalendar::__construct $this->tzid = $value; break; default: $this->properties[$attr] = iCalendar::ical_unescape_text($value); break; } }
public function set_attribute($attr, $value, $params = NULL) { switch ($attr) { case 'UID': $this->setUID($value); break; case 'RECURRENCE-ID': $this->recurid = $value; break; case 'DESCRIPTION': $this->setDescription(iCalendar::ical_unescape_text($value)); break; case 'LOCATION': $this->setLocation(iCalendar::ical_unescape_text($value)); break; case 'GEO': if (is_array($value)) { $this->setLocationCoordinates($value); } else { if (is_string($value)) { $this->geo = $value; } } break; case 'SUMMARY': $this->setSummary(iCalendar::ical_unescape_text($value)); break; case 'CATEGORIES': $categories = explode(',', $value); $this->categories = array(); foreach ($categories as $category) { $this->categories[] = trim(iCalendar::ical_unescape_text($category)); } break; case 'URL': $this->url = iCalendar::ical_unescape_text($value); break; case 'SEQUENCE': $this->sequence = $value; break; case 'STATUS': $this->status = $value; break; case 'CREATED': if (array_key_exists('TZID', $params)) { $timezone = self::getTimezoneForID($params['TZID']); $datetime = new DateTime($value, $timezone); } else { $datetime = new DateTime($value); } $this->created = $datetime->format('U'); break; case 'LAST-MODIFIED': if (array_key_exists('TZID', $params)) { $timezone = self::getTimezoneForID($params['TZID']); $datetime = new DateTime($value, $timezone); } else { $datetime = new DateTime($value); } $this->updated = $datetime->format('U'); break; case 'DTSTAMP': if (array_key_exists('TZID', $params)) { $timezone = self::getTimezoneForID($params['TZID']); $datetime = new DateTime($value, $timezone); } else { $datetime = new DateTime($value); } $this->dtstamp = $datetime->format('U'); break; case 'DTSTART': case 'DTEND': $dayOnly = false; if (array_key_exists('TZID', $params)) { $timezone = self::getTimezoneForID($params['TZID']); $datetime = new DateTime($value, $timezone); } else { $datetime = new DateTime($value); } $t = strpos($value, 'T'); // if there is no "T" or if the "T" is at the end if ($t === FALSE || $t == strlen($value) - 1) { $dayOnly = true; } $timestamp = $datetime->format('U'); if ($attr == 'DTEND') { if ($dayOnly) { // make all day events end at 11:59:59 so they don't overlap next day $timestamp -= 1; } } if (!$this->range) { $range = $dayOnly ? new DayRange($timestamp) : new TimeRange($timestamp); $this->setRange($range); if (isset($this->properties['duration'])) { $this->range->set_icalendar_duration($this->properties['duration']); unset($this->properties['duration']); } } else { switch ($attr) { case 'DTSTART': $this->set_start($timestamp, $dayOnly); break; case 'DTEND': $this->set_end($timestamp, $dayOnly); break; } } break; case 'TRANSP': $this->transparency = $value; break; case 'DURATION': if ($this->range) { $this->range->set_icalendar_duration($value); } else { $this->properties['duration'] = $value; } break; case 'RRULE': $this->add_rrule($value); break; case 'EXDATE': if (array_key_exists('TZID', $params)) { $timezone = self::getTimezoneForID($params['TZID']); $datetime = new DateTime($value, $timezone); } else { $datetime = new DateTime($value); } $this->exdates[] = $datetime->format('U'); // start time break; case 'TZID': // this only gets called by ICalendar::__construct $this->tzid = $value; break; default: $this->properties[$attr] = iCalendar::ical_unescape_text($value); break; } }
public function set_attribute($attr, $value, $params=NULL) { switch ($attr) { case 'UID': if (strpos($value, '@') !== FALSE) { $this->setUID(substr($value, 0, strpos($value, '@'))); } else { $this->setUID($value); } break; case 'RECURRENCE-ID': $this->recurid = $value; break; case 'DESCRIPTION': $this->setDescription(iCalendar::ical_unescape_text($value)); break; case 'LOCATION': $this->setLocation(iCalendar::ical_unescape_text($value)); break; case 'SUMMARY': $this->setSummary(iCalendar::ical_unescape_text($value)); break; case 'CATEGORIES': $categories = explode(',', $value); $this->categories = array(); foreach ($categories as $category) { $this->categories[] = trim(iCalendar::ical_unescape_text($category)); } break; case 'URL': $this->url = iCalendar::ical_unescape_text($value); break; case 'SEQUENCE': $this->sequence = $value; break; case 'STATUS': $this->status = $value; break; case 'CREATED': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->created = $datetime->format('U'); break; case 'LAST-MODIFIED': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->updated = $datetime->format('U'); break; case 'DTSTAMP': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->dtstamp = $datetime->format('U'); break; case 'DTSTART': case 'DTEND': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $timestamp = $datetime->format('U'); if (!$this->range) { if (strpos($value, 'T')!== FALSE) { $this->range = new TimeRange($timestamp); } else { $this->range = new DayRange($timestamp); } } else { if ($attr=='DTEND' && ($timestamp > $this->get_start()) && (($timestamp - $this->get_start()) % 86400 == 0)) { // make all day events end at 11:59:59 so they don't overlap next day $timestamp -= 1; } switch ($attr) { case 'DTSTART': $this->range->set_start($timestamp); break; case 'DTEND': $this->range->set_end($timestamp); break; } } break; case 'TRANSP': $this->transparency = $value; break; case 'DURATION': // todo: // if this tag comes before DTSTART we will break $this->range->set_end($this->get_start() + $value); break; case 'RRULE': $this->add_rrule($value); break; case 'EXDATE': if (array_key_exists('TZID', $params)) { $datetime = new DateTime($value, new DateTimeZone($params['TZID'])); } else { $datetime = new DateTime($value); } $this->exdates[] = $datetime->format('U'); // start time break; case 'TZID': // this only gets called by ICalendar::__construct $this->tzid = $value; break; default: $this->properties[$attr] = iCalendar::ical_unescape_text($value); break; } }