/** * format common params data to proper format to store. * * @param array $params contain record values. * @param array $formatted array of formatted data. * @param array $contactFields contact DAO fields. * @static */ function formatCommonData($params, &$formatted, &$contactFields) { $csType = array(CRM_Utils_Array::value('contact_type', $formatted)); //CRM-5125 //add custom fields for contact sub type if (!empty($this->_contactSubType)) { $csType = $this->_contactSubType; } if ($relCsType = CRM_Utils_Array::value('contact_sub_type', $formatted)) { $csType = $relCsType; } $customFields = CRM_Core_BAO_CustomField::getFields($formatted['contact_type'], false, false, $csType); $addressCustomFields = CRM_Core_BAO_CustomField::getFields('Address'); $customFields = $customFields + $addressCustomFields; //if a Custom Email Greeting, Custom Postal Greeting or Custom Addressee is mapped, and no "Greeting / Addressee Type ID" is provided, then automatically set the type = Customized, CRM-4575 $elements = array('email_greeting_custom' => 'email_greeting', 'postal_greeting_custom' => 'postal_greeting', 'addressee_custom' => 'addressee'); foreach ($elements as $k => $v) { if (array_key_exists($k, $params) && !array_key_exists($v, $params)) { $label = key(CRM_Core_OptionGroup::values($v, true, null, null, 'AND v.name = "Customized"')); $params[$v] = $label; } } //format date first $session = CRM_Core_Session::singleton(); $dateType = $session->get("dateTypes"); foreach ($params as $key => $val) { if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) { //we should not update Date to null, CRM-4062 if ($val && $customFields[$customFieldID]['data_type'] == 'Date') { self::formatCustomDate($params, $formatted, $dateType, $key); unset($params[$key]); } else { if ($customFields[$customFieldID]['data_type'] == 'Boolean') { $params[$key] = CRM_Utils_String::strtoboolstr($val); } } } if ($key == 'birth_date' && $val) { CRM_Utils_Date::convertToDefaultDate($params, $dateType, $key); } else { if ($key == 'deceased_date' && $val) { CRM_Utils_Date::convertToDefaultDate($params, $dateType, $key); } else { if ($key == 'is_deceased' && $val) { $params[$key] = CRM_Utils_String::strtoboolstr($val); } else { if ($key == 'gender') { //CRM-4360 $params[$key] = $this->checkGender($val); } } } } } //now format custom data. foreach ($params as $key => $field) { if ($field == null || $field === '') { continue; } if (is_array($field)) { $isAddressCustomField = false; foreach ($field as $value) { $break = false; if (is_array($value)) { foreach ($value as $name => $testForEmpty) { if ($addressCustomFieldID = CRM_Core_BAO_CustomField::getKeyID($name)) { $isAddressCustomField = true; break; } // check if $value does not contain IM provider or phoneType if (($name !== 'phone_type_id' || $name !== 'provider_id') && ($testForEmpty === '' || $testForEmpty == null)) { $break = true; break; } } } else { $break = true; } if (!$break) { _civicrm_add_formatted_param($value, $formatted); } } if (!$isAddressCustomField) { continue; } } $formatValues = array($key => $field); if ($key !== 'preferred_communication_method' && array_key_exists($key, $contactFields)) { // due to merging of individual table and // contact table, we need to avoid // preferred_communication_method forcefully $formatValues['contact_type'] = $formatted['contact_type']; } if ($key == 'id' && isset($field)) { $formatted[$key] = $field; } _civicrm_add_formatted_param($formatValues, $formatted); //Handling Custom Data if (($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) && array_key_exists($customFieldID, $customFields)) { //get the html type. $type = $customFields[$customFieldID]['html_type']; _civicrm_add_custom_formatted_param($customFieldID, $key, $field, $formatted, $type); } } // check for primary location type, whether it is already present for the contact or not, CRM-4423 if (CRM_Utils_Array::value('id', $formatted) && isset($formatted['location'])) { $primaryLocationTypeId = CRM_Contact_BAO_Contact::getPrimaryLocationType($formatted['id'], true); if (isset($primaryLocationTypeId)) { foreach ($formatted['location'] as $loc => $details) { if ($primaryLocationTypeId == CRM_Utils_Array::value('location_type_id', $details)) { $formatted['location'][$loc]['is_primary'] = 1; break; } else { $formatted['location'][$loc]['is_primary'] = 0; } } } } // parse street address, CRM-5450 if ($this->_parseStreetAddress) { require_once 'CRM/Core/BAO/Address.php'; if (array_key_exists('address', $formatted) && is_array($formatted['address'])) { foreach ($formatted['address'] as $instance => &$address) { $streetAddress = CRM_Utils_Array::value('street_address', $address); if (empty($streetAddress)) { continue; } // parse address field. $parsedFields = CRM_Core_BAO_Address::parseStreetAddress($streetAddress); //street address consider to be parsed properly, //If we get street_name and street_number. if (!CRM_Utils_Array::value('street_name', $parsedFields) || !CRM_Utils_Array::value('street_number', $parsedFields)) { $parsedFields = array_fill_keys(array_keys($parsedFields), ''); } // merge parse address w/ main address block. $address = array_merge($address, $parsedFields); } } } }
/** * This function format location blocks w/ v3.0 format. * * @param array $values The variable(s) to be added * @param array $params The structured parameter list * * @return bool * @access public */ function _civicrm_add_formatted_location_blocks(&$values, &$params) { static $fields = null; if ($fields == null) { $fields = array(); } foreach (array('Phone', 'Email', 'IM', 'OpenID') as $block) { $name = strtolower($block); if (!array_key_exists($name, $values)) { continue; } // block present in value array. if (!array_key_exists($name, $params) || !is_array($params[$name])) { $params[$name] = array(); } if (!array_key_exists($block, $fields)) { require_once str_replace('_', DIRECTORY_SEPARATOR, "CRM_Core_DAO_" . $block) . ".php"; eval('$fields[$block] =& CRM_Core_DAO_' . $block . '::fields( );'); } $blockCnt = count($params[$name]); // copy value to dao field name. if ($name == 'im') { $values['name'] = $values[$name]; } _civicrm_store_values($fields[$block], $values, $params[$name][++$blockCnt]); if ($blockCnt == 1) { $params[$name][$blockCnt]['is_primary'] = true; } // we only process single block at a time. return true; } // handle address fields. if (!array_key_exists('address', $params) || !is_array($params['address'])) { $params['address'] = array(); } $addressCnt = 1; foreach ($params['address'] as $cnt => $addressBlock) { if (CRM_Utils_Array::value('location_type_id', $values) == CRM_Utils_Array::value('location_type_id', $addressBlock)) { $addressCnt = $cnt; break; } $addressCnt++; } if (!array_key_exists('Address', $fields)) { require_once 'CRM/Core/DAO/Address.php'; $fields['Address'] =& CRM_Core_DAO_Address::fields(); } _civicrm_store_values($fields['Address'], $values, $params['address'][$addressCnt]); $addressFields = array('county', 'country', 'state_province', 'supplemental_address_1', 'supplemental_address_2', 'StateProvince.name'); foreach ($addressFields as $field) { if (array_key_exists($field, $values)) { if (!array_key_exists('address', $params)) { $params['address'] = array(); } $params['address'][$addressCnt][$field] = $values[$field]; } } //Handle Address Custom data $fields['address_custom'] = CRM_Core_BAO_CustomField::getFields('Address'); foreach ($values as $key => $value) { if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) { /* check if it's a valid custom field id */ if (array_key_exists($customFieldID, $fields['address_custom'])) { $type = $fields['address_custom'][$customFieldID]['html_type']; _civicrm_add_custom_formatted_param($customFieldID, $key, $value, $params['address'][$addressCnt], $type); } else { return civicrm_create_error('Invalid custom field ID'); } } } if ($addressCnt == 1) { $params['address'][$addressCnt]['is_primary'] = true; } return true; }