Mercurial > hg > rc1
comparison vendor/sabre/vobject/lib/Property/ICalendar/Recur.php @ 7:430dbd5346f7
vendor sabre as distributed
| author | Charlie Root |
|---|---|
| date | Sat, 13 Jan 2018 09:06:10 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 6:cec75ba50afc | 7:430dbd5346f7 |
|---|---|
| 1 <?php | |
| 2 | |
| 3 namespace Sabre\VObject\Property\ICalendar; | |
| 4 | |
| 5 use | |
| 6 Sabre\VObject\Property, | |
| 7 Sabre\VObject\Parser\MimeDir; | |
| 8 | |
| 9 /** | |
| 10 * Recur property | |
| 11 * | |
| 12 * This object represents RECUR properties. | |
| 13 * These values are just used for RRULE and the now deprecated EXRULE. | |
| 14 * | |
| 15 * The RRULE property may look something like this: | |
| 16 * | |
| 17 * RRULE:FREQ=MONTHLY;BYDAY=1,2,3;BYHOUR=5. | |
| 18 * | |
| 19 * This property exposes this as a key=>value array that is accessible using | |
| 20 * getParts, and may be set using setParts. | |
| 21 * | |
| 22 * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/). | |
| 23 * @author Evert Pot (http://evertpot.com/) | |
| 24 * @license http://sabre.io/license/ Modified BSD License | |
| 25 */ | |
| 26 class Recur extends Property { | |
| 27 | |
| 28 /** | |
| 29 * Updates the current value. | |
| 30 * | |
| 31 * This may be either a single, or multiple strings in an array. | |
| 32 * | |
| 33 * @param string|array $value | |
| 34 * @return void | |
| 35 */ | |
| 36 public function setValue($value) { | |
| 37 | |
| 38 // If we're getting the data from json, we'll be receiving an object | |
| 39 if ($value instanceof \StdClass) { | |
| 40 $value = (array)$value; | |
| 41 } | |
| 42 | |
| 43 if (is_array($value)) { | |
| 44 $newVal = array(); | |
| 45 foreach($value as $k=>$v) { | |
| 46 | |
| 47 if (is_string($v)) { | |
| 48 $v = strtoupper($v); | |
| 49 | |
| 50 // The value had multiple sub-values | |
| 51 if (strpos($v,',')!==false) { | |
| 52 $v = explode(',', $v); | |
| 53 } | |
| 54 } else { | |
| 55 $v = array_map('strtoupper', $v); | |
| 56 } | |
| 57 | |
| 58 $newVal[strtoupper($k)] = $v; | |
| 59 } | |
| 60 $this->value = $newVal; | |
| 61 } elseif (is_string($value)) { | |
| 62 $this->value = self::stringToArray($value); | |
| 63 } else { | |
| 64 throw new \InvalidArgumentException('You must either pass a string, or a key=>value array'); | |
| 65 } | |
| 66 | |
| 67 } | |
| 68 | |
| 69 /** | |
| 70 * Returns the current value. | |
| 71 * | |
| 72 * This method will always return a singular value. If this was a | |
| 73 * multi-value object, some decision will be made first on how to represent | |
| 74 * it as a string. | |
| 75 * | |
| 76 * To get the correct multi-value version, use getParts. | |
| 77 * | |
| 78 * @return string | |
| 79 */ | |
| 80 public function getValue() { | |
| 81 | |
| 82 $out = array(); | |
| 83 foreach($this->value as $key=>$value) { | |
| 84 $out[] = $key . '=' . (is_array($value)?implode(',', $value):$value); | |
| 85 } | |
| 86 return strtoupper(implode(';',$out)); | |
| 87 | |
| 88 } | |
| 89 | |
| 90 /** | |
| 91 * Sets a multi-valued property. | |
| 92 * | |
| 93 * @param array $parts | |
| 94 * @return void | |
| 95 */ | |
| 96 public function setParts(array $parts) { | |
| 97 | |
| 98 $this->setValue($parts); | |
| 99 | |
| 100 } | |
| 101 | |
| 102 /** | |
| 103 * Returns a multi-valued property. | |
| 104 * | |
| 105 * This method always returns an array, if there was only a single value, | |
| 106 * it will still be wrapped in an array. | |
| 107 * | |
| 108 * @return array | |
| 109 */ | |
| 110 public function getParts() { | |
| 111 | |
| 112 return $this->value; | |
| 113 | |
| 114 } | |
| 115 | |
| 116 /** | |
| 117 * Sets a raw value coming from a mimedir (iCalendar/vCard) file. | |
| 118 * | |
| 119 * This has been 'unfolded', so only 1 line will be passed. Unescaping is | |
| 120 * not yet done, but parameters are not included. | |
| 121 * | |
| 122 * @param string $val | |
| 123 * @return void | |
| 124 */ | |
| 125 public function setRawMimeDirValue($val) { | |
| 126 | |
| 127 $this->setValue($val); | |
| 128 | |
| 129 } | |
| 130 | |
| 131 /** | |
| 132 * Returns a raw mime-dir representation of the value. | |
| 133 * | |
| 134 * @return string | |
| 135 */ | |
| 136 public function getRawMimeDirValue() { | |
| 137 | |
| 138 return $this->getValue(); | |
| 139 | |
| 140 } | |
| 141 | |
| 142 /** | |
| 143 * Returns the type of value. | |
| 144 * | |
| 145 * This corresponds to the VALUE= parameter. Every property also has a | |
| 146 * 'default' valueType. | |
| 147 * | |
| 148 * @return string | |
| 149 */ | |
| 150 public function getValueType() { | |
| 151 | |
| 152 return "RECUR"; | |
| 153 | |
| 154 } | |
| 155 | |
| 156 /** | |
| 157 * Returns the value, in the format it should be encoded for json. | |
| 158 * | |
| 159 * This method must always return an array. | |
| 160 * | |
| 161 * @return array | |
| 162 */ | |
| 163 public function getJsonValue() { | |
| 164 | |
| 165 $values = array(); | |
| 166 foreach($this->getParts() as $k=>$v) { | |
| 167 $values[strtolower($k)] = $v; | |
| 168 } | |
| 169 return array($values); | |
| 170 | |
| 171 } | |
| 172 | |
| 173 /** | |
| 174 * Parses an RRULE value string, and turns it into a struct-ish array. | |
| 175 * | |
| 176 * @param string $value | |
| 177 * @return array | |
| 178 */ | |
| 179 static function stringToArray($value) { | |
| 180 | |
| 181 $value = strtoupper($value); | |
| 182 $newValue = array(); | |
| 183 foreach(explode(';', $value) as $part) { | |
| 184 | |
| 185 // Skipping empty parts. | |
| 186 if (empty($part)) { | |
| 187 continue; | |
| 188 } | |
| 189 list($partName, $partValue) = explode('=', $part); | |
| 190 | |
| 191 // The value itself had multiple values.. | |
| 192 if (strpos($partValue,',')!==false) { | |
| 193 $partValue=explode(',', $partValue); | |
| 194 } | |
| 195 $newValue[$partName] = $partValue; | |
| 196 | |
| 197 } | |
| 198 | |
| 199 return $newValue; | |
| 200 | |
| 201 } | |
| 202 | |
| 203 } |
