civicrm_api3_create_error, api/v3/Generic/Update - Remove unnecessary indirection
[civicrm-core.git] / api / v3 / Generic / Getlist.php
index c3388f94717323c83d4dd5d23bcf9a58617bec79..6cc49431286e687e37e202dc85122487536d2e8a 100644 (file)
@@ -41,7 +41,8 @@ function civicrm_api3_generic_getList($apiRequest) {
   $fnName = "_civicrm_api3_{$entity}_getlist_params";
   $fnName = function_exists($fnName) ? $fnName : '_civicrm_api3_generic_getlist_params';
   $fnName($request);
-  
+
+  $request['params']['check_permissions'] = !empty($apiRequest['params']['check_permissions']);
   $result = civicrm_api3($entity, 'get', $request['params']);
 
   // Hey api, would you like to format the output?
@@ -49,12 +50,15 @@ function civicrm_api3_generic_getList($apiRequest) {
   $fnName = function_exists($fnName) ? $fnName : '_civicrm_api3_generic_getlist_output';
   $values = $fnName($result, $request);
 
-  $output = array(
+  $output = array('page_num' => $request['page_num']);
+
+  // Limit is set for searching but not fetching by id
+  if (!empty($request['params']['options']['limit'])) {
     // If we have an extra result then this is not the last page
-    'more_results' => isset($values[10]),
-    'page_num' => $request['page_num'],
-  );
-  unset($values[10]);
+    $last = $request['params']['options']['limit'] - 1;
+    $output['more_results'] = isset($values[$last]);
+    unset($values[$last]);
+  }
 
   return civicrm_api3_create_success($values, $request['params'], $entity, 'getlist', CRM_Core_DAO::$_nullObject, $output);
 }
@@ -72,8 +76,10 @@ function _civicrm_api3_generic_getList_defaults($entity, &$request) {
     'page_num' => 1,
     'input' => '',
     'image_field' => NULL,
-    'id_field' => 'id',
+    'id_field' => $entity == 'option_value' ? 'value' : 'id',
+    'description_field' => array(),
     'params' => array(),
+    'extra' => array(),
   );
   // Find main field from meta
   foreach (array('sort_name', 'title', 'label', 'name') as $field) {
@@ -82,10 +88,10 @@ function _civicrm_api3_generic_getList_defaults($entity, &$request) {
       break;
     }
   }
+  // Find fields to be used for the description
   foreach (array('description') as $field) {
     if (isset($fields[$field])) {
-      $defaults['description_field'] = $field;
-      break;
+      $defaults['description_field'][] = $field;
     }
   }
   $resultsPerPage = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'search_autocomplete_count', NULL, 10);
@@ -110,6 +116,8 @@ function _civicrm_api3_generic_getList_defaults($entity, &$request) {
     if (is_string($request['id']) && strpos(',', $request['id'])) {
       $request['id'] = explode(',', $request['id']);
     }
+    // Don't run into search limits when prefilling selection
+    unset($params['options']['limit'], $params['options']['offset'], $request['params']['options']['limit'], $request['params']['options']['offset']);
     $params[$request['id_field']] = is_array($request['id']) ? array('IN' => $request['id']) : $request['id'];
   }
   $request['params'] += $params;
@@ -126,9 +134,9 @@ function _civicrm_api3_generic_getlist_params(&$request) {
     $fieldsToReturn[] = $request['image_field'];
   }
   if (!empty($request['description_field'])) {
-    $fieldsToReturn[] = $request['description_field'];
+    $fieldsToReturn = array_merge($fieldsToReturn, (array) $request['description_field']);
   }
-  $request['params']['return'] = $fieldsToReturn;
+  $request['params']['return'] = array_unique(array_merge($fieldsToReturn, $request['extra']));
 }
 
 /**
@@ -148,11 +156,19 @@ function _civicrm_api3_generic_getlist_output($result, $request) {
         'label' => $row[$request['label_field']],
       );
       if (!empty($request['description_field'])) {
-        $data['description'] = isset($row[$request['description_field']]) ? $row[$request['description_field']] : '';
+        $data['description'] = array();
+        foreach ((array) $request['description_field'] as $field) {
+          if (!empty($row[$field])) {
+            $data['description'][] = $row[$field];
+          }
+        }
       };
       if (!empty($request['image_field'])) {
         $data['image'] = isset($row[$request['image_field']]) ? $row[$request['image_field']] : '';
-      };
+      }
+      foreach ($request['extra'] as $field) {
+        $data['extra'][$field] = isset($row[$field]) ? $row[$field] : NULL;
+      }
       $output[] = $data;
     }
   }