1<?php 2 3namespace Sabre\VObject\Property\ICalendar; 4 5use Sabre\VObject\DateTimeParser; 6use Sabre\VObject\Property; 7use Sabre\Xml; 8 9/** 10 * Period property. 11 * 12 * This object represents PERIOD values, as defined here: 13 * 14 * http://tools.ietf.org/html/rfc5545#section-3.8.2.6 15 * 16 * @copyright Copyright (C) fruux GmbH (https://fruux.com/) 17 * @author Evert Pot (http://evertpot.com/) 18 * @license http://sabre.io/license/ Modified BSD License 19 */ 20class Period extends Property 21{ 22 /** 23 * In case this is a multi-value property. This string will be used as a 24 * delimiter. 25 * 26 * @var string|null 27 */ 28 public $delimiter = ','; 29 30 /** 31 * Sets a raw value coming from a mimedir (iCalendar/vCard) file. 32 * 33 * This has been 'unfolded', so only 1 line will be passed. Unescaping is 34 * not yet done, but parameters are not included. 35 * 36 * @param string $val 37 */ 38 public function setRawMimeDirValue($val) 39 { 40 $this->setValue(explode($this->delimiter, $val)); 41 } 42 43 /** 44 * Returns a raw mime-dir representation of the value. 45 * 46 * @return string 47 */ 48 public function getRawMimeDirValue() 49 { 50 return implode($this->delimiter, $this->getParts()); 51 } 52 53 /** 54 * Returns the type of value. 55 * 56 * This corresponds to the VALUE= parameter. Every property also has a 57 * 'default' valueType. 58 * 59 * @return string 60 */ 61 public function getValueType() 62 { 63 return 'PERIOD'; 64 } 65 66 /** 67 * Sets the json value, as it would appear in a jCard or jCal object. 68 * 69 * The value must always be an array. 70 * 71 * @param array $value 72 */ 73 public function setJsonValue(array $value) 74 { 75 $value = array_map( 76 function ($item) { 77 return strtr(implode('/', $item), [':' => '', '-' => '']); 78 }, 79 $value 80 ); 81 parent::setJsonValue($value); 82 } 83 84 /** 85 * Returns the value, in the format it should be encoded for json. 86 * 87 * This method must always return an array. 88 * 89 * @return array 90 */ 91 public function getJsonValue() 92 { 93 $return = []; 94 foreach ($this->getParts() as $item) { 95 list($start, $end) = explode('/', $item, 2); 96 97 $start = DateTimeParser::parseDateTime($start); 98 99 // This is a duration value. 100 if ('P' === $end[0]) { 101 $return[] = [ 102 $start->format('Y-m-d\\TH:i:s'), 103 $end, 104 ]; 105 } else { 106 $end = DateTimeParser::parseDateTime($end); 107 $return[] = [ 108 $start->format('Y-m-d\\TH:i:s'), 109 $end->format('Y-m-d\\TH:i:s'), 110 ]; 111 } 112 } 113 114 return $return; 115 } 116 117 /** 118 * This method serializes only the value of a property. This is used to 119 * create xCard or xCal documents. 120 * 121 * @param Xml\Writer $writer XML writer 122 */ 123 protected function xmlSerializeValue(Xml\Writer $writer) 124 { 125 $writer->startElement(strtolower($this->getValueType())); 126 $value = $this->getJsonValue(); 127 $writer->writeElement('start', $value[0][0]); 128 129 if ('P' === $value[0][1][0]) { 130 $writer->writeElement('duration', $value[0][1]); 131 } else { 132 $writer->writeElement('end', $value[0][1]); 133 } 134 135 $writer->endElement(); 136 } 137} 138