3 +--------------------------------------------------------------------+
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2019
35 * This class handle creation of location block elements.
37 class CRM_Core_BAO_Location
extends CRM_Core_DAO
{
40 * Location block element array.
42 static $blocks = array('phone', 'email', 'im', 'openid', 'address');
45 * Create various elements of location block.
47 * @param array $params
48 * (reference ) an assoc array of name/value pairs.
49 * @param bool $fixAddress
50 * True if you need to fix (format) address values.
51 * before inserting in db
57 public static function create(&$params, $fixAddress = TRUE, $entity = NULL) {
59 if (!self
::dataExists($params)) {
63 // create location blocks.
64 foreach (self
::$blocks as $block) {
65 if ($block != 'address') {
66 $location[$block] = CRM_Core_BAO_Block
::create($block, $params, $entity);
69 $location[$block] = CRM_Core_BAO_Address
::create($params, $fixAddress, $entity);
74 // this is a special case for adding values in location block table
75 $entityElements = array(
76 'entity_table' => $params['entity_table'],
77 'entity_id' => $params['entity_id'],
80 $location['id'] = self
::createLocBlock($location, $entityElements);
83 // when we come from a form which displays all the location elements (like the edit form or the inline block
84 // elements, we can skip the below check. The below check adds quite a feq queries to an already overloaded
86 if (!CRM_Utils_Array
::value('updateBlankLocInfo', $params, FALSE)) {
87 // make sure contact should have only one primary block, CRM-5051
88 self
::checkPrimaryBlocks(CRM_Utils_Array
::value('contact_id', $params));
96 * Creates the entry in the civicrm_loc_block.
98 * @param string $location
99 * @param array $entityElements
103 public static function createLocBlock(&$location, &$entityElements) {
104 $locId = self
::findExisting($entityElements);
108 $locBlock['id'] = $locId;
117 $locBlock["{$loc}_id"] = !empty($location["$loc"][0]) ?
$location["$loc"][0]->id
: NULL;
118 $locBlock["{$loc}_2_id"] = !empty($location["$loc"][1]) ?
$location["$loc"][1]->id
: NULL;
122 foreach ($locBlock as $key => $block) {
123 if (empty($locBlock[$key])) {
124 $locBlock[$key] = 'null';
129 if (count($locBlock) == $countNull) {
130 // implies nothing is set.
134 $locBlockInfo = self
::addLocBlock($locBlock);
135 return $locBlockInfo->id
;
139 * Takes an entity array and finds the existing location block.
141 * @param array $entityElements
145 public static function findExisting($entityElements) {
146 $eid = $entityElements['entity_id'];
147 $etable = $entityElements['entity_table'];
149 SELECT e.loc_block_id as locId
153 $params = array(1 => array($eid, 'Integer'));
154 $dao = CRM_Core_DAO
::executeQuery($query, $params);
155 while ($dao->fetch()) {
156 $locBlockId = $dao->locId
;
162 * Takes an associative array and adds location block.
164 * @param array $params
165 * (reference ) an assoc array of name/value pairs.
167 * @return CRM_Core_BAO_locBlock
168 * Object on success, null otherwise
170 public static function addLocBlock(&$params) {
171 $locBlock = new CRM_Core_DAO_LocBlock();
173 $locBlock->copyValues($params);
175 return $locBlock->save();
179 * Delete the Location Block.
181 * @param int $locBlockId
182 * Id of the Location Block.
184 public static function deleteLocBlock($locBlockId) {
189 $locBlock = new CRM_Core_DAO_LocBlock();
190 $locBlock->id
= $locBlockId;
192 $locBlock->find(TRUE);
194 //resolve conflict of having same ids for multiple blocks
196 'IM_1' => $locBlock->im_id
,
197 'IM_2' => $locBlock->im_2_id
,
198 'Email_1' => $locBlock->email_id
,
199 'Email_2' => $locBlock->email_2_id
,
200 'Phone_1' => $locBlock->phone_id
,
201 'Phone_2' => $locBlock->phone_2_id
,
202 'Address_1' => $locBlock->address_id
,
203 'Address_2' => $locBlock->address_2_id
,
206 foreach ($store as $daoName => $id) {
208 $daoName = 'CRM_Core_DAO_' . substr($daoName, 0, -2);
209 $dao = new $daoName();
219 * Check if there is data to create the object.
221 * @param array $params
222 * (reference ) an assoc array of name/value pairs.
226 public static function dataExists(&$params) {
227 // return if no data present
229 foreach (self
::$blocks as $block) {
230 if (array_key_exists($block, $params)) {
242 * @param array $entityBlock
243 * @param bool $microformat
246 * array of objects(CRM_Core_BAO_Location)
248 public static function &getValues($entityBlock, $microformat = FALSE) {
249 if (empty($entityBlock)) {
255 'openid' => 'OpenID',
258 //get all the blocks for this contact
259 foreach (self
::$blocks as $block) {
260 if (array_key_exists($block, $name_map)) {
261 $name = $name_map[$block];
264 $name = ucfirst($block);
266 $baoString = 'CRM_Core_BAO_' . $name;
267 $blocks[$block] = $baoString::getValues($entityBlock, $microformat);
273 * Delete all the block associated with the location.
275 * @param int $contactId
277 * @param int $locationTypeId
278 * Id of the location to delete.
280 public static function deleteLocationBlocks($contactId, $locationTypeId) {
281 // ensure that contactId has a value
282 if (empty($contactId) ||
283 !CRM_Utils_Rule
::positiveInteger($contactId)
285 CRM_Core_Error
::fatal();
288 if (empty($locationTypeId) ||
289 !CRM_Utils_Rule
::positiveInteger($locationTypeId)
291 // so we only delete the blocks which DO NOT have a location type Id
293 $locationTypeId = 'null';
296 static $blocks = array('Address', 'Phone', 'IM', 'OpenID', 'Email');
298 $params = array('contact_id' => $contactId, 'location_type_id' => $locationTypeId);
299 foreach ($blocks as $name) {
300 CRM_Core_BAO_Block
::blockDelete($name, $params);
305 * Copy or update location block.
307 * @param int $locBlockId
309 * @param int $updateLocBlockId
310 * Update location block id.
313 * newly created/updated location block id.
315 public static function copyLocBlock($locBlockId, $updateLocBlockId = NULL) {
316 //get the location info.
317 $defaults = $updateValues = array();
318 $locBlock = array('id' => $locBlockId);
319 CRM_Core_DAO
::commonRetrieve('CRM_Core_DAO_LocBlock', $locBlock, $defaults);
321 if ($updateLocBlockId) {
322 //get the location info for update.
323 $copyLocationParams = array('id' => $updateLocBlockId);
324 CRM_Core_DAO
::commonRetrieve('CRM_Core_DAO_LocBlock', $copyLocationParams, $updateValues);
325 foreach ($updateValues as $key => $value) {
327 $copyLocationParams[$key] = 'null';
332 //copy all location blocks (email, phone, address, etc)
333 foreach ($defaults as $key => $value) {
335 $tbl = explode("_", $key);
336 $name = ucfirst($tbl[0]);
337 $updateParams = NULL;
338 if ($updateId = CRM_Utils_Array
::value($key, $updateValues)) {
339 $updateParams = array('id' => $updateId);
342 $copy = CRM_Core_DAO
::copyGeneric('CRM_Core_DAO_' . $name, array('id' => $value), $updateParams);
343 $copyLocationParams[$key] = $copy->id
;
347 $copyLocation = &CRM_Core_DAO
::copyGeneric('CRM_Core_DAO_LocBlock',
348 array('id' => $locBlock['id']),
351 return $copyLocation->id
;
355 * Make sure contact should have only one primary block, CRM-5051.
357 * @param int $contactId
360 public static function checkPrimaryBlocks($contactId) {
365 // get the loc block ids.
366 $primaryLocBlockIds = CRM_Contact_BAO_Contact
::getLocBlockIds($contactId, array('is_primary' => 1));
367 $nonPrimaryBlockIds = CRM_Contact_BAO_Contact
::getLocBlockIds($contactId, array('is_primary' => 0));
376 $name = strtolower($block);
377 if (array_key_exists($name, $primaryLocBlockIds) &&
378 !CRM_Utils_System
::isNull($primaryLocBlockIds[$name])
380 if (count($primaryLocBlockIds[$name]) > 1) {
381 // keep only single block as primary.
382 $primaryId = array_pop($primaryLocBlockIds[$name]);
383 $resetIds = "(" . implode(',', $primaryLocBlockIds[$name]) . ")";
384 // reset all primary except one.
385 CRM_Core_DAO
::executeQuery("UPDATE civicrm_$name SET is_primary = 0 WHERE id IN $resetIds");
388 elseif (array_key_exists($name, $nonPrimaryBlockIds) &&
389 !CRM_Utils_System
::isNull($nonPrimaryBlockIds[$name])
391 // data exists and no primary block - make one primary.
392 CRM_Core_DAO
::setFieldValue("CRM_Core_DAO_" . $block,
393 array_pop($nonPrimaryBlockIds[$name]), 'is_primary', 1
400 * Get chain select values (whatever that means!).
402 * @param mixed $values
403 * @param string $valueType
404 * @param bool $flatten
408 public static function getChainSelectValues($values, $valueType, $flatten = FALSE) {
412 $values = array_filter((array) $values);
415 $method = $valueType == 'country' ?
'stateProvinceForCountry' : 'countyForState';
416 foreach ($values as $val) {
417 $result = CRM_Core_PseudoConstant
::$method($val);
419 // Format for quickform
421 // Option-groups for multiple categories
422 if ($result && count($values) > 1) {
423 $elements["crm_optgroup_$val"] = CRM_Core_PseudoConstant
::$valueType($val, FALSE);
425 $elements +
= $result;
430 // Option-groups for multiple categories
431 if ($result && count($values) > 1) {
433 'value' => CRM_Core_PseudoConstant
::$valueType($val, FALSE),
434 'children' => array(),
436 $list = &$elements[count($elements) - 1]['children'];
438 foreach ($result as $id => $name) {