From f0b90b06069b152ae94b58d40d5c5cdb9aa42051 Mon Sep 17 00:00:00 2001 From: CiviCRM Date: Sat, 14 Sep 2019 23:48:43 -0400 Subject: [PATCH] api4 - Add civicrm_api4() and CRM.api4() entry-points --- api/api.php | 42 ++++++++++++++++++++++++++++++++++++++++++ js/crm.ajax.js | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/api/api.php b/api/api.php index 5d67281e45..43f2d735c7 100644 --- a/api/api.php +++ b/api/api.php @@ -23,6 +23,48 @@ function civicrm_api($entity, $action, $params, $extra = NULL) { return \Civi::service('civi_api_kernel')->runSafe($entity, $action, $params, $extra); } +/** + * Procedural wrapper for the OO api version 4. + * + * @param string $entity + * @param string $action + * @param array $params + * @param string|int $index + * If $index is a string, the results array will be indexed by that key. + * If $index is an integer, only the result at that index will be returned. + * + * @return \Civi\Api4\Generic\Result + * @throws \API_Exception + * @throws \Civi\API\Exception\NotImplementedException + */ +function civicrm_api4($entity, $action, $params = [], $index = NULL) { + $apiCall = \Civi\Api4\Utils\ActionUtil::getAction($entity, $action); + foreach ($params as $name => $param) { + $setter = 'set' . ucfirst($name); + $apiCall->$setter($param); + } + $result = $apiCall->execute(); + + // Index results by key + if ($index && is_string($index) && !CRM_Utils_Rule::integer($index)) { + $result->indexBy($index); + } + // Return result at index + if (CRM_Utils_Rule::integer($index)) { + $item = $result->itemAt($index); + if (is_null($item)) { + throw new \API_Exception("Index $index not found in api results"); + } + // Attempt to return a Result object if item is array, otherwise just return the item + if (!is_array($item)) { + return $item; + } + $result->exchangeArray($item); + + } + return $result; +} + /** * Version 3 wrapper for civicrm_api. * diff --git a/js/crm.ajax.js b/js/crm.ajax.js index b64f33eec2..e3ff56d1a6 100644 --- a/js/crm.ajax.js +++ b/js/crm.ajax.js @@ -45,6 +45,47 @@ }); }; + // result is an array, but in js, an array is also an object + // Assign all the metadata properties to it, mirroring the results arrayObject in php + function arrayObject(data) { + var result = data.values || []; + if (_.isArray(result)) { + delete(data.values); + _.assign(result, data); + } + return result; + } + + CRM.api4 = function(entity, action, params, index) { + return new Promise(function(resolve, reject) { + if (typeof entity === 'string') { + $.post(CRM.url('civicrm/ajax/api4/' + entity + '/' + action), { + params: JSON.stringify(params), + index: index + }) + .done(function (data) { + resolve(arrayObject(data)); + }) + .fail(function (data) { + reject(data.responseJSON); + }); + } else { + $.post(CRM.url('civicrm/ajax/api4'), { + calls: JSON.stringify(entity) + }) + .done(function(data) { + _.each(data, function(item, key) { + data[key] = arrayObject(item); + }); + resolve(data); + }) + .fail(function (data) { + reject(data.responseJSON); + }); + } + }); + }; + /** * AJAX api * @link http://wiki.civicrm.org/confluence/display/CRMDOC/AJAX+Interface#AJAXInterface-CRM.api3 -- 2.25.1