$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) : [];
$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]);
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,
- ];
}
/**
}
}
}
- };
+ }
if (!empty($request['image_field'])) {
$data['image'] = $row[$request['image_field']] ?? '';
}