/**
* Format array in result output styple
*
- * @param array $values values generated by API operation (the result)
+ * @param array|int $values values generated by API operation (the result)
* @param array $params parameters passed into API call
* @param string $entity the entity being acted on
* @param string $action the action passed to the API
* @param string $entity
* @param string $action
*
+ * @throws API_Exception
* @return array $options options extracted from params
*/
function _civicrm_api3_get_options_from_params(&$params, $queryObject = FALSE, $entity = '', $action = '') {
'sort' => CRM_Utils_Rule::string($sort) ? $sort : NULL,
'limit' => CRM_Utils_Rule::integer($limit) ? $limit : NULL,
'is_count' => $is_count,
- 'return' => !empty($returnProperties) ? $returnProperties : NULL,
+ 'return' => !empty($returnProperties) ? $returnProperties : array(),
);
if ($options['sort'] && stristr($options['sort'], 'SELECT')) {
/**
* Converts an DAO object to an array
*
- * @param object $dao (reference )object to convert
+ * @param object $dao (reference )object to convert
* @param null $params
* @param bool $uniqueFields
* @param string $entity
*
+ * @param bool $autoFind
+ *
* @return array
*
* @params array of arrays (key = id) of array of fields
if(isset($dao->count)) {
return $dao->count;
}
- //if custom fields are required we will endeavour to set them . NB passing $entity in might be a bit clunky / unrequired
- if (!empty($entity) && !empty($params['return']) && is_array($params['return'])) {
- foreach ($params['return'] as $return) {
- if (substr($return, 0, 6) == 'custom') {
- $custom = TRUE;
- }
- }
- }
-
$fields = array_keys(_civicrm_api3_build_fields_array($dao, $uniqueFields));
}
}
$result[$dao->id] = $tmp;
- if (!empty($custom)) {
+
+ if(_civicrm_api3_custom_fields_are_required($entity, $params)) {
_civicrm_api3_custom_data_get($result[$dao->id], $entity, $dao->id);
}
}
return $result;
}
+/**
+ * We currently retrieve all custom fields or none at this level so if we know the entity
+ * && it can take custom fields & there is the string 'custom' in their return request we get them all, they are filtered on the way out
+ * @todo filter so only required fields are queried
+ *
+ * @param $params
+ * @param string $entity - entity name in CamelCase
+ *
+ * @return bool
+ */
+function _civicrm_api3_custom_fields_are_required($entity, $params) {
+ if (!array_key_exists($entity, CRM_Core_BAO_CustomQuery::$extendsMap)) {
+ return FALSE;
+ }
+ $options = _civicrm_api3_get_options_from_params($params);
+ //we check for possibility of 'custom' => 1 as well as specific custom fields
+ $returnString = implode('', $options['return']) . implode('', array_keys($options['return']));
+ if(stristr($returnString, 'custom')) {
+ return TRUE;
+ }
+}
/**
* Converts an object to an array
*
}
}
+/**
+ * @param $params
+ * @param $entity
+ */
+function _civicrm_api3_format_params_for_create(&$params, $entity) {
+ $nonGenericEntities = array('Contact', 'Individual', 'Household', 'Organization');
+
+ $customFieldEntities = array_diff_key(CRM_Core_BAO_CustomQuery::$extendsMap, array_fill_keys($nonGenericEntities, 1));
+ if(!array_key_exists($entity, $customFieldEntities)) {
+ return;
+ }
+ $values = array();
+ _civicrm_api3_custom_format_params($params, $values, $entity);
+ $params = array_merge($params, $values);
+}
+
/**
* @deprecated
* This function ensures that we have the right input parameters
return civicrm_api3_create_success(_civicrm_api3_dao_to_array($bao, $params, FALSE, $entity), $params, $entity, 'get');
}
else {
- return _civicrm_api3_dao_to_array($bao, $params, FALSE, $entity);
+ return _civicrm_api3_dao_to_array($bao, $params, FALSE, $entity, 'get');
}
}
/**
* Function to do a 'standard' api create - when the api is only doing a $bao::create then use this
+ *
* @param string $bao_name Name of BAO Class
* @param array $params parameters passed into the api call
* @param string $entity Entity - pass in if entity is non-standard & required $ids array
+ *
+ * @throws API_Exception
* @return array
*/
function _civicrm_api3_basic_create($bao_name, &$params, $entity = NULL) {
-
+ _civicrm_api3_format_params_for_create($params, $entity);
$args = array(&$params);
if (!empty($entity)) {
$ids = array($entity => CRM_Utils_Array::value('id', $params));
* @param string $subName - Subtype of entity
*/
function _civicrm_api3_custom_data_get(&$returnArray, $entity, $entity_id, $groupID = NULL, $subType = NULL, $subName = NULL) {
- $groupTree = &CRM_Core_BAO_CustomGroup::getTree($entity,
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree($entity,
CRM_Core_DAO::$_nullObject,
$entity_id,
$groupID,
$groupTree = CRM_Core_BAO_CustomGroup::formatGroupTree($groupTree, 1, CRM_Core_DAO::$_nullObject);
$customValues = array();
CRM_Core_BAO_CustomGroup::setDefaults($groupTree, $customValues);
+ $fieldInfo = array();
+ foreach ($groupTree as $set) {
+ $fieldInfo += $set['fields'];
+ }
if (!empty($customValues)) {
foreach ($customValues as $key => $val) {
- if (strstr($key, '_id')) {
- $idkey = substr($key, 0, -3);
- $returnArray['custom_' . (CRM_Core_BAO_CustomField::getKeyID($idkey) . "_id")] = $val;
- $returnArray[$key] = $val;
- }
- else {
- // per standard - return custom_fieldID
- $returnArray['custom_' . (CRM_Core_BAO_CustomField::getKeyID($key))] = $val;
+ // per standard - return custom_fieldID
+ $id = CRM_Core_BAO_CustomField::getKeyID($key);
+ $returnArray['custom_' . $id] = $val;
- //not standard - but some api did this so guess we should keep - cheap as chips
- $returnArray[$key] = $val;
+ //not standard - but some api did this so guess we should keep - cheap as chips
+ $returnArray[$key] = $val;
+
+ // Shim to restore legacy behavior of ContactReference custom fields
+ if (!empty($fieldInfo[$id]) && $fieldInfo[$id]['data_type'] == 'ContactReference') {
+ $returnArray['custom_' . $id . '_id'] = $returnArray[$key . '_id'] = $val;
+ $returnArray['custom_' . $id] = $returnArray[$key] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $val, 'sort_name');
}
}
}
* @internal param array $fieldinfo array of fields from getfields function
*/
function _civicrm_api3_validate_integer(&$params, &$fieldName, &$fieldInfo, $entity) {
- //if fieldname exists in params
if (!empty($params[$fieldName])) {
// if value = 'user_contact_id' (or similar), replace value with contact id
if (!is_numeric($params[$fieldName]) && is_scalar($params[$fieldName])) {
/**
* Returns the canonical name of a field
- * @param $entity: api entity name (string should already be standardized - no camelCase)
- * @param $fieldName: any variation of a field's name (name, unique_name, api.alias)
*
- * @return (string|bool) fieldName or FALSE if the field does not exist
+ * @param $entity : api entity name (string should already be standardized - no camelCase)
+ * @param $fieldName : any variation of a field's name (name, unique_name, api.alias)
+ *
+ * @return bool|string (string|bool) fieldName or FALSE if the field does not exist
*/
function _civicrm_api3_api_resolve_alias($entity, $fieldName) {
if (strpos($fieldName, 'custom_') === 0 && is_numeric($fieldName[7])) {