125 lines
3.3 KiB
PHP
125 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace Sabre\VObject\Property;
|
|
|
|
use Sabre\VObject;
|
|
|
|
/**
|
|
* Compound property.
|
|
*
|
|
* This class adds (de)serialization of compound properties to/from arrays.
|
|
*
|
|
* Currently the following properties from RFC 6350 are mapped to use this
|
|
* class:
|
|
*
|
|
* N: Section 6.2.2
|
|
* ADR: Section 6.3.1
|
|
* ORG: Section 6.6.4
|
|
* CATEGORIES: Section 6.7.1
|
|
*
|
|
* In order to use this correctly, you must call setParts and getParts to
|
|
* retrieve and modify dates respectively.
|
|
*
|
|
* @author Thomas Tanghus (http://tanghus.net/)
|
|
* @author Lars Kneschke
|
|
* @author Evert Pot (http://evertpot.com/)
|
|
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
|
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
|
*/
|
|
class Compound extends VObject\Property {
|
|
|
|
/**
|
|
* If property names are added to this map, they will be (de)serialised as arrays
|
|
* using the getParts() and setParts() methods.
|
|
* The keys are the property names, values are delimiter chars.
|
|
*
|
|
* @var array
|
|
*/
|
|
static public $delimiterMap = array(
|
|
'N' => ';',
|
|
'ADR' => ';',
|
|
'ORG' => ';',
|
|
'CATEGORIES' => ',',
|
|
);
|
|
|
|
/**
|
|
* The currently used delimiter.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $delimiter = null;
|
|
|
|
/**
|
|
* Get a compound value as an array.
|
|
*
|
|
* @param $name string
|
|
* @return array
|
|
*/
|
|
public function getParts() {
|
|
|
|
if (is_null($this->value)) {
|
|
return array();
|
|
}
|
|
|
|
$delimiter = $this->getDelimiter();
|
|
|
|
// split by any $delimiter which is NOT prefixed by a slash.
|
|
// Note that this is not a a perfect solution. If a value is prefixed
|
|
// by two slashes, it should actually be split anyway.
|
|
//
|
|
// Hopefully we can fix this better in a future version, where we can
|
|
// break compatibility a bit.
|
|
$compoundValues = preg_split("/(?<!\\\)$delimiter/", $this->value);
|
|
|
|
// remove slashes from any semicolon and comma left escaped in the single values
|
|
$compoundValues = array_map(
|
|
function($val) {
|
|
return strtr($val, array('\,' => ',', '\;' => ';'));
|
|
}, $compoundValues);
|
|
|
|
return $compoundValues;
|
|
|
|
}
|
|
|
|
/**
|
|
* Returns the delimiter for this property.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDelimiter() {
|
|
|
|
if (!$this->delimiter) {
|
|
if (isset(self::$delimiterMap[$this->name])) {
|
|
$this->delimiter = self::$delimiterMap[$this->name];
|
|
} else {
|
|
// To be a bit future proof, we are going to default the
|
|
// delimiter to ;
|
|
$this->delimiter = ';';
|
|
}
|
|
}
|
|
return $this->delimiter;
|
|
|
|
}
|
|
|
|
/**
|
|
* Set a compound value as an array.
|
|
*
|
|
*
|
|
* @param $name string
|
|
* @return array
|
|
*/
|
|
public function setParts(array $values) {
|
|
|
|
// add slashes to all semicolons and commas in the single values
|
|
$values = array_map(
|
|
function($val) {
|
|
return strtr($val, array(',' => '\,', ';' => '\;'));
|
|
}, $values);
|
|
|
|
$this->setValue(
|
|
implode($this->getDelimiter(), $values)
|
|
);
|
|
|
|
}
|
|
|
|
}
|