<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.4 |
+ | CiviCRM version 4.5 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2013 |
+ | Copyright CiviCRM LLC (c) 2004-2014 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
* @package CiviCRM_APIv3
* @subpackage API_utils
*
- * @copyright CiviCRM LLC (c) 2004-2013
+ * @copyright CiviCRM LLC (c) 2004-2014
* @version $Id: utils.php 30879 2010-11-22 15:45:55Z shot $
*
*/
/**
* 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 $params array of fields to checkl
* @param array $daoName string DAO to check for required fields (create functions only)
* @param array $keyoptions
*
*
* @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) {
+function civicrm_api3_verify_mandatory($params, $daoName = NULL, $keys = array(), $verifyDAO = TRUE) {
$unmatched = array();
if ($daoName != NULL && $verifyDAO && empty($params['id'])) {
*
* @param <type> $data
* @param array $data
- * @param object $dao DAO / BAO object to be freed here
+ * @param array $dao (misnomer) apiRequest which led to this error (with keys "entity", "action", etc)
*
* @throws API_Exception
* @return array <type>
*/
function civicrm_api3_create_error($msg, $data = array(), &$dao = NULL) {
- //fix me - $dao should be param 4 & 3 should be $apiRequest
- if (is_object($dao)) {
- $dao->free();
- }
-
if (is_array($dao)) {
if ($msg == 'DB Error: constraint violation' || substr($msg, 0,9) == 'DB Error:' || $msg == 'DB Error: already exists') {
try {
// we will show sql to privelledged 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')) {
- $data['debug_information'] = $data['sql'];
+ $data['debug_information'] = $data['sql']; // Isn't this redundant?
+ } else {
+ unset($data['sql']);
}
- if (is_array($dao) && isset($dao['params']) && is_array($dao['params']) && CRM_Utils_Array::value('api.has_parent', $dao['params'])) {
+ if (is_array($dao) && isset($dao['params']) && is_array($dao['params']) && !empty($dao['params']['api.has_parent'])) {
$errorCode = empty($data['error_code']) ? 'chained_api_failed' : $data['error_code'];
throw new API_Exception('Error in call to ' . $dao['entity'] . '_' . $dao['action'] . ' : ' . $msg, $errorCode, $data);
}
*
* @return array $result
*/
-function civicrm_api3_create_success($values = 1, $params = array(
- ), $entity = NULL, $action = NULL, &$dao = NULL, $extraReturnValues = array()) {
+function civicrm_api3_create_success($values = 1, $params = array(), $entity = NULL, $action = NULL, &$dao = NULL, $extraReturnValues = array()) {
$result = array();
$result['is_error'] = 0;
//lets set the ['id'] field if it's not set & we know what the entity is
else {
$result['values'] = $values;
}
-
+ if(!empty($params['options']['metadata'])) {
+ // we've made metadata an array but only supporting 'fields' atm
+ if(in_array('fields', $params['options']['metadata'])) {
+ $fields = civicrm_api3($entity, 'getfields', array('action' => substr($action, 0, 3) == 'get' ? 'get' : 'create'));
+ $result['metadata']['fields'] = $fields['values'];
+ }
+ }
return array_merge($result, $extraReturnValues);
}
if ($name == 'Im' || $name == 'Acl') {
$name = strtoupper($name);
}
- return CRM_Core_DAO_AllCoreTables::getFullName($name);
+ $dao = CRM_Core_DAO_AllCoreTables::getFullName($name);
+ if ($dao || !$name) {
+ return $dao;
+ }
+
+ // Really weird apis can declare their own DAO name. Not sure if this is a good idea...
+ if(file_exists("api/v3/$name.php")) {
+ include_once "api/v3/$name.php";
+ }
+ $daoFn = "_civicrm_api3_" . _civicrm_api_get_entity_name_from_camel($name) . "_DAO";
+ if (function_exists($daoFn)) {
+ return $daoFn();
+ }
+
+ return NULL;
}
/**
* 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
+ * 2 variants call
* @param $entity
* @param array $params as passed into api get or getcount function
* @param array $additional_options
}
}
- $skipPermissions = CRM_Utils_Array::value('check_permissions', $params)? 0 :1;
+ $skipPermissions = !empty($params['check_permissions']) ? 0 :1;
list($entities, $options) = CRM_Contact_BAO_Query::apiQuery(
$newParams,
return $entities;
}
+/**
+ * get dao query object based on input params
+ * Ideally this would be merged with _civicrm_get_using_query_object but we need to resolve differences in what the
+ * 2 variants call
+ *
+ * @param array $params
+ * @param string $mode
+ * @param string $entity
+ * @return CRM_Core_DAO query object
+ */
+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());
+ $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);
+ $query = new CRM_Contact_BAO_Query($newParams, $returnProperties, NULL,
+ FALSE, FALSE, $mode
+ );
+ list($select, $from, $where, $having) = $query->query();
+
+ $sql = "$select $from $where $having";
+
+ if (!empty($sort)) {
+ $sql .= " ORDER BY $sort ";
+ }
+ if(!empty($rowCount)) {
+ $sql .= " LIMIT $offset, $rowCount ";
+ }
+ $dao = CRM_Core_DAO::executeQuery($sql);
+ return array($dao, $query);
+}
+
/**
* Function transfers the filters being passed into the DAO onto the params object
*/
$dao->selectAdd($allfields[$uniqueVal]);
}
}
+ $dao->setApiFilter($params);
}
/**
}
}
if ($entity && $action =='get') {
- if (CRM_Utils_Array::value('id',$returnProperties)) {
+ if (!empty($returnProperties['id'])) {
$returnProperties[$entity . '_id'] = 1;
unset($returnProperties['id']);
}
$options = _civicrm_api3_get_options_from_params($params,FALSE,$entity);
if(!$options['is_count']) {
- $dao->limit((int)$options['offset'], (int)$options['limit']);
+ if(!empty($options['limit'])) {
+ $dao->limit((int)$options['offset'], (int)$options['limit']);
+ }
if (!empty($options['sort'])) {
$dao->orderBy($options['sort']);
}
function _civicrm_api3_build_fields_array(&$bao, $unique = TRUE) {
$fields = $bao->fields();
if ($unique) {
- if(!CRM_Utils_Array::value('id', $fields)){
+ if (empty($fields['id'])){
$entity = _civicrm_api_get_entity_name_from_dao($bao);
$fields['id'] = $fields[$entity . '_id'];
unset($fields[$entity . '_id']);
* @static void
* @access public
*/
-function _civicrm_api3_dao_to_array($dao, $params = NULL, $uniqueFields = TRUE, $entity = "") {
+function _civicrm_api3_dao_to_array($dao, $params = NULL, $uniqueFields = TRUE, $entity = "", $autoFind = TRUE) {
$result = array();
- if(isset($params['options']) && CRM_Utils_Array::value('is_count', $params['options'])) {
+ if(isset($params['options']) && !empty($params['options']['is_count'])) {
return $dao->count();
}
- if (empty($dao) || !$dao->find()) {
+ if (empty($dao)) {
+ return array();
+ }
+ if ($autoFind && !$dao->find()) {
return array();
}
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) && CRM_Utils_Array::value('return', $params) && is_array($params['return'])) {
+ if (!empty($entity) && !empty($params['return']) && is_array($params['return'])) {
foreach ($params['return'] as $return) {
if (substr($return, 0, 6) == 'custom') {
$custom = TRUE;
continue;
}
- if (CRM_Utils_Array::value('required', $v)) {
+ if (!empty($v['required'])) {
// 0 is a valid input for numbers, CRM-8122
if (!isset($params[$k]) || (empty($params[$k]) && !($params[$k] === 0))) {
$missing[] = $k;
*/
function _civicrm_api3_basic_get($bao_name, &$params, $returnAsSuccess = TRUE, $entity = "") {
$bao = new $bao_name();
- _civicrm_api3_dao_set_filter($bao, $params, TRUE,$entity);
+ _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);
+ 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);
// intensive checks - usually only called after DB level fail
if (!empty($errorMode) && strtolower($action) == 'create') {
- if (CRM_Utils_Array::value('FKClassName', $fieldInfo)) {
- if (CRM_Utils_Array::value($fieldName, $params)) {
+ if (!empty($fieldInfo['FKClassName'])) {
+ if (!empty($params[$fieldName])) {
_civicrm_api3_validate_constraint($params, $fieldName, $fieldInfo);
}
- elseif (CRM_Utils_Array::value('required', $fieldInfo)) {
+ elseif (!empty($fieldInfo['required'])) {
throw new Exception("DB Constraint Violation - possibly $fieldName should possibly be marked as mandatory for this API. If so, please raise a bug report");
}
}
- if (CRM_Utils_Array::value('api.unique', $fieldInfo)) {
+ if (!empty($fieldInfo['api.unique'])) {
$params['entity'] = $entity;
_civicrm_api3_validate_uniquekey($params, $fieldName, $fieldInfo);
}
*/
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 (CRM_Utils_Array::value($fieldInfo['name'], $params)) {
+ 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']]);
}
$params[$fieldInfo['name']] = CRM_Utils_Date::processDate($params[$fieldInfo['name']]);
}
- if ((CRM_Utils_Array::value('name', $fieldInfo) != $fieldName) && CRM_Utils_Array::value($fieldName, $params)) {
+ 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]);
*
* @return array
*/
-function _civicrm_api_get_fields($entity, $unique = FALSE, &$params = array(
- )) {
+function _civicrm_api_get_fields($entity, $unique = FALSE, &$params = array()) {
$unsetIfEmpty = array('dataPattern', 'headerPattern', 'default', 'export', 'import');
$dao = _civicrm_api3_get_DAO($entity);
if (empty($dao)) {
$required = array('version');
foreach ($fields as $field => $values) {
- if (CRM_Utils_Array::value('api.required', $values)) {
+ if (!empty($values['api.required'])) {
$required[] = $field;
}
}
function _civicrm_api3_swap_out_aliases(&$apiRequest, $fields) {
foreach ($fields as $field => $values) {
$uniqueName = CRM_Utils_Array::value('uniqueName', $values);
- if (CRM_Utils_Array::value('api.aliases', $values)) {
+ if (!empty($values['api.aliases'])) {
// if aliased field is not set we try to use field alias
if (!isset($apiRequest['params'][$field])) {
foreach ($values['api.aliases'] as $alias) {
}
}
}
- if (!isset($apiRequest['params'][$field])
- && CRM_Utils_Array::value('name', $values)
- && $field != $values['name']
+ if (!isset($apiRequest['params'][$field]) && !empty($values['name']) && $field != $values['name']
&& isset($apiRequest['params'][$values['name']])
) {
$apiRequest['params'][$field] = $apiRequest['params'][$values['name']];
*/
function _civicrm_api3_validate_integer(&$params, &$fieldName, &$fieldInfo, $entity) {
//if fieldname exists in params
- if (CRM_Utils_Array::value($fieldName, $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])) {
$realContactId = _civicrm_api3_resolve_contactID($params[$fieldName]);
}
// Check our field length
- if(is_string($params[$fieldName]) &&
- CRM_Utils_Array::value('maxlength',$fieldInfo)
- && strlen($params[$fieldName]) > $fieldInfo['maxlength']
+ 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'])
throw new Exception("Currency not a valid code: $value");
}
}
- if (!empty($fieldInfo['pseudoconstant']) || !empty($fieldInfo['options']) || !empty($fieldInfo['enumValues'])) {
+ if (!empty($fieldInfo['pseudoconstant']) || !empty($fieldInfo['options'])) {
_civicrm_api3_api_match_pseudoconstant($params, $entity, $fieldName, $fieldInfo);
}
// Check our field length