From e2747b5959ab5fc36d51fdd7c6a5d9eb1450e8a7 Mon Sep 17 00:00:00 2001 From: eileen Date: Tue, 19 Mar 2013 07:51:26 +1300 Subject: [PATCH] CRM-12144 revert changes to prevent regression (keep the gremlins you know --- api/v3/Generic/Update.php | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/api/v3/Generic/Update.php b/api/v3/Generic/Update.php index 636a5cc5f9..9975de71e5 100644 --- a/api/v3/Generic/Update.php +++ b/api/v3/Generic/Update.php @@ -2,10 +2,14 @@ // $Id$ /** - * Our original intention was not to have an update action. However, we wound up having - * to retain it for backward compatibility. The only difference between update and create - * is that update will throw an error if id is not a number - * CRM-10908 + * Update function is basically a hack to get around issues listed in + * http://issues.civicrm.org/jira/browse/CRM-12144 + * + * It is not recommended & if update doesn't work & fix does then update will not be fixed + * + * To do this, perform a 'get' action to load the existing values, then merge in the updates + * and call 'create' to save the revised entity. + * * @param $apiRequest an array with keys: * - entity: string * - action: string @@ -14,12 +18,27 @@ * - params: array, varies */ function civicrm_api3_generic_update($apiRequest) { + $errorFnName = 'civicrm_api3_create_error'; - if (!array_key_exists('id', $apiRequest['params']) || - empty($apiRequest['params']['id']) || - !is_numeric($apiRequest['params']['id'])) { - throw new api_Exception("Mandatory parameter missing `id`", 2000); + //$key_id = strtolower ($apiRequest['entity'])."_id"; + $key_id = "id"; + if (!array_key_exists($key_id, $apiRequest['params'])) { + return $errorFnName("Mandatory parameter missing $key_id"); } - return civicrm_api($apiRequest['entity'], 'create', $apiRequest['params']); + $seek = array($key_id => $apiRequest['params'][$key_id], 'version' => $apiRequest['version']); + $existing = civicrm_api($apiRequest['entity'], 'get', $seek); + if ($existing['is_error']) { + return $existing; + } + if ($existing['count'] > 1) { + return $errorFnName("More than one " . $apiRequest['entity'] . " with id " . $apiRequest['params'][$key_id]); + } + if ($existing['count'] == 0) { + return $errorFnName("No " . $apiRequest['entity'] . " with id " . $apiRequest['params'][$key_id]); + } + + $existing = array_pop($existing['values']); + $p = array_merge($existing, $apiRequest['params']); + return civicrm_api($apiRequest['entity'], 'create', $p); } -- 2.25.1