| @@ -61,24 +61,42 @@ | ||
| 61 | 61 | 'dtstart' => $this->getDtStart(), |
| 62 | 62 | 'dtend' => $this->getDtEnd() |
| 63 | 63 | ]; |
| 64 | 64 | |
| 65 | + $timezone = !empty($this->data['timezone']) && $this->data['timezone'] !== 'UTC' | |
| 66 | + ? $this->data['timezone'] | |
| 67 | + : null; | |
| 68 | + | |
| 69 | + $prefix = $timezone ? ';TZID=' . $timezone . ':' : ':'; | |
| 70 | + $format = $timezone ? 'Ymd\THis' : $this->dateTimeFormat; | |
| 71 | + | |
| 65 | 72 | foreach ($dates as $key => $value) { |
| 66 | 73 | |
| 67 | - $dateTime = $value; | |
| 74 | + if ($this->isPrefixedDateTime($value)) { | |
| 75 | + continue; | |
| 76 | + } | |
| 68 | 77 | |
| 69 | - if (is_string($value)) { | |
| 70 | - $dateTime = new DateTime($value, new DateTimeZone('UTC')); | |
| 78 | + $dateTime = is_string($value) | |
| 79 | + ? new DateTime($value, new DateTimeZone('UTC')) | |
| 80 | + : $value; | |
| 81 | + | |
| 82 | + if (!$dateTime instanceof DateTime) { | |
| 83 | + throw new Exception("Invalid value: {$value} for {$key}."); | |
| 71 | 84 | } |
| 72 | 85 | |
| 73 | - if ($dateTime instanceof DateTime) { | |
| 74 | - $this->data[$key] = $dateTime->format($this->dateTimeFormat); | |
| 75 | - } else { | |
| 76 | - throw new Exception("Invalid value: {$value} for {$key}."); | |
| 86 | + if ($timezone) { | |
| 87 | + $dateTime->setTimezone(new DateTimeZone($timezone)); | |
| 77 | 88 | } |
| 89 | + | |
| 90 | + $this->data[$key] = $prefix . $dateTime->format($format); | |
| 78 | 91 | } |
| 79 | 92 | } |
| 80 | 93 | |
| 94 | + private function isPrefixedDateTime($value) | |
| 95 | + { | |
| 96 | + return is_string($value) && isset($value[0]) && ($value[0] === ':' || $value[0] === ';'); | |
| 97 | + } | |
| 98 | + | |
| 81 | 99 | protected function getDtStart() |
| 82 | 100 | { |
| 83 | 101 | if (!isset($this->data['dtstart'])) { |
| 84 | 102 | if (!isset($this->data['DTSTART'])) { |
| @@ -164,8 +182,10 @@ | ||
| 164 | 182 | } |
| 165 | 183 | |
| 166 | 184 | $str = rtrim($str, ';'); |
| 167 | 185 | |
| 186 | + $str .= ';SCHEDULE-AGENT=CLIENT'; | |
| 187 | + | |
| 168 | 188 | $str .= ":mailto:{$attendee['email']}"; |
| 169 | 189 | |
| 170 | 190 | $attendee['str'] = $str; |
| 171 | 191 | } |
| @@ -205,8 +225,10 @@ | ||
| 205 | 225 | } |
| 206 | 226 | |
| 207 | 227 | $str = rtrim($str, ';'); |
| 208 | 228 | |
| 229 | + $str .= ';SCHEDULE-AGENT=CLIENT'; | |
| 230 | + | |
| 209 | 231 | $str .= ":mailto:{$organizer['email']}"; |
| 210 | 232 | |
| 211 | 233 | $organizer['str'] = $str; |
| 212 | 234 | } |
| @@ -337,10 +359,10 @@ | ||
| 337 | 359 | $calendar[] = "DTSTAMP:{$this->data['dtstamp']}"; |
| 338 | 360 | $calendar[] = "LAST-MODIFIED:{$this->data['last-modified']}"; |
| 339 | 361 | $calendar[] = "SEQUENCE:{$this->data['sequence']}"; |
| 340 | 362 | $calendar[] = "UID:{$this->data['uid']}"; |
| 341 | - $calendar[] = "DTSTART:{$this->data['dtstart']}"; | |
| 342 | - $calendar[] = "DTEND:{$this->data['dtend']}"; | |
| 363 | + $calendar[] = "DTSTART{$this->data['dtstart']}"; | |
| 364 | + $calendar[] = "DTEND{$this->data['dtend']}"; | |
| 343 | 365 | |
| 344 | 366 | if (isset($this->data['transp'])) { |
| 345 | 367 | $calendar[] = "TRANSP:{$this->data['transp']}"; |
| 346 | 368 | } else { |