From: jitendrapurohit Date: Thu, 3 Sep 2015 13:18:46 +0000 (+0530) Subject: additional fixes for CRM-16877 X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=a3b489b94fdd2d6ed2641617ec00f2fefe16c9f4;p=civicrm-core.git additional fixes for CRM-16877 --- diff --git a/CRM/Contact/BAO/Contact.php b/CRM/Contact/BAO/Contact.php index e292a376cc..c3658b59c9 100644 --- a/CRM/Contact/BAO/Contact.php +++ b/CRM/Contact/BAO/Contact.php @@ -2105,11 +2105,6 @@ ORDER BY civicrm_email.is_primary DESC"; } if ($contactID) { - //CRM-16877 -- include id in params to edit `block` fields - if ($blockName != 'address' && !empty($entityId[$loc]['id']) && isset($data[$blockName][$loc])) { - $entityId = CRM_Core_BAO_Block::getBlockIds($blockName, $contactID, NULL, TRUE); - $data[$blockName][$loc]['id'] = $entityId[$loc]['id']; - } //get the primary location type if ($locTypeId == $primaryLocationType) { $data[$blockName][$loc]['is_primary'] = 1; diff --git a/CRM/Contact/Form/Contact.php b/CRM/Contact/Form/Contact.php index a78af9be64..b0d5294eaa 100644 --- a/CRM/Contact/Form/Contact.php +++ b/CRM/Contact/Form/Contact.php @@ -988,11 +988,14 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form { $parseStatusMsg = self::parseAddressStatusMsg($parseResult); } - $blocks = array('email', 'phone', 'im', 'openid'); + $blocks = array('address', 'email', 'phone', 'im', 'openid'); foreach ($blocks as $block) { - foreach ($this->_preEditValues[$block] as $count => $value) { - if (!empty($value['id'])) { - $params[$block][$count]['id'] = $value['id']; + if (!empty($this->_preEditValues[$block]) && is_array($this->_preEditValues[$block])) { + foreach ($this->_preEditValues[$block] as $count => $value) { + if (!empty($value['id'])) { + $params[$block][$count]['id'] = $value['id']; + $params[$block]['isIdSet'] = TRUE; + } } } } diff --git a/CRM/Contact/Form/Inline/Email.php b/CRM/Contact/Form/Inline/Email.php index 8d11adc63f..9fb51d4bcc 100644 --- a/CRM/Contact/Form/Inline/Email.php +++ b/CRM/Contact/Form/Inline/Email.php @@ -182,6 +182,7 @@ class CRM_Contact_Form_Inline_Email extends CRM_Contact_Form_Inline { // Process / save emails $params['contact_id'] = $this->_contactId; $params['updateBlankLocInfo'] = TRUE; + $params['email']['isIdSet'] = TRUE; foreach ($this->_emails as $count => $value) { if (!empty($value['id']) && isset($params['email'][$count])) { $params['email'][$count]['id'] = $value['id']; diff --git a/CRM/Contact/Form/Inline/IM.php b/CRM/Contact/Form/Inline/IM.php index 11bd83ce8e..46cbcf0cce 100644 --- a/CRM/Contact/Form/Inline/IM.php +++ b/CRM/Contact/Form/Inline/IM.php @@ -164,6 +164,7 @@ class CRM_Contact_Form_Inline_IM extends CRM_Contact_Form_Inline { // Process / save IMs $params['contact_id'] = $this->_contactId; $params['updateBlankLocInfo'] = TRUE; + $params['im']['isIdSet'] = TRUE; foreach ($this->_ims as $count => $value) { if (!empty($value['id']) && isset($params['im'][$count])) { $params['im'][$count]['id'] = $value['id']; diff --git a/CRM/Contact/Form/Inline/OpenID.php b/CRM/Contact/Form/Inline/OpenID.php index 0167838969..f3920812f7 100644 --- a/CRM/Contact/Form/Inline/OpenID.php +++ b/CRM/Contact/Form/Inline/OpenID.php @@ -164,6 +164,7 @@ class CRM_Contact_Form_Inline_OpenID extends CRM_Contact_Form_Inline { // Process / save openID $params['contact_id'] = $this->_contactId; $params['updateBlankLocInfo'] = TRUE; + $params['openid']['isIdSet'] = TRUE; foreach ($this->_openids as $count => $value) { if (!empty($value['id']) && isset($params['openid'][$count])) { $params['openid'][$count]['id'] = $value['id']; diff --git a/CRM/Contact/Form/Inline/Phone.php b/CRM/Contact/Form/Inline/Phone.php index 24a3dcabf2..a2e8c1d292 100644 --- a/CRM/Contact/Form/Inline/Phone.php +++ b/CRM/Contact/Form/Inline/Phone.php @@ -165,6 +165,7 @@ class CRM_Contact_Form_Inline_Phone extends CRM_Contact_Form_Inline { // Process / save phones $params['contact_id'] = $this->_contactId; $params['updateBlankLocInfo'] = TRUE; + $params['phone']['isIdSet'] = TRUE; foreach ($this->_phones as $count => $value) { if (!empty($value['id']) && isset($params['phone'][$count])) { $params['phone'][$count]['id'] = $value['id']; diff --git a/CRM/Core/BAO/Block.php b/CRM/Core/BAO/Block.php index 8bde67027b..ff53dd91e3 100644 --- a/CRM/Core/BAO/Block.php +++ b/CRM/Core/BAO/Block.php @@ -230,6 +230,8 @@ class CRM_Core_BAO_Block { $name = ucfirst($blockName); $isPrimary = $isBilling = TRUE; $entityElements = $blocks = array(); + $resetPrimaryId = NULL; + $primaryId = FALSE; if ($entity) { $entityElements = array( @@ -242,21 +244,77 @@ class CRM_Core_BAO_Block { } $updateBlankLocInfo = CRM_Utils_Array::value('updateBlankLocInfo', $params, FALSE); + $isIdSet = CRM_Utils_Array::value('isIdSet', $params[$blockName], FALSE); //get existing block ids. $blockIds = self::getBlockIds($blockName, $contactId, $entityElements); + foreach ($params[$blockName] as $count => $value) { + $blockId = CRM_Utils_Array::value('id', $value); + if ($blockId) { + if (is_array($blockIds) && array_key_exists($blockId, $blockIds)) { + unset($blockIds[$blockId]); + } + else { + unset($value['id']); + } + } + //lets allow to update primary w/ more cleanly. + if (!$resetPrimaryId && !empty($value['is_primary'])) { + $primaryId = TRUE; + if (is_array($blockIds)) { + foreach ($blockIds as $blockId => $blockValue) { + if (!empty($blockValue['is_primary'])) { + $resetPrimaryId = $blockId; + break; + } + } + } + if ($resetPrimaryId) { + $baoString = 'CRM_Core_BAO_' . $blockName; + $block = new $baoString(); + $block->selectAdd(); + $block->selectAdd("id, is_primary"); + $block->id = $resetPrimaryId; + if ($block->find(TRUE)) { + $block->is_primary = FALSE; + $block->save(); + } + $block->free(); + } + } + } foreach ($params[$blockName] as $count => $value) { if (!is_array($value)) { continue; } - // if in some case (eg. email used in Online Conribution Page) id is not set + // if in some cases (eg. email used in Online Conribution Page, Profiles, etc.) id is not set // lets try to add using the previous method to avoid any false creation of existing data. foreach ($blockIds as $blockId => $blockValue) { - if (empty($value['id']) && $blockValue['locationTypeId'] == CRM_Utils_Array::value('location_type_id', $value)) { - //assigned id as first come first serve basis - $value['id'] = $blockValue['id']; - break; + if (empty($value['id']) && $blockValue['locationTypeId'] == CRM_Utils_Array::value('location_type_id', $value) && !$isIdSet) { + $valueId = FALSE; + if ($blockName == 'phone') { + $phoneTypeBlockValue = CRM_Utils_Array::value('phoneTypeId', $blockValue); + if ($phoneTypeBlockValue == CRM_Utils_Array::value('phone_type_id', $value)) { + $valueId = TRUE; + } + } + elseif ($blockName == 'im') { + $providerBlockValue = CRM_Utils_Array::value('providerId', $blockValue); + if (!empty($value['provider_id']) && $providerBlockValue == $value['provider_id']) { + $valueId = TRUE; + } + } + else { + $valueId = TRUE; + } + if ($valueId) { + $value['id'] = $blockValue['id']; + if (!$primaryId && !empty($blockValue['is_primary'])) { + $value['is_primary'] = $blockValue['is_primary']; + } + break; + } } } $dataExists = self::dataExists(self::$requiredBlockFields[$blockName], $value); @@ -271,27 +329,22 @@ class CRM_Core_BAO_Block { elseif (!$dataExists) { continue; } - $contactFields = array( 'contact_id' => $contactId, 'location_type_id' => CRM_Utils_Array::value('location_type_id', $value), ); + $contactFields['is_primary'] = 0; if ($isPrimary && !empty($value['is_primary'])) { $contactFields['is_primary'] = $value['is_primary']; $isPrimary = FALSE; } - else { - $contactFields['is_primary'] = 0; - } + $contactFields['is_billing'] = 0; if ($isBilling && !empty($value['is_billing'])) { $contactFields['is_billing'] = $value['is_billing']; $isBilling = FALSE; } - else { - $contactFields['is_billing'] = 0; - } $blockFields = array_merge($value, $contactFields); $baoString = 'CRM_Core_BAO_' . $name;