annotate vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php @ 7:430dbd5346f7

vendor sabre as distributed
author Charlie Root
date Sat, 13 Jan 2018 09:06:10 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
1 <?php
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
2
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
3 namespace Sabre\VObject\Property\ICalendar;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
4
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
5 use DateTimeZone;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
6 use Sabre\VObject\Property;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
7 use Sabre\VObject\DateTimeParser;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
8 use Sabre\VObject\TimeZoneUtil;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
9
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
10 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
11 * DateTime property
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
12 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
13 * This object represents DATE-TIME values, as defined here:
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
14 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
15 * http://tools.ietf.org/html/rfc5545#section-3.3.4
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
16 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
17 * This particular object has a bit of hackish magic that it may also in some
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
18 * cases represent a DATE value. This is because it's a common usecase to be
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
19 * able to change a DATE-TIME into a DATE.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
20 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
21 * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/).
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
22 * @author Evert Pot (http://evertpot.com/)
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
23 * @license http://sabre.io/license/ Modified BSD License
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
24 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
25 class DateTime extends Property {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
26
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
27 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
28 * In case this is a multi-value property. This string will be used as a
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
29 * delimiter.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
30 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
31 * @var string|null
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
32 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
33 public $delimiter = ',';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
34
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
35 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
36 * Sets a multi-valued property.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
37 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
38 * You may also specify DateTime objects here.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
39 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
40 * @param array $parts
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
41 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
42 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
43 public function setParts(array $parts) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
44
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
45 if (isset($parts[0]) && $parts[0] instanceof \DateTime) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
46 $this->setDateTimes($parts);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
47 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
48 parent::setParts($parts);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
49 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
50
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
51 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
52
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
53 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
54 * Updates the current value.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
55 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
56 * This may be either a single, or multiple strings in an array.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
57 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
58 * Instead of strings, you may also use DateTime here.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
59 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
60 * @param string|array|\DateTime $value
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
61 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
62 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
63 public function setValue($value) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
64
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
65 if (is_array($value) && isset($value[0]) && $value[0] instanceof \DateTime) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
66 $this->setDateTimes($value);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
67 } elseif ($value instanceof \DateTime) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
68 $this->setDateTimes(array($value));
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
69 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
70 parent::setValue($value);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
71 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
72
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
73 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
74
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
75 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
76 * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
77 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
78 * This has been 'unfolded', so only 1 line will be passed. Unescaping is
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
79 * not yet done, but parameters are not included.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
80 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
81 * @param string $val
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
82 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
83 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
84 public function setRawMimeDirValue($val) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
85
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
86 $this->setValue(explode($this->delimiter, $val));
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
87
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
88 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
89
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
90 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
91 * Returns a raw mime-dir representation of the value.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
92 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
93 * @return string
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
94 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
95 public function getRawMimeDirValue() {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
96
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
97 return implode($this->delimiter, $this->getParts());
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
98
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
99 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
100
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
101 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
102 * Returns true if this is a DATE-TIME value, false if it's a DATE.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
103 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
104 * @return bool
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
105 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
106 public function hasTime() {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
107
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
108 return strtoupper((string)$this['VALUE']) !== 'DATE';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
109
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
110 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
111
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
112 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
113 * Returns true if this is a floating DATE or DATE-TIME.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
114 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
115 * Note that DATE is always floating.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
116 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
117 public function isFloating() {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
118
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
119 return
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
120 !$this->hasTime() ||
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
121 (
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
122 !isset($this['TZID']) &&
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
123 strpos($this->getValue(),'Z')===false
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
124 );
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
125
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
126 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
127
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
128 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
129 * Returns a date-time value.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
130 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
131 * Note that if this property contained more than 1 date-time, only the
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
132 * first will be returned. To get an array with multiple values, call
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
133 * getDateTimes.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
134 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
135 * If no timezone information is known, because it's either an all-day
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
136 * property or floating time, we will use the DateTimeZone argument to
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
137 * figure out the exact date.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
138 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
139 * @param DateTimeZone $timeZone
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
140 * @return \DateTime
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
141 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
142 public function getDateTime(DateTimeZone $timeZone = null) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
143
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
144 $dt = $this->getDateTimes($timeZone);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
145 if (!$dt) return null;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
146
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
147 return $dt[0];
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
148
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
149 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
150
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
151 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
152 * Returns multiple date-time values.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
153 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
154 * If no timezone information is known, because it's either an all-day
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
155 * property or floating time, we will use the DateTimeZone argument to
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
156 * figure out the exact date.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
157 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
158 * @param DateTimeZone $timeZone
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
159 * @return \DateTime[]
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
160 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
161 public function getDateTimes(DateTimeZone $timeZone = null) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
162
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
163 // Does the property have a TZID?
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
164 $tzid = $this['TZID'];
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
165
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
166 if ($tzid) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
167 $timeZone = TimeZoneUtil::getTimeZone((string)$tzid, $this->root);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
168 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
169
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
170 $dts = array();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
171 foreach($this->getParts() as $part) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
172 $dts[] = DateTimeParser::parse($part, $timeZone);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
173 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
174 return $dts;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
175
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
176 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
177
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
178 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
179 * Sets the property as a DateTime object.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
180 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
181 * @param \DateTime $dt
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
182 * @param bool isFloating If set to true, timezones will be ignored.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
183 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
184 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
185 public function setDateTime(\DateTime $dt, $isFloating = false) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
186
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
187 $this->setDateTimes(array($dt), $isFloating);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
188
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
189 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
190
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
191 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
192 * Sets the property as multiple date-time objects.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
193 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
194 * The first value will be used as a reference for the timezones, and all
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
195 * the otehr values will be adjusted for that timezone
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
196 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
197 * @param \DateTime[] $dt
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
198 * @param bool isFloating If set to true, timezones will be ignored.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
199 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
200 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
201 public function setDateTimes(array $dt, $isFloating = false) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
202
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
203 $values = array();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
204
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
205 if($this->hasTime()) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
206
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
207 $tz = null;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
208 $isUtc = false;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
209
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
210 foreach($dt as $d) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
211
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
212 if ($isFloating) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
213 $values[] = $d->format('Ymd\\THis');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
214 continue;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
215 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
216 if (is_null($tz)) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
217 $tz = $d->getTimeZone();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
218 $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z'));
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
219 if (!$isUtc) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
220 $this->offsetSet('TZID', $tz->getName());
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
221 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
222 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
223 $d->setTimeZone($tz);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
224 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
225
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
226 if ($isUtc) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
227 $values[] = $d->format('Ymd\\THis\\Z');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
228 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
229 $values[] = $d->format('Ymd\\THis');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
230 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
231
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
232 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
233 if ($isUtc || $isFloating) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
234 $this->offsetUnset('TZID');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
235 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
236
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
237 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
238
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
239 foreach($dt as $d) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
240
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
241 $values[] = $d->format('Ymd');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
242
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
243 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
244 $this->offsetUnset('TZID');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
245
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
246 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
247
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
248 $this->value = $values;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
249
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
250 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
251
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
252 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
253 * Returns the type of value.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
254 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
255 * This corresponds to the VALUE= parameter. Every property also has a
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
256 * 'default' valueType.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
257 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
258 * @return string
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
259 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
260 public function getValueType() {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
261
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
262 return $this->hasTime()?'DATE-TIME':'DATE';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
263
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
264 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
265
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
266 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
267 * Returns the value, in the format it should be encoded for json.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
268 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
269 * This method must always return an array.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
270 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
271 * @return array
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
272 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
273 public function getJsonValue() {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
274
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
275 $dts = $this->getDateTimes();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
276 $hasTime = $this->hasTime();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
277 $isFloating = $this->isFloating();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
278
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
279 $tz = $dts[0]->getTimeZone();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
280 $isUtc = $isFloating ? false : in_array($tz->getName() , array('UTC', 'GMT', 'Z'));
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
281
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
282 return array_map(
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
283 function($dt) use ($hasTime, $isUtc) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
284
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
285 if ($hasTime) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
286 return $dt->format('Y-m-d\\TH:i:s') . ($isUtc?'Z':'');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
287 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
288 return $dt->format('Y-m-d');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
289 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
290
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
291 },
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
292 $dts
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
293 );
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
294
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
295 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
296
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
297 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
298 * Sets the json value, as it would appear in a jCard or jCal object.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
299 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
300 * The value must always be an array.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
301 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
302 * @param array $value
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
303 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
304 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
305 public function setJsonValue(array $value) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
306
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
307 // dates and times in jCal have one difference to dates and times in
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
308 // iCalendar. In jCal date-parts are separated by dashes, and
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
309 // time-parts are separated by colons. It makes sense to just remove
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
310 // those.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
311 $this->setValue(
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
312 array_map(
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
313 function($item) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
314
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
315 return strtr($item, array(':'=>'', '-'=>''));
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
316
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
317 },
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
318 $value
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
319 )
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
320 );
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
321
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
322 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
323 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
324 * We need to intercept offsetSet, because it may be used to alter the
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
325 * VALUE from DATE-TIME to DATE or vice-versa.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
326 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
327 * @param string $name
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
328 * @param mixed $value
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
329 * @return void
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
330 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
331 public function offsetSet($name, $value) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
332
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
333 parent::offsetSet($name, $value);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
334 if (strtoupper($name)!=='VALUE') {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
335 return;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
336 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
337
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
338 // This will ensure that dates are correctly encoded.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
339 $this->setDateTimes($this->getDateTimes());
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
340
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
341 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
342
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
343 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
344 * Validates the node for correctness.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
345 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
346 * The following options are supported:
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
347 * Node::REPAIR - May attempt to automatically repair the problem.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
348 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
349 * This method returns an array with detected problems.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
350 * Every element has the following properties:
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
351 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
352 * * level - problem level.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
353 * * message - A human-readable string describing the issue.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
354 * * node - A reference to the problematic node.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
355 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
356 * The level means:
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
357 * 1 - The issue was repaired (only happens if REPAIR was turned on)
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
358 * 2 - An inconsequential issue
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
359 * 3 - A severe issue.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
360 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
361 * @param int $options
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
362 * @return array
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
363 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
364 public function validate($options = 0) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
365
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
366 $messages = parent::validate($options);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
367 $valueType = $this->getValueType();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
368 $value = $this->getValue();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
369 try {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
370 switch($valueType) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
371 case 'DATE' :
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
372 $foo = DateTimeParser::parseDate($value);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
373 break;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
374 case 'DATE-TIME' :
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
375 $foo = DateTimeParser::parseDateTime($value);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
376 break;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
377 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
378 } catch (\LogicException $e) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
379 $messages[] = array(
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
380 'level' => 3,
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
381 'message' => 'The supplied value (' . $value . ') is not a correct ' . $valueType,
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
382 'node' => $this,
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
383 );
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
384 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
385 return $messages;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
386
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
387 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
388 }