/**
* 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
/**
* Function transfers the filters being passed into the DAO onto the params object
+ * @param CRM_Core_DAO $dao
+ * @param array $params
+ * @param bool $unique
+ * @param string $entity
+ *
+ * @throws API_Exception
+ * @throws Exception
*/
function _civicrm_api3_dao_set_filter(&$dao, $params, $unique = TRUE, $entity) {
$entity = substr($dao->__table, 8);
/**
* build fields array. This is the array of fields as it relates to the given DAO
* returns unique fields as keys by default but if set but can return by DB fields
+ * @param CRM_Core_BAO $bao
+ *
+ * @return mixed
*/
function _civicrm_api3_get_unique_name_array(&$bao) {
$fields = $bao->fields();
/**
* Function to do a 'standard' api del - when the api is only doing a $bao::del then use this
* if api::del doesn't exist it will try DAO delete method
+ *
+ * @param $bao_name
+ * @param $params
+ *
+ * @return array API result array
+ * @throws API_Exception
*/
function _civicrm_api3_basic_delete($bao_name, &$params) {
$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');
}
}
}
case 4:
case 12:
+ case CRM_Utils_Type::T_TIMESTAMP:
//field is of type date or datetime
_civicrm_api3_validate_date($params, $fieldName, $fieldInfo);
break;
*
* @param array $params params from civicrm_api
* @param string $fieldName uniquename of field being checked
- * @param $fieldInfo
+ * @param array $fieldInfo
* @throws Exception
- * @internal param array $fieldinfo array of fields from getfields function
*/
function _civicrm_api3_validate_date(&$params, &$fieldName, &$fieldInfo) {
//should we check first to prevent it from being copied if they have passed in sql friendly format?
if (!empty($params[$fieldInfo['name']])) {
- //accept 'whatever strtotime accepts
- if (strtotime($params[$fieldInfo['name']]) === FALSE) {
- throw new Exception($fieldInfo['name'] . " is not a valid date: " . $params[$fieldInfo['name']]);
- }
- $format = ($fieldInfo['type'] == CRM_Utils_Type::T_DATE) ? 'Ymd000000' : 'YmdHis';
- $params[$fieldInfo['name']] = CRM_Utils_Date::processDate($params[$fieldInfo['name']], NULL, FALSE, $format);
+ $params[$fieldInfo['name']] = _civicrm_api3_getValidDate($params[$fieldInfo['name']], $fieldInfo['name'], $fieldInfo['type']);
}
if ((CRM_Utils_Array::value('name', $fieldInfo) != $fieldName) && !empty($params[$fieldName])) {
- //If the unique field name differs from the db name & is set handle it here
- if (strtotime($params[$fieldName]) === FALSE) {
- throw new Exception($fieldName . " is not a valid date: " . $params[$fieldName]);
+ $params[$fieldName] = _civicrm_api3_getValidDate($params[$fieldName], $fieldName, $fieldInfo['type']);
+ }
+}
+
+/**
+ * convert date into BAO friendly date
+ * we accept 'whatever strtotime accepts'
+ *
+ * @param string $dateValue
+ * @param $fieldName
+ * @param $fieldType
+ *
+ * @throws Exception
+ * @internal param $fieldInfo
+ *
+ * @internal param $params
+ * @return mixed
+ */
+function _civicrm_api3_getValidDate($dateValue, $fieldName, $fieldType) {
+ if (is_array($dateValue)) {
+ foreach ($dateValue as $key => $value) {
+ $dateValue[$key] = _civicrm_api3_getValidDate($value, $fieldName, $fieldType);
}
- $params[$fieldName] = CRM_Utils_Date::processDate($params[$fieldName]);
+ return $dateValue;
}
+ if (strtotime($dateValue) === FALSE) {
+ throw new Exception($fieldName . " is not a valid date: " . $dateValue);
+ }
+ $format = ($fieldType == CRM_Utils_Type::T_DATE) ? 'Ymd000000' : 'YmdHis';
+ return CRM_Utils_Date::processDate($dateValue, NULL, FALSE, $format);
}
/**
* Validate string fields being passed into API.
* @param array $params params from civicrm_api
* @param string $fieldName uniquename of field being checked
- * @param $fieldInfo
+ * @param array $fieldInfo array of fields from getfields function
* @param $entity
* @throws API_Exception
* @throws Exception
- * @internal param array $fieldinfo array of fields from getfields function
*/
function _civicrm_api3_validate_string(&$params, &$fieldName, &$fieldInfo, $entity) {
// If fieldname exists in params
/**
* 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])) {