CRM-14093 - add CRM.api3 to rest.js
authorColeman Watts <coleman@civicrm.org>
Mon, 20 Jan 2014 00:12:43 +0000 (16:12 -0800)
committerColeman Watts <coleman@civicrm.org>
Mon, 20 Jan 2014 04:29:01 +0000 (20:29 -0800)
CRM/Utils/REST.php
js/rest.js

index d09596fe1e6429e91aa9073efd0608e18e8de994..61bccf549e8a6b5606cb5cbc0222cf2ba7348257 100644 (file)
@@ -301,12 +301,10 @@ class CRM_Utils_REST {
       return self::error("User API key invalid");
     }
 
-    return self::process($args);
+    return self::process($args, self::buildParamList());
   }
 
-  static function process(&$args, $restInterface = TRUE) {
-    $params = &self::buildParamList();
-
+  static function process(&$args, $params) {
     $params['check_permissions'] = TRUE;
     $fnName = $apiFile = NULL;
     // clean up all function / class names. they should be alphanumeric and _ only
@@ -542,7 +540,7 @@ class CRM_Utils_REST {
       )
     ) {
       require_once 'api/v3/utils.php';
-      $error = civicrm_api3_create_error("SECURITY ALERT: Ajax requests can only be issued by javascript clients, eg. CRM.api().",
+      $error = civicrm_api3_create_error("SECURITY ALERT: Ajax requests can only be issued by javascript clients, eg. CRM.api3().",
         array(
           'IP' => $_SERVER['REMOTE_ADDR'],
           'level' => 'security',
@@ -577,13 +575,36 @@ class CRM_Utils_REST {
       return self::error('Unknown function invocation.');
     }
 
-    $result = self::process($args, FALSE);
+    // Support for multiple api calls
+    if (isset($entity) && $entity === 'api3') {
+      $result = self::processMultiple();
+    }
+    else {
+      $result = self::process($args, self::buildParamList());
+    }
 
     echo self::output($result);
 
     CRM_Utils_System::civiExit();
   }
 
+  /**
+   * Callback for multiple ajax api calls from CRM.api3()
+   * @return array
+   */
+  static function processMultiple() {
+    $output = array();
+    foreach (json_decode($_REQUEST['json'], TRUE) as $key => $call) {
+      $args = array(
+        'civicrm',
+        $call[0],
+        $call[1],
+      );
+      $output[$key] = self::process($args, CRM_Utils_Array::value(2, $call, array()));
+    }
+    return $output;
+  }
+
   /**
    * @return array|NULL NULL if execution should proceed; array if the response is already known
    */
index 434dcdf312ef63172d04cb2bc6f200f052c9c80f..6a359141610a5421e40195b881ee83cf0c1b7d7f 100644 (file)
@@ -84,6 +84,32 @@ var CRM = CRM || {};
   /**
    * AJAX api
    */
+  CRM.api3 = function(entity, action, params) {
+    if (typeof(entity) === 'string') {
+      params = {
+        entity: entity,
+        action: action.toLowerCase(),
+        json: JSON.stringify(params || {})
+      };
+    } else {
+      params = {
+        entity: 'api3',
+        action: 'call',
+        json: JSON.stringify(entity)
+      }
+    }
+    return $.ajax({
+      url: CRM.url('civicrm/ajax/rest'),
+      dataType: 'json',
+      data: params,
+      type: params.action.indexOf('get') < 0 ? 'POST' : 'GET'
+    });
+  };
+
+  /**
+   * @deprecated
+   * AJAX api
+   */
   CRM.api = function(entity, action, params, options) {
     // Default settings
     var settings = {