/**
* Wrapper Function for civicrm_verify_mandatory to make it simple to pass either / or fields for checking
*
- * @param array $params array of fields to check
- * @param array $daoName string DAO to check for required fields (create functions only)
- * @param array $keyoptions list of required fields options. One of the options is required
- *
- * @return null or throws error if there the required fields not present
- * @
+ * @param array $params
+ * Array of fields to check.
+ * @param array $daoName
+ * String DAO to check for required fields (create functions only).
+ * @param array $keyoptions
+ * List of required fields options. One of the options is required.
*/
-function civicrm_api3_verify_one_mandatory($params, $daoName = NULL, $keyoptions = array(
- )) {
+function civicrm_api3_verify_one_mandatory($params, $daoName = NULL, $keyoptions = array()) {
$keys = array(array());
foreach ($keyoptions as $key) {
$keys[0][] = $key;
/**
* check mandatory fields are included
*
- * @param array $params array of fields to check
- * @param array $daoName string DAO to check for required fields (create functions only)
- * @param array $keys list of required fields. A value can be an array denoting that either this or that is required.
+ * @param array $params
+ * Array of fields to check.
+ * @param array $daoName
+ * String DAO to check for required fields (create functions only).
+ * @param array $keys
+ * List of required fields. A value can be an array denoting that either this or that is required.
* @param bool $verifyDAO
- *
- * @throws API_Exception
- * @return null or throws error if there the required fields not present
- *
- * @todo see notes on _civicrm_api3_check_required_fields regarding removing $daoName param
*/
function civicrm_api3_verify_mandatory($params, $daoName = NULL, $keys = array(), $verifyDAO = TRUE) {
}
}
if (!empty($unmatched)) {
- throw new API_Exception("Mandatory key(s) missing from params array: " . implode(", ", $unmatched),"mandatory_missing",array("fields"=>$unmatched));
+ throw new API_Exception("Mandatory key(s) missing from params array: " . implode(", ", $unmatched), "mandatory_missing", array("fields" => $unmatched));
}
}
/**
*
- * @param <type> $data
+ * @param $msg
* @param array $data
- *
- * @throws API_Exception
- * @return array <type>
+ * @return array
*/
function civicrm_api3_create_error($msg, $data = array()) {
$data['is_error'] = 1;
$data['error_message'] = $msg;
// we will show sql to privileged user only (not sure of a specific
// security hole here but seems sensible - perhaps should apply to the trace as well?)
- if(isset($data['sql']) && CRM_Core_Permission::check('Administer CiviCRM')) {
+ if (isset($data['sql']) && CRM_Core_Permission::check('Administer CiviCRM')) {
$data['debug_information'] = $data['sql']; // Isn't this redundant?
- } else {
+ }
+ else {
unset($data['sql']);
}
return $data;
* Format array in result output styple
*
* @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 object $dao DAO object to be freed here
- * @param array $extraReturnValues additional values to be added to top level of result array(
+ * @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 object $dao
+ * DAO object to be freed here.
+ * @param array $extraReturnValues
+ * Additional values to be added to top level of result array(.
* - this param is currently used for legacy behaviour support
*
- * @return array $result
+ * @return array
*/
function civicrm_api3_create_success($values = 1, $params = array(), $entity = NULL, $action = NULL, &$dao = NULL, $extraReturnValues = array()) {
$result = array();
if (empty($item['id']) && !empty($item[$entity . "_id"])) {
$values[$key]['id'] = $item[$entity . "_id"];
}
- if(!empty($item['financial_type_id'])){
+ if (!empty($item['financial_type_id'])) {
//4.3 legacy handling
$values[$key]['contribution_type_id'] = $item['financial_type_id'];
}
- if(!empty($item['next_sched_contribution_date'])){
+ if (!empty($item['next_sched_contribution_date'])) {
// 4.4 legacy handling
$values[$key]['next_sched_contribution'] = $item['next_sched_contribution_date'];
}
else {
$result['values'] = $values;
}
- if(!empty($params['options']['metadata'])) {
+ if (!empty($params['options']['metadata'])) {
// we've made metadata an array but only supporting 'fields' atm
- if(in_array('fields', (array) $params['options']['metadata']) && $action !== 'getfields') {
+ if (in_array('fields', (array) $params['options']['metadata']) && $action !== 'getfields') {
$fields = civicrm_api3($entity, 'getfields', array('action' => substr($action, 0, 3) == 'get' ? 'get' : 'create'));
$result['metadata']['fields'] = $fields['values'];
}
/**
* Load the DAO of the entity
+ * @param $entity
+ * @return bool
*/
function _civicrm_api3_load_DAO($entity) {
$dao = _civicrm_api3_get_DAO($entity);
/**
* return the DAO of the function or Entity
- * @param String $name either a function of the api (civicrm_{entity}_create or the entity name
- * return the DAO name to manipulate this function
- * eg. "civicrm_api3_contact_create" or "Contact" will return "CRM_Contact_BAO_Contact"
+ * @param string $name
+ * Either a function of the api (civicrm_{entity}_create or the entity name.
+ * return the DAO name to manipulate this function
+ * eg. "civicrm_api3_contact_create" or "Contact" will return "CRM_Contact_BAO_Contact"
* @return mixed|string
*/
function _civicrm_api3_get_DAO($name) {
}
// Really weird apis can declare their own DAO name. Not sure if this is a good idea...
- if(file_exists("api/v3/$name.php")) {
+ if (file_exists("api/v3/$name.php")) {
include_once "api/v3/$name.php";
}
/**
* return the DAO of the function or Entity
- * @param String $name is either a function of the api (civicrm_{entity}_create or the entity name
- * return the DAO name to manipulate this function
- * eg. "civicrm_contact_create" or "Contact" will return "CRM_Contact_BAO_Contact"
+ * @param string $name
+ * Is either a function of the api (civicrm_{entity}_create or the entity name.
+ * return the DAO name to manipulate this function
+ * eg. "civicrm_contact_create" or "Contact" will return "CRM_Contact_BAO_Contact"
* @return mixed
*/
function _civicrm_api3_get_BAO($name) {
/**
* Recursive function to explode value-separated strings into arrays
- *
+ * @param $values
*/
function _civicrm_api3_separate_values(&$values) {
$sp = CRM_Core_DAO::VALUE_SEPARATOR;
_civicrm_api3_separate_values($value);
}
elseif (is_string($value)) {
- if($key == 'case_type_id'){// this is to honor the way case API was originally written
+ if ($key == 'case_type_id') {// this is to honor the way case API was originally written
$value = trim(str_replace($sp, ',', $value), ',');
}
elseif (strpos($value, $sp) !== FALSE) {
* @param array $params
* @param array $values
*/
-function _civicrm_api3_filter_fields_for_bao($entity, &$params, &$values){
- $fields = civicrm_api($entity,'getfields', array('version' => 3,'action' => 'create'));
+function _civicrm_api3_filter_fields_for_bao($entity, &$params, &$values) {
+ $fields = civicrm_api($entity, 'getfields', array('version' => 3, 'action' => 'create'));
$fields = $fields['values'];
_civicrm_api3_store_values($fields, $params, $values);
}
* @param array $params
* @param array $values
*
- * @return Bool $valueFound
+ * @return Bool
*/
function _civicrm_api3_store_values(&$fields, &$params, &$values) {
$valueFound = FALSE;
* others that use the query object. Note that this function passes permission information in.
* The others don't
*
- * * Ideally this would be merged with _civicrm_get_query_object but we need to resolve differences in what the
+ * Ideally this would be merged with _civicrm_get_query_object but we need to resolve differences in what the
* 2 variants call
* @param $entity
- * @param array $params as passed into api get or getcount function
- * @param array $additional_options array of options (so we can modify the filter)
- * @param bool $getCount are we just after the count
+ * @param array $params
+ * As passed into api get or getcount function.
+ * @param array $additional_options
+ * Array of options (so we can modify the filter).
+ * @param bool $getCount
+ * Are we just after the count.
*
- * @return
+ * @return array
*/
-function _civicrm_api3_get_using_query_object($entity, $params, $additional_options = array(), $getCount = NULL){
+function _civicrm_api3_get_using_query_object($entity, $params, $additional_options = array(), $getCount = NULL) {
// Convert id to e.g. contact_id
if (empty($params[$entity . '_id']) && isset($params['id'])) {
CRM_Utils_Array::value('return', $options, array()),
CRM_Utils_Array::value('return', $additional_options, array())
);
- if(empty($returnProperties)){
+ if (empty($returnProperties)) {
$returnProperties = NULL;
}
- if(!empty($params['check_permissions'])){
+ if (!empty($params['check_permissions'])) {
// we will filter query object against getfields
$fields = civicrm_api($entity, 'getfields', array('version' => 3, 'action' => 'get'));
// we need to add this in as earlier in this function 'id' was unset in favour of $entity_id
$fields['values'][$entity . '_id'] = array();
$varsToFilter = array('returnProperties', 'inputParams');
- foreach ($varsToFilter as $varToFilter){
- if(!is_array($$varToFilter)){
+ foreach ($varsToFilter as $varToFilter) {
+ if (!is_array($$varToFilter)) {
continue;
}
//I was going to throw an exception rather than silently filter out - but
$$varToFilter = array_intersect_key($$varToFilter, $fields['values']);
}
}
- $options = array_merge($options,$additional_options);
+ $options = array_merge($options, $additional_options);
$sort = CRM_Utils_Array::value('sort', $options, NULL);
$offset = CRM_Utils_Array::value('offset', $options, NULL);
$limit = CRM_Utils_Array::value('limit', $options, NULL);
$smartGroupCache = CRM_Utils_Array::value('smartGroupCache', $params);
- if($getCount){
+ if ($getCount) {
$limit = NULL;
$returnProperties = NULL;
}
$newParams = CRM_Contact_BAO_Query::convertFormValues($inputParams);
foreach ($newParams as &$newParam) {
- if($newParam[1] == '=' && is_array($newParam[2])) {
+ if ($newParam[1] == '=' && is_array($newParam[2])) {
// we may be looking at an attempt to use the 'IN' style syntax
// @todo at time of writing only 'IN' & 'NOT IN' are supported for the array style syntax
$sqlFilter = CRM_Core_DAO::createSqlFilter($newParam[0], $params[$newParam[0]], 'String', NULL, TRUE);
- if($sqlFilter) {
+ if ($sqlFilter) {
$newParam[1] = key($newParam[2]);
$newParam[2] = $sqlFilter;
}
}
- $skipPermissions = !empty($params['check_permissions']) ? 0 :1;
+ $skipPermissions = !empty($params['check_permissions']) ? 0 : 1;
list($entities, $options) = CRM_Contact_BAO_Query::apiQuery(
$newParams,
$returnProperties,
NULL,
$sort,
- $offset ,
+ $offset,
$limit,
$smartGroupCache,
$getCount,
$skipPermissions
);
- if ($getCount) { // only return the count of contacts
+ if ($getCount) {
+ // only return the count of contacts
return $entities;
}
* @param array $params
* @param string $mode
* @param string $entity
- * @return CRM_Core_DAO query object
+ * @return array
+ * [CRM_Core_DAO|CRM_Contact_BAO_Query]
*/
function _civicrm_api3_get_query_object($params, $mode, $entity) {
- $options = _civicrm_api3_get_options_from_params($params, TRUE, $entity, 'get');
- $sort = CRM_Utils_Array::value('sort', $options, NULL);
- $offset = CRM_Utils_Array::value('offset', $options);
- $rowCount = CRM_Utils_Array::value('limit', $options);
- $inputParams = CRM_Utils_Array::value('input_params', $options, array());
+ $options = _civicrm_api3_get_options_from_params($params, TRUE, $entity, 'get');
+ $sort = CRM_Utils_Array::value('sort', $options, NULL);
+ $offset = CRM_Utils_Array::value('offset', $options);
+ $rowCount = CRM_Utils_Array::value('limit', $options);
+ $inputParams = CRM_Utils_Array::value('input_params', $options, array());
$returnProperties = CRM_Utils_Array::value('return', $options, NULL);
if (empty($returnProperties)) {
$returnProperties = CRM_Contribute_BAO_Query::defaultReturnProperties($mode);
}
- $newParams = CRM_Contact_BAO_Query::convertFormValues($inputParams);
+ $newParams = CRM_Contact_BAO_Query::convertFormValues($inputParams, 0, FALSE, $entity);
$query = new CRM_Contact_BAO_Query($newParams, $returnProperties, NULL,
FALSE, FALSE, $mode,
empty($params['check_permissions'])
if (!empty($sort)) {
$sql .= " ORDER BY $sort ";
}
- if(!empty($rowCount)) {
+ if (!empty($rowCount)) {
$sql .= " LIMIT $offset, $rowCount ";
}
$dao = CRM_Core_DAO::executeQuery($sql);
//get the actual fieldname from db
$fieldName = $allfields[$field]['name'];
$where = CRM_Core_DAO::createSqlFilter($fieldName, $params[$field], 'String');
- if(!empty($where)) {
+ if (!empty($where)) {
$dao->whereAdd($where);
}
}
if (!empty($options['return']) && is_array($options['return']) && empty($options['is_count'])) {
$dao->selectAdd();
$options['return']['id'] = TRUE;// ensure 'id' is included
- $allfields = _civicrm_api3_get_unique_name_array($dao);
+ $allfields = _civicrm_api3_get_unique_name_array($dao);
$returnMatched = array_intersect(array_keys($options['return']), $allfields);
foreach ($returnMatched as $returnValue) {
$dao->selectAdd($returnValue);
$unmatchedFields,
array_flip($allfields)// but a match for the field keys
);
- foreach ($returnUniqueMatched as $uniqueVal){
+ foreach ($returnUniqueMatched as $uniqueVal) {
$dao->selectAdd($allfields[$uniqueVal]);
}
}
/**
* Apply filters (e.g. high, low) to DAO object (prior to find)
- * @param string $filterField field name of filter
- * @param string $filterValue field value of filter
- * @param object $dao DAO object
+ * @param string $filterField
+ * Field name of filter.
+ * @param string $filterValue
+ * Field value of filter.
+ * @param object $dao
+ * DAO object.
*/
function _civicrm_api3_apply_filters_to_dao($filterField, $filterValue, &$dao) {
if (strstr($filterField, 'high')) {
$fieldName = substr($filterField, 0, -4);
$dao->whereAdd("($fieldName >= $filterValue )");
}
- if($filterField == 'is_current' && $filterValue == 1){
+ if ($filterField == 'is_current' && $filterValue == 1) {
$todayStart = date('Ymd000000', strtotime('now'));
$todayEnd = date('Ymd235959', strtotime('now'));
$dao->whereAdd("(start_date <= '$todayStart' OR start_date IS NULL) AND (end_date >= '$todayEnd' OR end_date IS NULL)");
- if(property_exists($dao, 'is_active')){
+ if (property_exists($dao, 'is_active')) {
$dao->whereAdd('is_active = 1');
}
}
* Get sort, limit etc options from the params - supporting old & new formats.
* get returnproperties for legacy
*
- * @param array $params params array as passed into civicrm_api
- * @param bool $queryObject - is this supporting a queryobject api (e.g contact) - if so we support more options
- * for legacy report & return a unique fields array
+ * @param array $params
+ * Params array as passed into civicrm_api.
+ * @param bool $queryObject
+ * Is this supporting a queryobject api (e.g contact) - if so we support more options.
+ * for legacy report & return a unique fields array
*
* @param string $entity
* @param string $action
*
* @throws API_Exception
- * @return array $options options extracted from params
+ * @return array
+ * options extracted from params
*/
function _civicrm_api3_get_options_from_params(&$params, $queryObject = FALSE, $entity = '', $action = '') {
$is_count = FALSE;
$returnProperties = array_fill_keys($returnProperties, 1);
}
}
- if ($entity && $action =='get') {
+ if ($entity && $action == 'get') {
if (!empty($returnProperties['id'])) {
$returnProperties[$entity . '_id'] = 1;
unset($returnProperties['id']);
}
- switch (trim(strtolower($sort))){
- case 'id':
- case 'id desc':
- case 'id asc':
- $sort = str_replace('id', $entity . '_id',$sort);
+ switch (trim(strtolower($sort))) {
+ case 'id':
+ case 'id desc':
+ case 'id asc':
+ $sort = str_replace('id', $entity . '_id', $sort);
}
}
$inputParams = array();
$legacyreturnProperties = array();
$otherVars = array(
- 'sort', 'offset', 'rowCount', 'options','return',
+ 'sort', 'offset', 'rowCount', 'options', 'return',
);
foreach ($params as $n => $v) {
if (substr($n, 0, 7) == 'return.') {
$legacyreturnProperties[substr($n, 7)] = $v;
}
elseif ($n == 'id') {
- $inputParams[$entity. '_id'] = $v;
+ $inputParams[$entity . '_id'] = $v;
+ }
+ elseif (in_array($n, $otherVars)) {
}
- elseif (in_array($n, $otherVars)) {}
else {
$inputParams[$n] = $v;
if ($v && !is_array($v) && stristr($v, 'SELECT')) {
/**
* Apply options (e.g. sort, limit, order by) to DAO object (prior to find)
*
- * @param array $params params array as passed into civicrm_api
- * @param object $dao DAO object
+ * @param array $params
+ * Params array as passed into civicrm_api.
+ * @param object $dao
+ * DAO object.
* @param $entity
*/
function _civicrm_api3_apply_options_to_dao(&$params, &$dao, $entity) {
- $options = _civicrm_api3_get_options_from_params($params,FALSE,$entity);
- if(!$options['is_count']) {
- if(!empty($options['limit'])) {
- $dao->limit((int)$options['offset'], (int)$options['limit']);
+ $options = _civicrm_api3_get_options_from_params($params, FALSE, $entity);
+ if (!$options['is_count']) {
+ if (!empty($options['limit'])) {
+ $dao->limit((int) $options['offset'], (int) $options['limit']);
}
if (!empty($options['sort'])) {
$dao->orderBy($options['sort']);
/**
* 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_DAO $bao
+ * @param bool $unique
+ *
+ * @return array
*/
function _civicrm_api3_build_fields_array(&$bao, $unique = TRUE) {
$fields = $bao->fields();
if ($unique) {
- if (empty($fields['id'])){
- $entity = _civicrm_api_get_entity_name_from_dao($bao);
- $fields['id'] = $fields[$entity . '_id'];
- unset($fields[$entity . '_id']);
+ if (empty($fields['id'])) {
+ $entity = _civicrm_api_get_entity_name_from_dao($bao);
+ $fields['id'] = $fields[$entity . '_id'];
+ unset($fields[$entity . '_id']);
}
return $fields;
}
/**
* 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
+ * @param CRM_Core_DAO $bao
+ *
+ * @return array
*/
function _civicrm_api3_get_unique_name_array(&$bao) {
$fields = $bao->fields();
foreach ($fields as $field => $values) {
- $uniqueFields[$field] = CRM_Utils_Array::value('name',$values, $field);
+ $uniqueFields[$field] = CRM_Utils_Array::value('name', $values, $field);
}
return $uniqueFields;
}
/**
* Converts an DAO object to an array
*
- * @param CRM_Core_DAO $dao object to convert
+ * @param CRM_Core_DAO $dao
+ * Object to convert.
* @param array $params
* @param bool $uniqueFields
* @param string $entity
* @param bool $autoFind
*
* @return array
- *
- * @static void
- * @access public
*/
function _civicrm_api3_dao_to_array($dao, $params = NULL, $uniqueFields = TRUE, $entity = "", $autoFind = TRUE) {
$result = array();
- if(isset($params['options']) && !empty($params['options']['is_count'])) {
+ if (isset($params['options']) && !empty($params['options']['is_count'])) {
return $dao->count();
}
if (empty($dao)) {
return array();
}
- if(isset($dao->count)) {
+ if (isset($dao->count)) {
return $dao->count;
}
}
$result[$dao->id] = $tmp;
- if(_civicrm_api3_custom_fields_are_required($entity, $params)) {
+ if (_civicrm_api3_custom_fields_are_required($entity, $params)) {
_civicrm_api3_custom_data_get($result[$dao->id], $entity, $dao->id);
}
}
-
return $result;
}
* && 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 string $entity
+ * Entity name in CamelCase.
* @param array $params
- * @param string $entity - entity name in CamelCase
*
* @return bool
*/
$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')) {
+ if (stristr($returnString, 'custom')) {
return TRUE;
}
}
/**
* Converts an object to an array
*
- * @param object $dao (reference) object to convert
- * @param array $values (reference) array
+ * @param object $dao
+ * (reference) object to convert.
+ * @param array $values
+ * (reference) array.
* @param array|bool $uniqueFields
- *
- * @return array
- * @static void
- * @access public
*/
function _civicrm_api3_object_to_array(&$dao, &$values, $uniqueFields = FALSE) {
/**
* Wrapper for _civicrm_object_to_array when api supports unique fields
+ * @param $dao
+ * @param $values
+ * @return array
*/
function _civicrm_api3_object_to_array_unique_fields(&$dao, &$values) {
return _civicrm_api3_object_to_array($dao, $values, TRUE);
*
* @param array $params
* @param array $values
- * @param string $extends entity that this custom field extends (e.g. contribution, event, contact)
- * @param string $entityId ID of entity per $extends
+ * @param string $extends
+ * Entity that this custom field extends (e.g. contribution, event, contact).
+ * @param string $entityId
+ * ID of entity per $extends.
*/
function _civicrm_api3_custom_format_params($params, &$values, $extends, $entityId = NULL) {
$values['custom'] = array();
$checkCheckBoxField = FALSE;
$entity = $extends;
- if(in_array($extends, array('Household', 'Individual', 'Organization'))) {
+ if (in_array($extends, array('Household', 'Individual', 'Organization'))) {
$entity = 'Contact';
}
$fields = civicrm_api($entity, 'getfields', array('version' => 3, 'action' => 'create'));
- if(!$fields['is_error']) {
+ if (!$fields['is_error']) {
// not sure if fields could be error - maybe change to using civicrm_api3 wrapper later - this is conservative
$fields = $fields['values'];
$checkCheckBoxField = TRUE;
foreach ($params as $key => $value) {
list($customFieldID, $customValueID) = CRM_Core_BAO_CustomField::getKeyID($key, TRUE);
- if ($customFieldID && (!IS_NULL($value))) {
+ if ($customFieldID && (!is_null($value))) {
if ($checkCheckBoxField && !empty($fields['custom_' . $customFieldID]) && $fields['custom_' . $customFieldID]['html_type'] == 'CheckBox') {
formatCheckBoxField($value, 'custom_' . $customFieldID, $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)) {
+ if (!array_key_exists($entity, $customFieldEntities)) {
return;
}
$values = array();
* api level. Hence the intention is to remove this function
* & the associated param from viery_mandatory
*
- * @param array $params Associative array of property name/value
+ * @param array $params
+ * Associative array of property name/value.
* pairs to insert in new history.
* @param string $daoName
* @param bool $return
*
* @daoName string DAO to check params agains
*
- * @return bool should the missing fields be returned as an array (core error created as default)
- *
- * @return bool true if all fields present, depending on $result a core error is created of an array of missing fields is returned
- * @access public
+ * @return bool
+ * Sshould the missing fields be returned as an array (core error created as default)
+ * true if all fields present, depending on $result a core error is created of an array of missing fields is returned
*/
function _civicrm_api3_check_required_fields($params, $daoName, $return = FALSE) {
//@deprecated - see notes
/**
* Function to do a 'standard' api get - when the api is only doing a $bao->find then use this
*
- * @param string $bao_name name of BAO
- * @param array $params params from api
- * @param bool $returnAsSuccess return in api success format
+ * @param string $bao_name
+ * Name of BAO.
+ * @param array $params
+ * Params from api.
+ * @param bool $returnAsSuccess
+ * Return in api success format.
* @param string $entity
*
* @return array
$bao = new $bao_name();
_civicrm_api3_dao_set_filter($bao, $params, TRUE, $entity);
if ($returnAsSuccess) {
- return civicrm_api3_create_success(_civicrm_api3_dao_to_array($bao, $params, FALSE, $entity), $params, $entity, 'get');
+ 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, '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
+ * @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
* @param string $bao_name
* @param array $params
*
- * @return array API result array
+ * @return array
+ * API result array
* @throws API_Exception
*/
function _civicrm_api3_basic_delete($bao_name, &$params) {
* Get custom data for the given entity & Add it to the returnArray as 'custom_123' = 'custom string' AND 'custom_123_1' = 'custom string'
* Where 123 is field value & 1 is the id within the custom group data table (value ID)
*
- * @param array $returnArray - array to append custom data too - generally $result[4] where 4 is the entity id.
- * @param string $entity e.g membership, event
+ * @param array $returnArray
+ * Array to append custom data too - generally $result[4] where 4 is the entity id.
+ * @param string $entity
+ * E.g membership, event.
* @param int $entity_id
- * @param int $groupID - per CRM_Core_BAO_CustomGroup::getTree
- * @param int $subType e.g. membership_type_id where custom data doesn't apply to all membership types
- * @param string $subName - Subtype of entity
+ * @param int $groupID
+ * Per CRM_Core_BAO_CustomGroup::getTree.
+ * @param int $subType
+ * E.g. membership_type_id where custom data doesn't apply to all membership types.
+ * @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,
* As of writing only date was implemented.
* @param string $entity
* @param string $action
- * @param array $params -
- * @param array $fields response from getfields all variables are the same as per civicrm_api
- * @param bool $errorMode errorMode do intensive post fail checks?
+ * @param array $params
+ * -.
+ * @param array $fields
+ * Response from getfields all variables are the same as per civicrm_api.
+ * @param bool $errorMode
+ * ErrorMode do intensive post fail checks?.
* @throws Exception
*/
-function _civicrm_api3_validate_fields($entity, $action, &$params, $fields, $errorMode = False) {
+function _civicrm_api3_validate_fields($entity, $action, &$params, $fields, $errorMode = FALSE) {
$fields = array_intersect_key($fields, $params);
foreach ($fields as $fieldName => $fieldInfo) {
switch (CRM_Utils_Array::value('type', $fieldInfo)) {
_civicrm_api3_validate_date($params, $fieldName, $fieldInfo);
break;
- case 32://blob
+ case 32:
+ //blob
_civicrm_api3_validate_html($params, $fieldName, $fieldInfo);
break;
break;
case CRM_Utils_Type::T_MONEY:
- if (!CRM_Utils_Rule::money($params[$fieldName]) && !empty($params[$fieldName])) {
- throw new Exception($fieldName . " is not a valid amount: " . $params[$fieldName]);
+ list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
+ if (strpos($op, 'NULL') !== FALSE || strpos($op, 'EMPTY') !== FALSE) {
+ break;
+ }
+ foreach ((array) $fieldValue as $fieldvalue) {
+ if (!CRM_Utils_Rule::money($fieldvalue) && !empty($fieldvalue)) {
+ throw new Exception($fieldName . " is not a valid amount: " . $params[$fieldName]);
+ }
}
+ break;
}
// intensive checks - usually only called after DB level fail
if (!empty($errorMode) && strtolower($action) == 'create') {
if (!empty($fieldInfo['FKClassName'])) {
- if (!empty($params[$fieldName])) {
+ if (!empty($fieldValue)) {
_civicrm_api3_validate_constraint($params, $fieldName, $fieldInfo);
}
elseif (!empty($fieldInfo['required'])) {
}
if (!empty($fieldInfo['api.unique'])) {
$params['entity'] = $entity;
- _civicrm_api3_validate_uniquekey($params, $fieldName, $fieldInfo);
+ _civicrm_api3_validate_unique_key($params, $fieldName);
}
}
}
* It also checks against the RULE:date function. This is a centralisation of code that was scattered and
* may not be the best thing to do. There is no code level documentation on the existing functions to work off
*
- * @param array $params params from civicrm_api
- * @param string $fieldName uniquename of field being checked
- * @param array $fieldInfo array of fields from getfields function
+ * @param array $params
+ * Params from civicrm_api.
+ * @param string $fieldName
+ * Uniquename of field being checked.
+ * @param array $fieldInfo
+ * Array of fields from getfields function.
* @throws Exception
*/
function _civicrm_api3_validate_date(&$params, &$fieldName, &$fieldInfo) {
+ list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
+ if (strpos($op, 'NULL') !== FALSE || strpos($op, 'EMPTY') !== FALSE) {
+ return;
+ }
//should we check first to prevent it from being copied if they have passed in sql friendly format?
if (!empty($params[$fieldInfo['name']])) {
- $params[$fieldInfo['name']] = _civicrm_api3_getValidDate($params[$fieldInfo['name']], $fieldInfo['name'], $fieldInfo['type']);
+ $fieldValue = _civicrm_api3_getValidDate($fieldValue, $fieldInfo['name'], $fieldInfo['type']);
+ }
+ if ((CRM_Utils_Array::value('name', $fieldInfo) != $fieldName) && !empty($fieldValue)) {
+ $fieldValue = _civicrm_api3_getValidDate($fieldValue, $fieldName, $fieldInfo['type']);
+ }
+
+ if (!empty($op)) {
+ $params[$fieldName][$op] = $fieldValue;
}
- if ((CRM_Utils_Array::value('name', $fieldInfo) != $fieldName) && !empty($params[$fieldName])) {
- $params[$fieldName] = _civicrm_api3_getValidDate($params[$fieldName], $fieldName, $fieldInfo['type']);
+ else {
+ $params[$fieldName] = $fieldValue;
}
}
/**
* Validate foreign constraint fields being passed into API.
*
- * @param array $params params from civicrm_api
- * @param string $fieldName uniquename of field being checked
- * @param array $fieldInfo array of fields from getfields function
- * @throws Exception
+ * @param mixed $fieldValue
+ * @param string $fieldName
+ * Uniquename of field being checked.
+ * @param array $fieldInfo
+ * Array of fields from getfields function.
+ * @throws \API_Exception
*/
-function _civicrm_api3_validate_constraint(&$params, &$fieldName, &$fieldInfo) {
- $dao = new $fieldInfo['FKClassName'];
- $dao->id = $params[$fieldName];
+function _civicrm_api3_validate_constraint(&$fieldValue, &$fieldName, &$fieldInfo) {
+ $daoName = $fieldInfo['FKClassName'];
+ $dao = new $daoName();
+ $dao->id = $fieldValue;
$dao->selectAdd();
$dao->selectAdd('id');
if (!$dao->find()) {
- throw new Exception("$fieldName is not valid : " . $params[$fieldName]);
+ throw new API_Exception("$fieldName is not valid : " . $fieldValue);
}
}
/**
* Validate foreign constraint fields being passed into API.
*
- * @param array $params params from civicrm_api
- * @param string $fieldName uniquename of field being checked
- * @param $fieldInfo array of fields from getfields function
+ * @param array $params
+ * Params from civicrm_api.
+ * @param string $fieldName
+ * Uniquename of field being checked.
* @throws Exception
*/
-function _civicrm_api3_validate_uniquekey(&$params, &$fieldName, &$fieldInfo) {
+function _civicrm_api3_validate_unique_key(&$params, &$fieldName) {
+ list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
+ if (strpos($op, 'NULL') !== FALSE || strpos($op, 'EMPTY') !== FALSE) {
+ return;
+ }
$existing = civicrm_api($params['entity'], 'get', array(
'version' => $params['version'],
- $fieldName => $params[$fieldName],
+ $fieldName => $fieldValue,
));
// an entry already exists for this unique field
if ($existing['count'] == 1) {
* Note: This will verify that 'values' is present, but it does not directly verify
* any other parameters.
*
- * @param string $entity entity name
- * @param array $params params from civicrm_api, including:
+ * @param string $entity
+ * Entity name.
+ * @param array $params
+ * Params from civicrm_api, including:.
* - 'values': an array of records to save
* - all other items: keys which identify new/pre-existing records
* @return array|int
/**
* returns fields allowable by api
*
- * @param $entity string Entity to query
- * @param bool $unique index by unique fields?
+ * @param $entity
+ * String Entity to query.
+ * @param bool $unique
+ * Index by unique fields?.
* @param array $params
*
* @return array
/**
* Return an array of fields for a given entity - this is the same as the BAO function but
* fields are prefixed with 'custom_' to represent api params
+ * @param $entity
+ * @param array $params
+ * @return array
*/
function _civicrm_api_get_custom_fields($entity, &$params) {
$entity = _civicrm_api_get_camel_name($entity);
}
return $ret;
}
+
/**
* Translate the custom field data_type attribute into a std 'type'
+ * @param $dataType
+ * @return int
*/
function _getStandardTypeFromCustomDataType($dataType) {
$mapping = array(
* If multiple aliases the last takes precedence
*
* Function also swaps unique fields for non-unique fields & vice versa.
+ * @param $apiRequest
+ * @param $fields
*/
function _civicrm_api3_swap_out_aliases(&$apiRequest, $fields) {
foreach ($fields as $field => $values) {
&& $uniqueName
&& $field != $uniqueName
&& array_key_exists($uniqueName, $apiRequest['params'])
- )
- {
+ ) {
$apiRequest['params'][$field] = CRM_Utils_Array::value($values['uniqueName'], $apiRequest['params']);
// note that it would make sense to unset the original field here but tests need to be in place first
}
* Validate integer fields being passed into API.
* It currently converts the incoming value 'user_contact_id' into the id of the currently logged in user
*
- * @param array $params params from civicrm_api
- * @param string $fieldName uniquename of field being checked
- * @param array $fieldInfo array of fields from getfields function
+ * @param array $params
+ * Params from civicrm_api.
+ * @param string $fieldName
+ * Uniquename of field being checked.
+ * @param array $fieldInfo
+ * Array of fields from getfields function.
* @param string $entity
* @throws API_Exception
*/
function _civicrm_api3_validate_integer(&$params, &$fieldName, &$fieldInfo, $entity) {
- if (!empty($params[$fieldName])) {
+ list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
+ if (strpos($op, 'NULL') !== FALSE || strpos($op, 'EMPTY') !== FALSE) {
+ return;
+ }
+
+ if (!empty($fieldValue)) {
// if value = 'user_contact_id' (or similar), replace value with contact id
- if (!is_numeric($params[$fieldName]) && is_scalar($params[$fieldName])) {
- $realContactId = _civicrm_api3_resolve_contactID($params[$fieldName]);
+ if (!is_numeric($fieldValue) && is_scalar($fieldValue)) {
+ $realContactId = _civicrm_api3_resolve_contactID($fieldValue);
if ('unknown-user' === $realContactId) {
- throw new API_Exception("\"$fieldName\" \"{$params[$fieldName]}\" cannot be resolved to a contact ID", 2002, array('error_field' => $fieldName,"type"=>"integer"));
- } elseif (is_numeric($realContactId)) {
- $params[$fieldName] = $realContactId;
+ throw new API_Exception("\"$fieldName\" \"{$fieldValue}\" cannot be resolved to a contact ID", 2002, array('error_field' => $fieldName, "type" => "integer"));
+ }
+ elseif (is_numeric($realContactId)) {
+ $fieldValue = $realContactId;
}
}
if (!empty($fieldInfo['pseudoconstant']) || !empty($fieldInfo['options'])) {
- _civicrm_api3_api_match_pseudoconstant($params, $entity, $fieldName, $fieldInfo);
+ _civicrm_api3_api_match_pseudoconstant($fieldValue, $entity, $fieldName, $fieldInfo);
}
// After swapping options, ensure we have an integer(s)
- foreach ((array) ($params[$fieldName]) as $value) {
+ foreach ((array) ($fieldValue) as $value) {
if ($value && !is_numeric($value) && $value !== 'null' && !is_array($value)) {
throw new API_Exception("$fieldName is not a valid integer", 2001, array('error_field' => $fieldName, "type" => "integer"));
}
}
// Check our field length
- if(is_string($params[$fieldName]) && !empty($fieldInfo['maxlength']) && strlen($params[$fieldName]) > $fieldInfo['maxlength']
- ){
- throw new API_Exception( $params[$fieldName] . " is " . strlen($params[$fieldName]) . " characters - longer than $fieldName length" . $fieldInfo['maxlength'] . ' characters',
- 2100, array('field' => $fieldName, "max_length"=>$fieldInfo['maxlength'])
+ if (is_string($fieldValue) && !empty($fieldInfo['maxlength']) && strlen($fieldValue) > $fieldInfo['maxlength']
+ ) {
+ throw new API_Exception( $fieldValue . " is " . strlen($fieldValue) . " characters - longer than $fieldName length" . $fieldInfo['maxlength'] . ' characters',
+ 2100, array('field' => $fieldName, "max_length" => $fieldInfo['maxlength'])
);
}
}
+
+ if (!empty($op)) {
+ $params[$fieldName][$op] = $fieldValue;
+ }
+ else {
+ $params[$fieldName] = $fieldValue;
+ }
}
/**
* Determine a contact ID using a string expression
*
- * @param string $contactIdExpr e.g. "user_contact_id" or "@user:username"
+ * @param string $contactIdExpr
+ * E.g. "user_contact_id" or "@user:username".
* @return int|NULL|'unknown-user'
*/
-function _civicrm_api3_resolve_contactID($contactIdExpr) {
+function _civicrm_api3_resolve_contactID($contactIdExpr) {
//if value = 'user_contact_id' replace value with logged in user id
if ($contactIdExpr == "user_contact_id") {
return CRM_Core_Session::getLoggedInContactID();
* @throws API_Exception
*/
function _civicrm_api3_validate_html(&$params, &$fieldName, $fieldInfo) {
- if ($value = CRM_Utils_Array::value($fieldName, $params)) {
- if (!CRM_Utils_Rule::xssString($value)) {
- throw new API_Exception(ts('Illegal characters in input (potential scripting attack)'), array("field"=>$fieldName,"error_code"=>"xss"));
+ list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
+ if (strpos($op, 'NULL') || strpos($op, 'EMPTY')) {
+ return;
+ }
+ if ($fieldValue) {
+ if (!CRM_Utils_Rule::xssString($fieldValue)) {
+ throw new API_Exception('Illegal characters in input (potential scripting attack)', array("field" => $fieldName, "error_code" => "xss"));
}
}
}
/**
* Validate string fields being passed into API.
- * @param array $params params from civicrm_api
- * @param string $fieldName uniquename of field being checked
- * @param array $fieldInfo array of fields from getfields function
+ * @param array $params
+ * Params from civicrm_api.
+ * @param string $fieldName
+ * Uniquename of field being checked.
+ * @param array $fieldInfo
+ * Array of fields from getfields function.
* @param string $entity
* @throws API_Exception
* @throws Exception
*/
function _civicrm_api3_validate_string(&$params, &$fieldName, &$fieldInfo, $entity) {
- // If fieldname exists in params
- $value = CRM_Utils_Array::value($fieldName, $params, '');
- if(!is_array($value)){
- $value = (string) $value;
+ list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
+ if (strpos($op, 'NULL') !== FALSE || strpos($op, 'EMPTY') !== FALSE || CRM_Utils_System::isNull($fieldValue)) {
+ return;
+ }
+
+ if (!is_array($fieldValue)) {
+ $fieldValue = (string) $fieldValue;
}
- else{
+ else {
//@todo what do we do about passed in arrays. For many of these fields
// the missing piece of functionality is separating them to a separated string
// & many save incorrectly. But can we change them wholesale?
}
- if ($value ) {
- if (!CRM_Utils_Rule::xssString($value)) {
- throw new Exception(ts('Illegal characters in input (potential scripting attack)'));
- }
- if ($fieldName == 'currency') {
- if (!CRM_Utils_Rule::currencyCode($value)) {
- throw new Exception("Currency not a valid code: $value");
+ if ($fieldValue) {
+ foreach ((array) $fieldValue as $value) {
+ if (!CRM_Utils_Rule::xssString($fieldValue)) {
+ throw new Exception('Illegal characters in input (potential scripting attack)');
+ }
+ if ($fieldName == 'currency') {
+ //When using IN operator $fieldValue is a array of currency codes
+ if (!CRM_Utils_Rule::currencyCode($value)) {
+ throw new Exception("Currency not a valid code: $currency");
+ }
}
}
- if (!empty($fieldInfo['pseudoconstant']) || !empty($fieldInfo['options'])) {
- _civicrm_api3_api_match_pseudoconstant($params, $entity, $fieldName, $fieldInfo);
- }
- // Check our field length
- elseif (is_string($value) && !empty($fieldInfo['maxlength']) && strlen(utf8_decode($value)) > $fieldInfo['maxlength']) {
- throw new API_Exception("Value for $fieldName is " . strlen(utf8_decode($value)) . " characters - This field has a maxlength of {$fieldInfo['maxlength']} characters.",
- 2100, array('field' => $fieldName)
- );
- }
+ }
+ if (!empty($fieldInfo['pseudoconstant']) || !empty($fieldInfo['options'])) {
+ _civicrm_api3_api_match_pseudoconstant($fieldValue, $entity, $fieldName, $fieldInfo);
+ }
+ // Check our field length
+ elseif (is_string($fieldValue) && !empty($fieldInfo['maxlength']) && strlen(utf8_decode($fieldValue)) > $fieldInfo['maxlength']) {
+ throw new API_Exception("Value for $fieldName is " . strlen(utf8_decode($value)) . " characters - This field has a maxlength of {$fieldInfo['maxlength']} characters.",
+ 2100, array('field' => $fieldName)
+ );
+ }
+
+ if (!empty($op)) {
+ $params[$fieldName][$op] = $fieldValue;
+ }
+ else {
+ $params[$fieldName] = $fieldValue;
}
}
/**
* Validate & swap out any pseudoconstants / options
*
- * @param array $params: api parameters
- * @param string $entity: api entity name
- * @param string $fieldName: field name used in api call (not necessarily the canonical name)
- * @param array $fieldInfo: getfields meta-data
+ * @param mixed $fieldValue
+ * @param string $entity : api entity name
+ * @param string $fieldName : field name used in api call (not necessarily the canonical name)
+ * @param array $fieldInfo : getfields meta-data
+ * @throws \API_Exception
*/
-function _civicrm_api3_api_match_pseudoconstant(&$params, $entity, $fieldName, $fieldInfo) {
+function _civicrm_api3_api_match_pseudoconstant(&$fieldValue, $entity, $fieldName, $fieldInfo) {
$options = CRM_Utils_Array::value('options', $fieldInfo);
+
if (!$options) {
- if(strtolower($entity) == 'profile' && !empty($fieldInfo['entity'])) {
+ if (strtolower($entity) == 'profile' && !empty($fieldInfo['entity'])) {
// we need to get the options from the entity the field relates to
$entity = $fieldInfo['entity'];
}
// If passed a value-separated string, explode to an array, then re-implode after matching values
$implode = FALSE;
- if (is_string($params[$fieldName]) && strpos($params[$fieldName], CRM_Core_DAO::VALUE_SEPARATOR) !== FALSE) {
- $params[$fieldName] = CRM_Utils_Array::explodePadded($params[$fieldName]);
+ if (is_string($fieldValue) && strpos($fieldValue, CRM_Core_DAO::VALUE_SEPARATOR) !== FALSE) {
+ $fieldValue = CRM_Utils_Array::explodePadded($fieldValue);
$implode = TRUE;
}
// If passed multiple options, validate each
- if (is_array($params[$fieldName])) {
- foreach ($params[$fieldName] as &$value) {
+ if (is_array($fieldValue)) {
+ foreach ($fieldValue as &$value) {
if (!is_array($value)) {
_civicrm_api3_api_match_pseudoconstant_value($value, $options, $fieldName);
}
// need to verify that this is safe and doesn't break anything though.
// Better yet would be to leave it as an array and ensure that every dao/bao can handle array input
if ($implode) {
- CRM_Utils_Array::implodePadded($params[$fieldName]);
+ CRM_Utils_Array::implodePadded($fieldValue);
}
}
else {
- _civicrm_api3_api_match_pseudoconstant_value($params[$fieldName], $options, $fieldName);
+ _civicrm_api3_api_match_pseudoconstant_value($fieldValue, $options, $fieldName);
}
}
/**
* Validate & swap a single option value for a field
*
- * @param string $value: field value
- * @param array $options: array of options for this field
- * @param string $fieldName: field name used in api call (not necessarily the canonical name)
+ * @param string $value field value
+ * @param array $options array of options for this field
+ * @param string $fieldName field name used in api call (not necessarily the canonical name)
* @throws API_Exception
*/
function _civicrm_api3_api_match_pseudoconstant_value(&$value, $options, $fieldName) {
// If option is a key, no need to translate
- if (array_key_exists($value, $options)) {
+ // or if no options are avaiable for pseudoconstant 'table' property
+ if (array_key_exists($value, $options) || !$options) {
return;
}
/**
* 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)
+ * @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
+ * @return bool|string
+ * 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])) {
}
}
}
+
+/**
+ * In some case $params[$fieldName] holds Array value in this format Array([operator] => [value])
+ * So this function returns the actual field value
+ *
+ * @param array $params
+ * @param string $fieldName
+ * @return mixed
+ */
+function _civicrm_api3_field_value_check(&$params, $fieldName) {
+ $fieldValue = CRM_Utils_Array::value($fieldName, $params);
+ $op = NULL;
+
+ if (!empty($fieldValue) && is_array($fieldValue) && array_search(key($fieldValue), CRM_Core_DAO::acceptedSQLOperators())) {
+ $op = key($fieldValue);
+ $fieldValue = CRM_Utils_Array::value($op, $fieldValue);
+ }
+ return array($fieldValue, $op);
+}