CRM-13966 - Fix entityRef/getlist to work with non-id keys
[civicrm-core.git] / api / v3 / Generic / Getlist.php
CommitLineData
fe43b7c9
CW
1<?php
2
3/*
4 +--------------------------------------------------------------------+
5| CiviCRM version 4.4 |
6+--------------------------------------------------------------------+
7| Copyright CiviCRM LLC (c) 2004-2013 |
8+--------------------------------------------------------------------+
9| This file is a part of CiviCRM. |
10| |
11| CiviCRM is free software; you can copy, modify, and distribute it |
12| under the terms of the GNU Affero General Public License |
13| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14| |
15| CiviCRM is distributed in the hope that it will be useful, but |
16| WITHOUT ANY WARRANTY; without even the implied warranty of |
17| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
18| See the GNU Affero General Public License for more details. |
19| |
20| You should have received a copy of the GNU Affero General Public |
21| License and the CiviCRM Licensing Exception along |
22| with this program; if not, contact CiviCRM LLC |
23| at info[AT]civicrm[DOT]org. If you have questions about the |
24| GNU Affero General Public License or the licensing of CiviCRM, |
25| see the CiviCRM license FAQ at http://civicrm.org/licensing |
26+--------------------------------------------------------------------+
27*/
28/**
29 * Generic api wrapper used for quicksearch and autocomplete
30 *
31 * @param $apiRequest array
32 * @return mixed
33 */
34function civicrm_api3_generic_getList($apiRequest) {
35 $entity = _civicrm_api_get_entity_name_from_camel($apiRequest['entity']);
36 $request = $apiRequest['params'];
37
38 _civicrm_api3_generic_getList_defaults($entity, $request);
39
40 // Hey api, would you like to format the search params?
41 $fnName = "_civicrm_api3_{$entity}_getlist_params";
42 $fnName = function_exists($fnName) ? $fnName : '_civicrm_api3_generic_getlist_params';
43 $fnName($request);
79ae07d9
CW
44
45 $request['params']['check_permissions'] = !empty($apiRequest['params']['check_permissions']);
fe43b7c9
CW
46 $result = civicrm_api3($entity, 'get', $request['params']);
47
48 // Hey api, would you like to format the output?
49 $fnName = "_civicrm_api3_{$entity}_getlist_output";
50 $fnName = function_exists($fnName) ? $fnName : '_civicrm_api3_generic_getlist_output';
51 $values = $fnName($result, $request);
52
53 $output = array(
54 // If we have an extra result then this is not the last page
55 'more_results' => isset($values[10]),
56 'page_num' => $request['page_num'],
57 );
58 unset($values[10]);
59
60 return civicrm_api3_create_success($values, $request['params'], $entity, 'getlist', CRM_Core_DAO::$_nullObject, $output);
61}
62
63/**
64 * Set defaults for api.getlist
65 *
66 * @param $entity string
67 * @param $request array
68 */
69function _civicrm_api3_generic_getList_defaults($entity, &$request) {
70 $config = CRM_Core_Config::singleton();
71 $fields = _civicrm_api_get_fields($entity);
72 $defaults = array(
73 'page_num' => 1,
74 'input' => '',
75 'image_field' => NULL,
0724132d 76 'id_field' => $entity == 'option_value' ? 'value' : 'id',
fe43b7c9
CW
77 'params' => array(),
78 );
79 // Find main field from meta
80 foreach (array('sort_name', 'title', 'label', 'name') as $field) {
81 if (isset($fields[$field])) {
82 $defaults['label_field'] = $defaults['search_field'] = $field;
83 break;
84 }
85 }
86 foreach (array('description') as $field) {
87 if (isset($fields[$field])) {
88 $defaults['description_field'] = $field;
89 break;
90 }
91 }
92 $resultsPerPage = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'search_autocomplete_count', NULL, 10);
93 $request += $defaults;
94 // Default api params
95 $params = array(
96 'options' => array(
97 // Adding one extra result allows us to see if there are any more
98 'limit' => $resultsPerPage + 1,
99 // Because sql is zero-based
100 'offset' => ($request['page_num'] - 1) * $resultsPerPage,
101 'sort' => $request['label_field'],
102 ),
103 'sequential' => 1,
104 );
76ec9ca7 105 // When searching e.g. autocomplete
fe43b7c9
CW
106 if ($request['input']) {
107 $params[$request['search_field']] = array('LIKE' => ($config->includeWildCardInName ? '%' : '') . $request['input'] . '%');
108 }
76ec9ca7
CW
109 // When looking up a field e.g. displaying existing record
110 if (!empty($request['id'])) {
111 if (is_string($request['id']) && strpos(',', $request['id'])) {
112 $request['id'] = explode(',', $request['id']);
113 }
114 $params[$request['id_field']] = is_array($request['id']) ? array('IN' => $request['id']) : $request['id'];
115 }
fe43b7c9
CW
116 $request['params'] += $params;
117}
118
119/**
120 * Fallback implementation of getlist_params. May be overridden by individual apis
121 *
122 * @param $request array
123 */
124function _civicrm_api3_generic_getlist_params(&$request) {
76ec9ca7 125 $fieldsToReturn = array($request['id_field'], $request['label_field']);
ff88d165
CW
126 if (!empty($request['image_field'])) {
127 $fieldsToReturn[] = $request['image_field'];
128 }
129 if (!empty($request['description_field'])) {
130 $fieldsToReturn[] = $request['description_field'];
131 }
3a9e5e69 132 $request['params']['return'] = $fieldsToReturn;
fe43b7c9
CW
133}
134
135/**
136 * Fallback implementation of getlist_output. May be overridden by individual apis
137 *
138 * @param $result array
139 * @param $request array
140 *
141 * @return array
142 */
143function _civicrm_api3_generic_getlist_output($result, $request) {
144 $output = array();
145 if (!empty($result['values'])) {
146 foreach ($result['values'] as $row) {
ff88d165 147 $data = array(
76ec9ca7 148 'id' => $row[$request['id_field']],
fe43b7c9 149 'label' => $row[$request['label_field']],
fe43b7c9 150 );
ff88d165
CW
151 if (!empty($request['description_field'])) {
152 $data['description'] = isset($row[$request['description_field']]) ? $row[$request['description_field']] : '';
153 };
154 if (!empty($request['image_field'])) {
155 $data['image'] = isset($row[$request['image_field']]) ? $row[$request['image_field']] : '';
156 };
157 $output[] = $data;
fe43b7c9
CW
158 }
159 }
160 return $output;
161}