X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=api%2Fv3%2FProfile.php;h=55824100e5b560c52a198034acc31f5c727d5614;hb=174dbdd5a5f09823e8cfd6383d3ff4e7ba742f76;hp=e42fbe0bad990e12cff443971435eb26785f774e;hpb=0d5cc4399da8fb7600f041f36d3bb19206cdbcad;p=civicrm-core.git diff --git a/api/v3/Profile.php b/api/v3/Profile.php index e42fbe0bad..55824100e5 100644 --- a/api/v3/Profile.php +++ b/api/v3/Profile.php @@ -104,8 +104,11 @@ function civicrm_api3_profile_get($params) { } else { $contactFields[$fieldName] = $field; + // we should return 'Primary' with & without capitalisation. it is more consistent with api to not + // capitalise, but for form support we need it for now. Hopefully we can move away from it + $contactFields[strtolower($fieldName)] = $field; + } } - } $ufGroupBAO->setProfileDefaults($params['contact_id'], $contactFields, $values[$profileID], TRUE); @@ -115,10 +118,15 @@ function civicrm_api3_profile_get($params) { } elseif(!empty($params['contact_id'])) { $ufGroupBAO->setProfileDefaults($params['contact_id'], $profileFields, $values[$profileID], TRUE); - } - else{ - $values[$profileID] = array_fill_keys(array_keys($profileFields), ''); - } + foreach ($values[$profileID] as $fieldName => $field){ + // we should return 'Primary' with & without capitalisation. it is more consistent with api to not + // capitalise, but for form support we need it for now. Hopefully we can move away from it + $values[$profileID][strtolower($fieldName)] = $field; + } + } + else{ + $values[$profileID] = array_fill_keys(array_keys($profileFields), ''); + } } if($nonStandardLegacyBehaviour) { $result = civicrm_api3_create_success(); @@ -161,18 +169,8 @@ function civicrm_api3_profile_submit($params) { $contactParams = $activityParams = $missingParams = array(); - $profileFields = CRM_Core_BAO_UFGroup::getFields($profileID, - FALSE, - NULL, - NULL, - NULL, - FALSE, - NULL, - TRUE, - NULL, - CRM_Core_Permission::EDIT - ); - + $profileFields = civicrm_api3('profile', 'getfields', array('action' => 'submit', 'profile_id' => $profileID)); + $profileFields = $profileFields['values']; if ($isContactActivityProfile) { civicrm_api3_verify_mandatory($params, NULL, array('activity_id')); @@ -186,12 +184,6 @@ function civicrm_api3_profile_submit($params) { } foreach ($profileFields as $fieldName => $field) { - if (CRM_Utils_Array::value('is_required', $field)) { - if (!CRM_Utils_Array::value($fieldName, $params) || empty($params[$fieldName])) { - $missingParams[] = $fieldName; - } - } - if (!isset($params[$fieldName])) { continue; } @@ -200,27 +192,27 @@ function civicrm_api3_profile_submit($params) { if ($params[$fieldName] && isset($params[$fieldName . '_id'])) { $value = $params[$fieldName . '_id']; } - - if ($isContactActivityProfile && CRM_Utils_Array::value('field_type', $field) == 'Activity') { - $activityParams[$fieldName] = $value; + $contactEntities = array('contact', 'individual', 'organization', 'household'); + $locationEntities = array('email', 'address', 'phone', 'website', 'im'); + + $entity = strtolower(CRM_Utils_Array::value('entity', $field)); + if($entity && !in_array($entity, array_merge($contactEntities, $locationEntities))) { + $contactParams['api.' . $entity . '.create'][$fieldName] = $value; + if(isset($params[$entity . '_id'])) { + //todo possibly declare $entity_id in getfields ? + $contactParams['api.' . $entity . '.create']['id'] = $params[$entity . '_id']; + } } else { - $contactParams[$fieldName] = $value; + $contactParams[_civicrm_api3_profile_translate_fieldnames_for_bao($fieldName)] = $value; } } - if (!empty($missingParams)) { - throw new API_Exception("Missing required parameters for profile id {$params['profile_id']}: " . implode(', ', $missingParams)); - } - $contactParams['contact_id'] = CRM_Utils_Array::value('contact_id', $params); $contactParams['profile_id'] = $profileID; $contactParams['skip_custom'] = 1; $contactProfileParams = civicrm_api3_profile_apply($contactParams); - if (CRM_Utils_Array::value('is_error', $contactProfileParams)) { - return $contactProfileParams; - } // Contact profile fields $profileParams = $contactProfileParams['values']; @@ -273,6 +265,20 @@ function civicrm_api3_profile_submit($params) { return $result; } + +/** + * The api standards expect field names to be lower case but the BAO uses mixed case + * so we accept 'email-primary' but pass 'email-Primary' to the BAO + * we could make the BAO handle email-primary but this would alter the fieldname seen by hooks + * & we would need to consider that change + * @param string $fieldName API field name + * + * @return string BAO Field Name + */ +function _civicrm_api3_profile_translate_fieldnames_for_bao($fieldName){ + $fieldName = str_replace('url', 'URL', $fieldName); + return str_replace('primary', 'Primary', $fieldName); +} /** * metadata for submit action * @param array $params @@ -289,7 +295,10 @@ function _civicrm_api3_profile_submit_spec(&$params, $apirequest) { // we don't resolve state, country & county for performance reasons $resolveOptions = CRM_Utils_Array::value('get_options',$apirequest['params']) == 'all' ? True : False; $profileID = _civicrm_api3_profile_getProfileID($apirequest['params']['profile_id']); - $params = _civicrm_api3_buildprofile_submitfields($profileID, $resolveOptions); + $params = _civicrm_api3_buildprofile_submitfields($profileID, $resolveOptions, CRM_Utils_Array::value('cache_clear', $params)); + } + elseif (isset($apirequest['params']['cache_clear'])) { + _civicrm_api3_buildprofile_submitfields(FALSE, FALSE, True); } $params['profile_id']['api.required'] = TRUE; } @@ -314,14 +323,14 @@ function civicrm_api3_profile_set($params) { * @deprecated - appears to be an internal function - should not be accessible via api * Provide formatted values for profile fields. * - * @param array $params Associative array of property name/value + * @param array $params Associative array of property name/value * pairs to profile field values * + * @throws API_Exception * @return formatted profile field values|CRM_Error * * @todo add example * @todo add test cases - * */ function civicrm_api3_profile_apply($params) { @@ -346,7 +355,7 @@ function civicrm_api3_profile_apply($params) { ); if (empty($data)) { - return civicrm_api3_create_error('Enable to format profile parameters.'); + throw new API_Exception('Enable to format profile parameters.'); } return civicrm_api3_create_success($data); @@ -445,27 +454,41 @@ function _civicrm_api3_profile_getbillingpseudoprofile(&$params) { * * @param integer $profileID * @param integer $optionsBehaviour 0 = don't resolve, 1 = resolve non-aggressively, 2 = resolve aggressively - ie include country & state + * @param $params + * + * @return */ -function _civicrm_api3_buildprofile_submitfields($profileID, $optionsBehaviour = 1) { +function _civicrm_api3_buildprofile_submitfields($profileID, $optionsBehaviour = 1, $is_flush) { static $profileFields = array(); + if($is_flush) { + $profileFields = array(); + if(empty($profileID)) { + return; + } + } if(isset($profileFields[$profileID])) { return $profileFields[$profileID]; } $fields = civicrm_api3('uf_field', 'get', array('uf_group_id' => $profileID)); $entities = array(); - - foreach ($fields['values'] as $id => $field) { + foreach ($fields['values'] as $field) { if(!$field['is_active']) { continue; } list($entity, $fieldName) = _civicrm_api3_map_profile_fields_to_entity($field); - $profileFields[$profileID][$fieldName] = array( + $aliasArray = array(); + if(strtolower($fieldName) != $fieldName) { + $aliasArray['api.aliases'] = array($fieldName); + $fieldName = strtolower($fieldName); + } + $profileFields[$profileID][$fieldName] = array_merge(array( 'api.required' => $field['is_required'], 'title' => $field['label'], 'help_pre' => CRM_Utils_Array::value('help_pre', $field), 'help_post' => CRM_Utils_Array::value('help_post', $field), - ); + 'entity' => $entity, + ), $aliasArray); $realFieldName = $field['field_name']; //see function notes @@ -493,20 +516,28 @@ function _civicrm_api3_buildprofile_submitfields($profileID, $optionsBehaviour = $result = civicrm_api3($entity, 'getfields', array('action' => 'create')); $entityGetFieldsResult = _civicrm_api3_profile_appendaliases($result['values'], $entity); foreach ($entityFields as $entityfield => $realName) { - $profileFields[$profileID][$entityfield] = $entityGetFieldsResult[$realName]; + $profileFields[$profileID][strtolower($entityfield)] = array_merge($profileFields[$profileID][$entityfield], $entityGetFieldsResult[$realName]); if($optionsBehaviour && !empty($entityGetFieldsResult[$realName]['pseudoconstant'])) { if($optionsBehaviour > 1 || !in_array($realName, array('state_province_id', 'county_id', 'country_id'))) { $options = civicrm_api3($entity, 'getoptions', array('field' => $realName)); $profileFields[$profileID][$entityfield]['options'] = $options['values']; } } + + if($entityfield != strtolower($entityfield)) { + // we will make the mixed case version (e.g. of 'Primary') an aliase + if(!isset($profileFields[$profileID][strtolower($entityfield)])) { + $profileFields[$profileID][strtolower($entityfield)]['api.aliases'] = array(); + } + $profileFields[$profileID][strtolower($entityfield)]['api.aliases'][] = $entityfield; + } /** * putting this on hold -this would cause the api to set the default - but could have unexpected behaviour if(isset($result['values'][$realName]['default_value'])) { - //this would be the case for a custom field with a configured default - $profileFields[$profileID][$entityfield]['api.default'] = $result['values'][$realName]['default_value']; + //this would be the case for a custom field with a configured default + $profileFields[$profileID][$entityfield]['api.default'] = $result['values'][$realName]['default_value']; } - */ + */ } } return $profileFields[$profileID]; @@ -518,54 +549,60 @@ function _civicrm_api3_buildprofile_submitfields($profileID, $optionsBehaviour = * */ function _civicrm_api3_map_profile_fields_to_entity(&$field) { - $entity = $field['field_type']; + $entity = _civicrm_api_get_entity_name_from_camel($field['field_type']); $contactTypes = civicrm_api3('contact', 'getoptions', array('field' => 'contact_type')); + $locationFields = array('email' => 'email'); if(in_array($entity, $contactTypes['values'])) { - $entity = 'Contact'; + $entity = 'contact'; } $fieldName = $field['field_name']; if(!empty($field['location_type_id'])) { if($fieldName == 'email') { - $entity = 'Email'; + $entity = 'email'; } else{ - $entity = 'Address'; + $entity = 'address'; } $fieldName .= '-' . $field['location_type_id']; } + elseif(array_key_exists($fieldName, $locationFields)) { + $fieldName .= '-Primary'; + $entity = 'email'; + } if(!empty($field['phone_type_id'])) { $fieldName .= '-' . $field['location_type_id']; - $entity = 'Phone'; + $entity = 'phone'; } + // @todo - sort this out! //here we do a hard-code list of known fields that don't map to where they are mapped to // not a great solution but probably if we looked in the BAO we'd find a scary switch statement // in a perfect world the uf_field table would hold the correct entity for each item // & only the relationships between entities would need to be coded $hardCodedEntityMappings = array( - 'street_address' => 'Address', - 'street_number' => 'Address', - 'supplemental_address_1' => 'Address', - 'supplemental_address_2' => 'Address', - 'supplemental_address_3' => 'Address', - 'postal_code' => 'Address', - 'city' => 'Address', - 'email' => 'Email', - 'state_province' => 'Address', - 'country' => 'Address', - 'county' => 'Address', + 'street_address' => 'address', + 'street_number' => 'address', + 'supplemental_address_1' => 'address', + 'supplemental_address_2' => 'address', + 'supplemental_address_3' => 'address', + 'postal_code' => 'address', + 'city' => 'address', + 'email' => 'email', + 'state_province' => 'address', + 'country' => 'address', + 'county' => 'address', //note that in discussions about how to restructure the api we discussed making these membership // fields into 'membership_payment' fields - which would entail declaring them in getfields // & renaming them in existing profiles - 'financial_type' => 'Contribution', - 'total_amount' => 'Contribution', - 'receive_date' => 'Contribution', - 'payment_instrument' => 'Contribution', - 'check_number' => 'Contribution', - 'contribution_status_id' => 'Contribution', - 'soft_credit' => 'Contribution', - 'group' => 'GroupContact', - 'tag' => 'EntityTag', + 'financial_type' => 'contribution', + 'total_amount' => 'contribution', + 'receive_date' => 'contribution', + 'payment_instrument' => 'contribution', + 'check_number' => 'contribution', + 'contribution_status_id' => 'contribution', + 'soft_credit' => 'contribution', + 'group' => 'group_contact', + 'tag' => 'entity_tag', ); if(array_key_exists($fieldName, $hardCodedEntityMappings)) { $entity = $hardCodedEntityMappings[$fieldName]; @@ -608,7 +645,7 @@ function _civicrm_api3_profile_appendaliases($values, $entity) { } } //special case on membership & contribution - can't see how to handle in a generic way - if(in_array($entity, array('Membership', 'Contribution'))) { + if(in_array($entity, array('membership', 'contribution'))) { $values['send_receipt'] = array('title' => 'Send Receipt', 'type' => (int) 16); } return $values;