Merge pull request #19965 from eileenmcnaughton/mem_trxn
[civicrm-core.git] / api / v3 / Generic / Getlist.php
index f63948e27c2ce66b5e673aeb281d549dabbb2185..90278877f8deaf01ad0661fe0afb0437deda67e8 100644 (file)
@@ -26,6 +26,17 @@ function civicrm_api3_generic_getList($apiRequest) {
   $request = $apiRequest['params'];
   $meta = civicrm_api3_generic_getfields(['action' => 'get'] + $apiRequest, FALSE);
 
+  // If the user types an integer into the search
+  $forceIdSearch = empty($request['id']) && !empty($request['input']) && !empty($meta['id']) && CRM_Utils_Rule::positiveInteger($request['input']);
+  // Add an extra page of results for the record with an exact id match
+  if ($forceIdSearch) {
+    $request['page_num'] = ($request['page_num'] ?? 1) - 1;
+    if (empty($request['page_num'])) {
+      $request['id'] = $request['input'];
+      unset($request['input']);
+    }
+  }
+
   // Hey api, would you like to provide default values?
   $fnName = "_civicrm_api3_{$entity}_getlist_defaults";
   $defaults = function_exists($fnName) ? $fnName($request) : [];
@@ -73,8 +84,19 @@ function civicrm_api3_generic_getList($apiRequest) {
 
   $output = ['page_num' => $request['page_num']];
 
+  if ($forceIdSearch) {
+    $output['page_num']++;
+    // When returning the single record matching id
+    if (empty($request['page_num'])) {
+      $output['more_results'] = TRUE;
+      foreach ($values as $i => $value) {
+        $description = ts('ID: %1', [1 => $value['id']]);
+        $values[$i]['description'] = array_merge([$description], $value['description'] ?? []);
+      }
+    }
+  }
   // Limit is set for searching but not fetching by id
-  if (!empty($request['params']['options']['limit'])) {
+  elseif (!empty($request['params']['options']['limit'])) {
     // If we have an extra result then this is not the last page
     $last = $request['params']['options']['limit'] - 1;
     $output['more_results'] = isset($values[$last]);
@@ -131,26 +153,28 @@ function _civicrm_api3_generic_getList_defaults($entity, &$request, $apiDefaults
   if ($request['input']) {
     $params[$request['search_field']] = ['LIKE' => ($request['add_wildcard'] ? '%' : '') . $request['input'] . '%'];
   }
+  $request['params'] += $params;
+
   // When looking up a field e.g. displaying existing record
   if (!empty($request['id'])) {
     if (is_string($request['id']) && strpos($request['id'], ',')) {
       $request['id'] = explode(',', trim($request['id'], ', '));
     }
     // Don't run into search limits when prefilling selection
-    $params['options']['limit'] = NULL;
-    unset($params['options']['offset'], $request['params']['options']['limit'], $request['params']['options']['offset']);
-    $params[$request['id_field']] = is_array($request['id']) ? ['IN' => $request['id']] : $request['id'];
+    $request['params']['options']['limit'] = NULL;
+    unset($request['params']['options']['offset']);
+    $request['params'][$request['id_field']] = is_array($request['id']) ? ['IN' => $request['id']] : $request['id'];
+  }
+  else {
+    $request['params']['options'] += [
+      // Add pagination parameters
+      'sort' => $request['label_field'],
+      // Adding one extra result allows us to see if there are any more
+      'limit' => $resultsPerPage + 1,
+      // Because sql is zero-based
+      'offset' => ($request['page_num'] - 1) * $resultsPerPage,
+    ];
   }
-  $request['params'] += $params;
-
-  $request['params']['options'] += [
-    // Add pagination parameters
-    'sort' => $request['label_field'],
-    // Adding one extra result allows us to see if there are any more
-    'limit' => $resultsPerPage + 1,
-    // Because sql is zero-based
-    'offset' => ($request['page_num'] - 1) * $resultsPerPage,
-  ];
 }
 
 /**
@@ -206,7 +230,7 @@ function _civicrm_api3_generic_getlist_output($result, $request, $entity, $field
             }
           }
         }
-      };
+      }
       if (!empty($request['image_field'])) {
         $data['image'] = $row[$request['image_field']] ?? '';
       }