1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace garethp\ews\API; |
4
|
|
|
|
5
|
|
|
use garethp\ews\API\Enumeration\DictionaryURIType; |
6
|
|
|
use garethp\ews\API\Enumeration\UnindexedFieldURIType; |
7
|
|
|
use garethp\ews\API\Exception\ExchangeException; |
8
|
|
|
|
9
|
|
|
class FieldURIManager |
10
|
|
|
{ |
11
|
|
|
protected static $unIndexedFieldURIs = []; |
12
|
|
|
protected static $dictionaryFieldURIs = []; |
13
|
|
|
|
14
|
8 |
|
protected static function setupFieldUris() |
15
|
|
|
{ |
16
|
8 |
|
if (!empty(self::$dictionaryFieldURIs) && !empty(self::$dictionaryFieldURIs)) { |
17
|
7 |
|
return; |
18
|
|
|
} |
19
|
|
|
|
20
|
1 |
|
self::$unIndexedFieldURIs = self::getFieldUrisFromClass(UnindexedFieldURIType::class); |
21
|
1 |
|
self::$dictionaryFieldURIs = self::getFieldUrisFromClass(DictionaryURIType::class); |
22
|
|
|
} |
23
|
|
|
|
24
|
1 |
|
public static function getDictionaryURIFields() |
25
|
|
|
{ |
26
|
1 |
|
self::setupFieldUris(); |
27
|
1 |
|
return self::$dictionaryFieldURIs; |
28
|
|
|
} |
29
|
|
|
|
30
|
2 |
|
protected static function getFieldUrisFromClass($className) |
31
|
|
|
{ |
32
|
|
|
//So, since we have to pass in URI's of everything we update, we need to fetch them |
33
|
2 |
|
$reflection = new \ReflectionClass($className); |
34
|
2 |
|
$constants = $reflection->getConstants(); |
35
|
2 |
|
$constantsFound = array(); |
36
|
|
|
|
37
|
|
|
//Loop through all URI's to list them in an array |
38
|
2 |
|
foreach ($constants as $constant) { |
39
|
2 |
|
$exploded = explode(":", strtolower($constant)); |
40
|
2 |
|
if (count($exploded) == 1) { |
41
|
2 |
|
$exploded = ['item', $exploded[0]]; |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
//It starts in order ['contacts', 'physicaladdress', 'city], we want it in |
45
|
|
|
//['physicaladdress', 'contacts', 'city] |
46
|
2 |
|
$temp = $exploded[0]; |
47
|
2 |
|
$exploded[0] = $exploded[1]; |
48
|
2 |
|
$exploded[1] = $temp; |
49
|
|
|
|
50
|
2 |
|
$depth = count($exploded) - 1; |
51
|
2 |
|
$current = &$constantsFound; |
52
|
|
|
|
53
|
|
|
//Use the exploded array as a way to create a multidimensional array. For example, |
54
|
|
|
//['contacts', 'physicaladdress', 'city'] becomes |
55
|
|
|
//['contacts' => ['physicaladdress' => ['city' => 'contacts:PhysicalAddress:City']]] |
56
|
2 |
|
foreach ($exploded as $count => $key) { |
57
|
2 |
|
if ($count < $depth && !isset($current[$key])) { |
58
|
2 |
|
$current[$key] = array(); |
59
|
|
|
} |
60
|
|
|
|
61
|
2 |
|
if ($count < $depth) { |
62
|
2 |
|
$current = &$current[$key]; |
63
|
2 |
|
continue; |
64
|
|
|
} |
65
|
|
|
|
66
|
2 |
|
$current[$key] = $constant; |
67
|
|
|
} |
68
|
|
|
} |
69
|
|
|
|
70
|
2 |
|
return $constantsFound; |
71
|
|
|
} |
72
|
|
|
|
73
|
8 |
|
public static function getFieldUriByName($fieldName, $preference = 'item') |
74
|
|
|
{ |
75
|
8 |
|
self::setupFieldUris(); |
76
|
8 |
|
$fieldName = strtolower($fieldName); |
77
|
8 |
|
$preference = strtolower($preference); |
78
|
|
|
|
79
|
8 |
|
if (!isset(self::$unIndexedFieldURIs[$fieldName])) { |
80
|
|
|
return false; |
81
|
|
|
} |
82
|
|
|
|
83
|
8 |
|
if (!isset(self::$unIndexedFieldURIs[$fieldName][$preference])) { |
84
|
4 |
|
$preference = 'item'; |
85
|
|
|
} |
86
|
|
|
|
87
|
8 |
|
if (!isset(self::$unIndexedFieldURIs[$fieldName][$preference])) { |
88
|
|
|
throw new ExchangeException("Could not find uri $preference:$fieldName"); |
|
|
|
|
89
|
|
|
} |
90
|
|
|
|
91
|
8 |
|
return self::$unIndexedFieldURIs[$fieldName][$preference]; |
92
|
|
|
} |
93
|
|
|
|
94
|
1 |
|
public static function getIndexedFieldUriByName($fieldName, $preference = 'item', $entryKey = false) |
95
|
|
|
{ |
96
|
1 |
|
self::setupFieldUris(); |
97
|
1 |
|
$fieldName = strtolower($fieldName); |
98
|
1 |
|
$preference = strtolower($preference); |
99
|
1 |
|
$entryKey = strtolower($entryKey); |
100
|
|
|
|
101
|
1 |
|
if (!isset(self::$dictionaryFieldURIs[$fieldName])) { |
102
|
|
|
return false; |
103
|
|
|
} |
104
|
|
|
|
105
|
1 |
|
if (!isset(self::$dictionaryFieldURIs[$fieldName][$preference])) { |
106
|
|
|
throw new ExchangeException("Could not find uri $preference:$fieldName"); |
|
|
|
|
107
|
|
|
} |
108
|
|
|
|
109
|
1 |
|
$fieldUri = self::$dictionaryFieldURIs[$fieldName][$preference]; |
110
|
1 |
|
if (!is_array($fieldUri)) { |
111
|
1 |
|
return $fieldUri; |
112
|
|
|
} |
113
|
|
|
|
114
|
1 |
|
if (!$entryKey || !isset($fieldUri[$entryKey])) { |
115
|
|
|
throw new ExchangeException("Could not find FieldURI"); |
116
|
|
|
} |
117
|
|
|
|
118
|
1 |
|
return $fieldUri[$entryKey]; |
119
|
|
|
} |
120
|
|
|
} |
121
|
|
|
|