Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
bc77d7c0 TO |
3 | +--------------------------------------------------------------------+ |
4 | | Copyright CiviCRM LLC. All rights reserved. | | |
5 | | | | |
6 | | This work is published under the GNU AGPLv3 license with some | | |
7 | | permitted exceptions and without any warranty. For full license | | |
8 | | and copyright information, see https://civicrm.org/licensing | | |
9 | +--------------------------------------------------------------------+ | |
e70a7fc0 | 10 | */ |
6a488035 TO |
11 | |
12 | /** | |
13 | * | |
14 | * @package CRM | |
ca5cec67 | 15 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
6a488035 TO |
16 | */ |
17 | ||
18 | /** | |
192d36c5 | 19 | * This class handle creation of location block elements. |
6a488035 TO |
20 | */ |
21 | class CRM_Core_BAO_Location extends CRM_Core_DAO { | |
22 | ||
23 | /** | |
fe482240 | 24 | * Location block element array. |
518fa0ee | 25 | * @var array |
6a488035 | 26 | */ |
518fa0ee | 27 | public static $blocks = ['phone', 'email', 'im', 'openid', 'address']; |
6a488035 TO |
28 | |
29 | /** | |
fe482240 | 30 | * Create various elements of location block. |
6a488035 | 31 | * |
6a0b768e TO |
32 | * @param array $params |
33 | * (reference ) an assoc array of name/value pairs. | |
34 | * @param bool $fixAddress | |
35 | * True if you need to fix (format) address values. | |
6a488035 TO |
36 | * before inserting in db |
37 | * | |
a6c01b45 | 38 | * @return array |
6a488035 | 39 | */ |
531b6c9e | 40 | public static function create(&$params, $fixAddress = TRUE) { |
be2fb01f | 41 | $location = []; |
6a488035 TO |
42 | if (!self::dataExists($params)) { |
43 | return $location; | |
44 | } | |
45 | ||
46 | // create location blocks. | |
47 | foreach (self::$blocks as $block) { | |
ae7397a3 | 48 | if ($block !== 'address') { |
531b6c9e | 49 | $location[$block] = CRM_Core_BAO_Block::create($block, $params); |
6a488035 | 50 | } |
ae7397a3 | 51 | elseif (is_array($params['address'] ?? NULL)) { |
52 | $location[$block] = CRM_Core_BAO_Address::legacyCreate($params, $fixAddress); | |
6a488035 TO |
53 | } |
54 | } | |
55 | ||
6a488035 TO |
56 | return $location; |
57 | } | |
58 | ||
59 | /** | |
fe482240 | 60 | * Creates the entry in the civicrm_loc_block. |
ad37ac8e | 61 | * |
41c9d147 | 62 | * @param array $location |
ad37ac8e | 63 | * @param array $entityElements |
64 | * | |
65 | * @return int | |
6a488035 | 66 | */ |
41c9d147 | 67 | public static function createLocBlock($location, $entityElements) { |
aa06ad4a | 68 | CRM_Core_Error::deprecatedFunctionWarning('Use LocBlock api'); |
6a488035 | 69 | $locId = self::findExisting($entityElements); |
be2fb01f | 70 | $locBlock = []; |
6a488035 TO |
71 | |
72 | if ($locId) { | |
73 | $locBlock['id'] = $locId; | |
74 | } | |
75 | ||
be2fb01f | 76 | foreach ([ |
518fa0ee SL |
77 | 'phone', |
78 | 'email', | |
79 | 'im', | |
80 | 'address', | |
81 | ] as $loc) { | |
0d8afee2 CW |
82 | $locBlock["{$loc}_id"] = !empty($location["$loc"][0]) ? $location["$loc"][0]->id : NULL; |
83 | $locBlock["{$loc}_2_id"] = !empty($location["$loc"][1]) ? $location["$loc"][1]->id : NULL; | |
6a488035 TO |
84 | } |
85 | ||
86 | $countNull = 0; | |
87 | foreach ($locBlock as $key => $block) { | |
88 | if (empty($locBlock[$key])) { | |
89 | $locBlock[$key] = 'null'; | |
90 | $countNull++; | |
91 | } | |
92 | } | |
93 | ||
94 | if (count($locBlock) == $countNull) { | |
95 | // implies nothing is set. | |
96 | return NULL; | |
97 | } | |
98 | ||
41c9d147 | 99 | return self::addLocBlock($locBlock)->id; |
6a488035 TO |
100 | } |
101 | ||
102 | /** | |
fe482240 | 103 | * Takes an entity array and finds the existing location block. |
ad37ac8e | 104 | * |
105 | * @param array $entityElements | |
106 | * | |
107 | * @return int | |
6a488035 | 108 | */ |
00be9182 | 109 | public static function findExisting($entityElements) { |
353ffa53 | 110 | $eid = $entityElements['entity_id']; |
6a488035 | 111 | $etable = $entityElements['entity_table']; |
353ffa53 | 112 | $query = " |
6a488035 TO |
113 | SELECT e.loc_block_id as locId |
114 | FROM {$etable} e | |
115 | WHERE e.id = %1"; | |
116 | ||
be2fb01f | 117 | $params = [1 => [$eid, 'Integer']]; |
6a488035 TO |
118 | $dao = CRM_Core_DAO::executeQuery($query, $params); |
119 | while ($dao->fetch()) { | |
120 | $locBlockId = $dao->locId; | |
121 | } | |
122 | return $locBlockId; | |
123 | } | |
124 | ||
125 | /** | |
fe482240 | 126 | * Takes an associative array and adds location block. |
6a488035 | 127 | * |
6a0b768e | 128 | * @param array $params |
6a488035 | 129 | * |
41c9d147 | 130 | * @return CRM_Core_DAO_LocBlock |
ad37ac8e | 131 | * Object on success, null otherwise |
6a488035 | 132 | */ |
41c9d147 | 133 | public static function addLocBlock($params) { |
6a488035 | 134 | $locBlock = new CRM_Core_DAO_LocBlock(); |
6a488035 | 135 | $locBlock->copyValues($params); |
531b6c9e | 136 | $locBlock->save(); |
137 | return $locBlock; | |
6a488035 TO |
138 | } |
139 | ||
140 | /** | |
fe482240 | 141 | * Delete the Location Block. |
6a488035 | 142 | * |
6a0b768e TO |
143 | * @param int $locBlockId |
144 | * Id of the Location Block. | |
6a488035 TO |
145 | */ |
146 | public static function deleteLocBlock($locBlockId) { | |
147 | if (!$locBlockId) { | |
148 | return; | |
149 | } | |
150 | ||
151 | $locBlock = new CRM_Core_DAO_LocBlock(); | |
152 | $locBlock->id = $locBlockId; | |
153 | ||
154 | $locBlock->find(TRUE); | |
155 | ||
156 | //resolve conflict of having same ids for multiple blocks | |
be2fb01f | 157 | $store = [ |
6a488035 TO |
158 | 'IM_1' => $locBlock->im_id, |
159 | 'IM_2' => $locBlock->im_2_id, | |
160 | 'Email_1' => $locBlock->email_id, | |
161 | 'Email_2' => $locBlock->email_2_id, | |
162 | 'Phone_1' => $locBlock->phone_id, | |
163 | 'Phone_2' => $locBlock->phone_2_id, | |
164 | 'Address_1' => $locBlock->address_id, | |
165 | 'Address_2' => $locBlock->address_2_id, | |
be2fb01f | 166 | ]; |
6a488035 TO |
167 | $locBlock->delete(); |
168 | foreach ($store as $daoName => $id) { | |
169 | if ($id) { | |
4d5c2eb5 | 170 | $daoName = 'CRM_Core_DAO_' . substr($daoName, 0, -2); |
171 | $dao = new $daoName(); | |
6a488035 TO |
172 | $dao->id = $id; |
173 | $dao->find(TRUE); | |
174 | $dao->delete(); | |
6a488035 TO |
175 | } |
176 | } | |
177 | } | |
178 | ||
179 | /** | |
fe482240 | 180 | * Check if there is data to create the object. |
6a488035 | 181 | * |
6a0b768e TO |
182 | * @param array $params |
183 | * (reference ) an assoc array of name/value pairs. | |
6a488035 | 184 | * |
acb1052e | 185 | * @return bool |
6a488035 | 186 | */ |
00be9182 | 187 | public static function dataExists(&$params) { |
6a488035 TO |
188 | // return if no data present |
189 | $dataExists = FALSE; | |
190 | foreach (self::$blocks as $block) { | |
191 | if (array_key_exists($block, $params)) { | |
192 | $dataExists = TRUE; | |
193 | break; | |
194 | } | |
195 | } | |
196 | ||
197 | return $dataExists; | |
198 | } | |
199 | ||
200 | /** | |
18dfc6be | 201 | * Get array of location block BAOs. |
ad37ac8e | 202 | * |
203 | * @param array $entityBlock | |
fd31fa4c EM |
204 | * @param bool $microformat |
205 | * | |
18dfc6be EM |
206 | * @return CRM_Core_BAO_Location[]|null |
207 | * | |
208 | * @throws \CRM_Core_Exception | |
6a488035 | 209 | */ |
18dfc6be | 210 | public static function getValues($entityBlock, $microformat = FALSE): ?array { |
6a488035 | 211 | if (empty($entityBlock)) { |
18dfc6be EM |
212 | // Can't imagine this is reachable. |
213 | CRM_Core_Error::deprecatedWarning('calling function pointlessly is deprecated'); | |
6a488035 TO |
214 | return NULL; |
215 | } | |
18dfc6be EM |
216 | return [ |
217 | 'im' => CRM_Core_BAO_IM::getValues($entityBlock), | |
218 | 'email' => CRM_Core_BAO_Email::getValues($entityBlock), | |
219 | 'openid' => CRM_Core_BAO_OpenID::getValues($entityBlock), | |
220 | 'phone' => CRM_Core_BAO_Phone::getValues($entityBlock), | |
221 | 'address' => CRM_Core_BAO_Address::getValues($entityBlock, $microformat), | |
be2fb01f | 222 | ]; |
6a488035 TO |
223 | } |
224 | ||
225 | /** | |
fe482240 | 226 | * Delete all the block associated with the location. |
6a488035 | 227 | * |
0a104499 | 228 | * Note a universe search on 1 Oct 2020 found no calls to this function. |
229 | * | |
230 | * @deprecated | |
231 | * | |
6a0b768e TO |
232 | * @param int $contactId |
233 | * Contact id. | |
234 | * @param int $locationTypeId | |
235 | * Id of the location to delete. | |
ac15829d | 236 | * @throws CRM_Core_Exception |
6a488035 | 237 | */ |
00be9182 | 238 | public static function deleteLocationBlocks($contactId, $locationTypeId) { |
0a104499 | 239 | CRM_Core_Error::deprecatedFunctionWarning('Use v4 api'); |
6a488035 TO |
240 | // ensure that contactId has a value |
241 | if (empty($contactId) || | |
242 | !CRM_Utils_Rule::positiveInteger($contactId) | |
243 | ) { | |
ac15829d | 244 | throw new CRM_Core_Exception('Incorrect contact id parameter passed to deleteLocationBlocks'); |
6a488035 TO |
245 | } |
246 | ||
247 | if (empty($locationTypeId) || | |
248 | !CRM_Utils_Rule::positiveInteger($locationTypeId) | |
249 | ) { | |
250 | // so we only delete the blocks which DO NOT have a location type Id | |
251 | // CRM-3581 | |
252 | $locationTypeId = 'null'; | |
253 | } | |
254 | ||
be2fb01f | 255 | static $blocks = ['Address', 'Phone', 'IM', 'OpenID', 'Email']; |
6a488035 | 256 | |
be2fb01f | 257 | $params = ['contact_id' => $contactId, 'location_type_id' => $locationTypeId]; |
6a488035 TO |
258 | foreach ($blocks as $name) { |
259 | CRM_Core_BAO_Block::blockDelete($name, $params); | |
260 | } | |
261 | } | |
262 | ||
6a488035 | 263 | /** |
ad37ac8e | 264 | * Make sure contact should have only one primary block, CRM-5051. |
6a488035 | 265 | * |
6a0b768e TO |
266 | * @param int $contactId |
267 | * Contact id. | |
6a488035 | 268 | */ |
00be9182 | 269 | public static function checkPrimaryBlocks($contactId) { |
6a488035 TO |
270 | if (!$contactId) { |
271 | return; | |
272 | } | |
273 | ||
274 | // get the loc block ids. | |
be2fb01f CW |
275 | $primaryLocBlockIds = CRM_Contact_BAO_Contact::getLocBlockIds($contactId, ['is_primary' => 1]); |
276 | $nonPrimaryBlockIds = CRM_Contact_BAO_Contact::getLocBlockIds($contactId, ['is_primary' => 0]); | |
6a488035 | 277 | |
be2fb01f | 278 | foreach ([ |
518fa0ee SL |
279 | 'Email', |
280 | 'IM', | |
281 | 'Phone', | |
282 | 'Address', | |
283 | 'OpenID', | |
284 | ] as $block) { | |
6a488035 TO |
285 | $name = strtolower($block); |
286 | if (array_key_exists($name, $primaryLocBlockIds) && | |
287 | !CRM_Utils_System::isNull($primaryLocBlockIds[$name]) | |
288 | ) { | |
289 | if (count($primaryLocBlockIds[$name]) > 1) { | |
290 | // keep only single block as primary. | |
291 | $primaryId = array_pop($primaryLocBlockIds[$name]); | |
292 | $resetIds = "(" . implode(',', $primaryLocBlockIds[$name]) . ")"; | |
293 | // reset all primary except one. | |
294 | CRM_Core_DAO::executeQuery("UPDATE civicrm_$name SET is_primary = 0 WHERE id IN $resetIds"); | |
295 | } | |
296 | } | |
297 | elseif (array_key_exists($name, $nonPrimaryBlockIds) && | |
298 | !CRM_Utils_System::isNull($nonPrimaryBlockIds[$name]) | |
299 | ) { | |
300 | // data exists and no primary block - make one primary. | |
301 | CRM_Core_DAO::setFieldValue("CRM_Core_DAO_" . $block, | |
302 | array_pop($nonPrimaryBlockIds[$name]), 'is_primary', 1 | |
303 | ); | |
304 | } | |
305 | } | |
306 | } | |
1d07e7ab CW |
307 | |
308 | /** | |
ad37ac8e | 309 | * Get chain select values (whatever that means!). |
310 | * | |
1d07e7ab CW |
311 | * @param mixed $values |
312 | * @param string $valueType | |
313 | * @param bool $flatten | |
314 | * | |
315 | * @return array | |
316 | */ | |
00be9182 | 317 | public static function getChainSelectValues($values, $valueType, $flatten = FALSE) { |
1d07e7ab | 318 | if (!$values) { |
be2fb01f | 319 | return []; |
1d07e7ab | 320 | } |
bc999cd1 | 321 | $values = array_filter((array) $values); |
be2fb01f | 322 | $elements = []; |
1d07e7ab CW |
323 | $list = &$elements; |
324 | $method = $valueType == 'country' ? 'stateProvinceForCountry' : 'countyForState'; | |
325 | foreach ($values as $val) { | |
326 | $result = CRM_Core_PseudoConstant::$method($val); | |
327 | ||
328 | // Format for quickform | |
329 | if ($flatten) { | |
330 | // Option-groups for multiple categories | |
331 | if ($result && count($values) > 1) { | |
332 | $elements["crm_optgroup_$val"] = CRM_Core_PseudoConstant::$valueType($val, FALSE); | |
333 | } | |
334 | $elements += $result; | |
335 | } | |
336 | ||
337 | // Format for js | |
338 | else { | |
353ffa53 | 339 | // Option-groups for multiple categories |
1d07e7ab | 340 | if ($result && count($values) > 1) { |
be2fb01f | 341 | $elements[] = [ |
1d07e7ab | 342 | 'value' => CRM_Core_PseudoConstant::$valueType($val, FALSE), |
be2fb01f CW |
343 | 'children' => [], |
344 | ]; | |
353ffa53 | 345 | $list = &$elements[count($elements) - 1]['children']; |
1d07e7ab CW |
346 | } |
347 | foreach ($result as $id => $name) { | |
be2fb01f | 348 | $list[] = [ |
1d07e7ab CW |
349 | 'value' => $name, |
350 | 'key' => $id, | |
be2fb01f | 351 | ]; |
1d07e7ab CW |
352 | } |
353 | } | |
354 | } | |
355 | return $elements; | |
356 | } | |
96025800 | 357 | |
6a488035 | 358 | } |