Merge pull request #17252 from civicrm/5.25
[civicrm-core.git] / CRM / Core / BAO / CustomOption.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
bc77d7c0 4 | Copyright CiviCRM LLC. All rights reserved. |
6a488035 5 | |
bc77d7c0
TO
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
6a488035 9 +--------------------------------------------------------------------+
d25dd0ee 10 */
6a488035
TO
11
12/**
13 *
14 * @package CRM
ca5cec67 15 * @copyright CiviCRM LLC https://civicrm.org/licensing
6a488035
TO
16 */
17
18/**
19 * Business objects for managing custom data options.
20 *
21 */
22class CRM_Core_BAO_CustomOption {
23
24 /**
fe482240 25 * Fetch object based on array of properties.
6a488035 26 *
6a0b768e
TO
27 * @param array $params
28 * (reference ) an assoc array of name/value pairs.
29 * @param array $defaults
30 * (reference ) an assoc array to hold the flattened values.
6a488035 31 *
16b10e64 32 * @return CRM_Core_BAO_CustomOption
6a488035 33 */
00be9182 34 public static function retrieve(&$params, &$defaults) {
6a488035
TO
35 $customOption = new CRM_Core_DAO_OptionValue();
36 $customOption->copyValues($params);
37 if ($customOption->find(TRUE)) {
38 CRM_Core_DAO::storeValues($customOption, $defaults);
39 return $customOption;
40 }
41 return NULL;
42 }
43
44 /**
fe482240 45 * Returns all active options ordered by weight for a given field.
6a488035 46 *
6a0b768e
TO
47 * @param int $fieldID
48 * Field whose options are needed.
317fceb4 49 * @param bool $inactiveNeeded Do we need inactive options ?.
6a0b768e 50 * Do we need inactive options ?.
6a488035 51 *
a6c01b45
CW
52 * @return array
53 * all active options for fieldId
6a488035 54 */
317fceb4 55 public static function getCustomOption(
6a488035
TO
56 $fieldID,
57 $inactiveNeeded = FALSE
58 ) {
be2fb01f 59 $options = [];
6a488035
TO
60 if (!$fieldID) {
61 return $options;
62 }
63
be2fb01f 64 $optionValues = CRM_Core_PseudoConstant::get('CRM_Core_BAO_CustomField', 'custom_' . $fieldID, [], $inactiveNeeded ? 'get' : 'create');
6a488035 65
e525d6af 66 foreach ((array) $optionValues as $value => $label) {
be2fb01f 67 $options[] = [
b4fb2d23
CW
68 'label' => $label,
69 'value' => $value,
be2fb01f 70 ];
6a488035
TO
71 }
72
6a488035
TO
73 return $options;
74 }
75
57c9c217 76 /**
09b6d7cd 77 * Wrapper for ajax option selector.
57c9c217 78 *
79 * @param array $params
80 * Associated array for params record id.
81 *
82 * @return array
83 * associated array of option list
84 * -rp = rowcount
85 * -page= offset
86 */
518fa0ee 87 public static function getOptionListSelector(&$params) {
be2fb01f 88 $options = [];
57c9c217 89
09b6d7cd
CW
90 $field = CRM_Core_BAO_CustomField::getFieldObject($params['fid']);
91 $defVal = CRM_Utils_Array::explodePadded($field->default_value);
57c9c217 92
93 // format the params
94 $params['offset'] = ($params['page'] - 1) * $params['rp'];
95 $params['rowCount'] = $params['rp'];
57c9c217 96
09b6d7cd 97 if (!$field->option_group_id) {
57c9c217 98 return $options;
99 }
be2fb01f 100 $queryParams = [1 => [$field->option_group_id, 'Integer']];
57c9c217 101 $total = "SELECT COUNT(*) FROM civicrm_option_value WHERE option_group_id = %1";
102 $params['total'] = CRM_Core_DAO::singleValueQuery($total, $queryParams);
103
104 $limit = " LIMIT {$params['offset']}, {$params['rowCount']} ";
57c9c217 105 $orderBy = ' ORDER BY options.weight asc';
57c9c217 106
107 $query = "SELECT * FROM civicrm_option_value as options WHERE option_group_id = %1 {$orderBy} {$limit}";
108 $dao = CRM_Core_DAO::executeQuery($query, $queryParams);
109 $links = CRM_Custom_Page_Option::actionLinks();
110
be2fb01f 111 $fields = ['id', 'label', 'value'];
57c9c217 112 $config = CRM_Core_Config::singleton();
113 while ($dao->fetch()) {
be2fb01f 114 $options[$dao->id] = [];
57c9c217 115 foreach ($fields as $k) {
116 $options[$dao->id][$k] = $dao->$k;
117 }
118 $action = array_sum(array_keys($links));
119 $class = 'crm-entity';
120 // update enable/disable links depending on custom_field properties.
121 if ($dao->is_active) {
122 $action -= CRM_Core_Action::ENABLE;
123 }
124 else {
125 $class .= ' disabled';
126 $action -= CRM_Core_Action::DISABLE;
127 }
87660a87
MD
128
129 $isGroupLocked = (bool) CRM_Core_DAO::getFieldValue(
130 CRM_Core_DAO_OptionGroup::class,
131 $field->option_group_id,
132 'is_locked'
133 );
134
135 // disable deletion of option values for locked option groups
218d9fd2 136 if (($action & CRM_Core_Action::DELETE) && $isGroupLocked) {
87660a87
MD
137 $action -= CRM_Core_Action::DELETE;
138 }
139
6cc845ad 140 if (in_array($field->html_type, ['CheckBox', 'Multi-Select'])) {
614ff00e 141 if (isset($defVal) && in_array($dao->value, $defVal)) {
57c9c217 142 $options[$dao->id]['is_default'] = '<img src="' . $config->resourceBase . 'i/check.gif" />';
143 }
144 else {
145 $options[$dao->id]['is_default'] = '';
146 }
147 }
148 else {
09b6d7cd 149 if ($field->default_value == $dao->value) {
57c9c217 150 $options[$dao->id]['is_default'] = '<img src="' . $config->resourceBase . 'i/check.gif" />';
151 }
152 else {
153 $options[$dao->id]['is_default'] = '';
154 }
155 }
4247b886 156 $options[$dao->id]['description'] = $dao->description;
57c9c217 157 $options[$dao->id]['class'] = $dao->id . ',' . $class;
09b6d7cd 158 $options[$dao->id]['is_active'] = empty($dao->is_active) ? ts('No') : ts('Yes');
57c9c217 159 $options[$dao->id]['links'] = CRM_Core_Action::formLink($links,
160 $action,
be2fb01f 161 [
57c9c217 162 'id' => $dao->id,
163 'fid' => $params['fid'],
164 'gid' => $params['gid'],
be2fb01f 165 ],
57c9c217 166 ts('more'),
167 FALSE,
168 'customOption.row.actions',
169 'customOption',
170 $dao->id
171 );
172 }
57c9c217 173
174 return $options;
175 }
176
6a488035 177 /**
fe482240 178 * Delete Option.
6a488035 179 *
16b10e64
CW
180 * @param $optionId integer
181 * option id
6a488035 182 *
6a488035 183 */
00be9182 184 public static function del($optionId) {
6a488035
TO
185 // get the customFieldID
186 $query = "
187SELECT f.id as id, f.data_type as dataType
188FROM civicrm_option_value v,
189 civicrm_option_group g,
190 civicrm_custom_field f
191WHERE v.id = %1
192AND g.id = f.option_group_id
193AND g.id = v.option_group_id";
be2fb01f 194 $params = [1 => [$optionId, 'Integer']];
6a488035
TO
195 $dao = CRM_Core_DAO::executeQuery($query, $params);
196 if ($dao->fetch()) {
197 if (in_array($dao->dataType,
be2fb01f 198 ['Int', 'Float', 'Money', 'Boolean']
353ffa53 199 )) {
6a488035
TO
200 $value = 0;
201 }
202 else {
203 $value = '';
204 }
be2fb01f 205 $params = [
6a488035
TO
206 'optionId' => $optionId,
207 'fieldId' => $dao->id,
208 'value' => $value,
be2fb01f 209 ];
6a488035
TO
210 // delete this value from the tables
211 self::updateCustomValues($params);
212
213 // also delete this option value
214 $query = "
215DELETE
216FROM civicrm_option_value
217WHERE id = %1";
be2fb01f 218 $params = [1 => [$optionId, 'Integer']];
6a488035
TO
219 CRM_Core_DAO::executeQuery($query, $params);
220 }
221 }
222
b5c2afd0 223 /**
c490a46a 224 * @param array $params
b5c2afd0
EM
225 *
226 * @throws Exception
227 */
00be9182 228 public static function updateCustomValues($params) {
6a488035
TO
229 $optionDAO = new CRM_Core_DAO_OptionValue();
230 $optionDAO->id = $params['optionId'];
231 $optionDAO->find(TRUE);
232 $oldValue = $optionDAO->value;
233
234 // get the table, column, html_type and data type for this field
235 $query = "
236SELECT g.table_name as tableName ,
237 f.column_name as columnName,
238 f.data_type as dataType,
239 f.html_type as htmlType
240FROM civicrm_custom_group g,
241 civicrm_custom_field f
242WHERE f.custom_group_id = g.id
243 AND f.id = %1";
be2fb01f 244 $queryParams = [1 => [$params['fieldId'], 'Integer']];
6a488035
TO
245 $dao = CRM_Core_DAO::executeQuery($query, $queryParams);
246 if ($dao->fetch()) {
247 if ($dao->dataType == 'Money') {
248 $params['value'] = CRM_Utils_Rule::cleanMoney($params['value']);
249 }
250 switch ($dao->htmlType) {
251 case 'Autocomplete-Select':
252 case 'Select':
253 case 'Radio':
254 $query = "
255UPDATE {$dao->tableName}
256SET {$dao->columnName} = %1
257WHERE id = %2";
258 if ($dao->dataType == 'Auto-complete') {
259 $dataType = "String";
260 }
261 else {
262 $dataType = $dao->dataType;
263 }
be2fb01f
CW
264 $queryParams = [
265 1 => [
353ffa53 266 $params['value'],
6a488035 267 $dataType,
be2fb01f
CW
268 ],
269 2 => [
6a488035
TO
270 $params['optionId'],
271 'Integer',
be2fb01f
CW
272 ],
273 ];
6a488035
TO
274 break;
275
6a488035
TO
276 case 'Multi-Select':
277 case 'CheckBox':
278 $oldString = CRM_Core_DAO::VALUE_SEPARATOR . $oldValue . CRM_Core_DAO::VALUE_SEPARATOR;
279 $newString = CRM_Core_DAO::VALUE_SEPARATOR . $params['value'] . CRM_Core_DAO::VALUE_SEPARATOR;
353ffa53 280 $query = "
6a488035
TO
281UPDATE {$dao->tableName}
282SET {$dao->columnName} = REPLACE( {$dao->columnName}, %1, %2 )";
be2fb01f
CW
283 $queryParams = [
284 1 => [$oldString, 'String'],
285 2 => [$newString, 'String'],
286 ];
6a488035
TO
287 break;
288
289 default:
290 CRM_Core_Error::fatal();
291 }
292 $dao = CRM_Core_DAO::executeQuery($query, $queryParams);
293 }
294 }
295
58eaa092
CW
296 /**
297 * When changing the value of an option this is called to update all corresponding custom data
298 *
299 * @param int $optionId
300 * @param string $newValue
301 */
302 public static function updateValue($optionId, $newValue) {
303 $optionValue = new CRM_Core_DAO_OptionValue();
304 $optionValue->id = $optionId;
305 $optionValue->find(TRUE);
306 $oldValue = $optionValue->value;
307 if ($oldValue == $newValue) {
308 return;
309 }
310
311 $customField = new CRM_Core_DAO_CustomField();
312 $customField->option_group_id = $optionValue->option_group_id;
313 $customField->find();
314 while ($customField->fetch()) {
315 $customGroup = new CRM_Core_DAO_CustomGroup();
316 $customGroup->id = $customField->custom_group_id;
317 $customGroup->find(TRUE);
318 if (CRM_Core_BAO_CustomField::isSerialized($customField)) {
be2fb01f
CW
319 $params = [
320 1 => [CRM_Utils_Array::implodePadded($oldValue), 'String'],
321 2 => [CRM_Utils_Array::implodePadded($newValue), 'String'],
322 3 => ['%' . CRM_Utils_Array::implodePadded($oldValue) . '%', 'String'],
323 ];
58eaa092
CW
324 }
325 else {
be2fb01f
CW
326 $params = [
327 1 => [$oldValue, 'String'],
328 2 => [$newValue, 'String'],
329 3 => [$oldValue, 'String'],
330 ];
58eaa092
CW
331 }
332 $sql = "UPDATE `{$customGroup->table_name}` SET `{$customField->column_name}` = REPLACE(`{$customField->column_name}`, %1, %2) WHERE `{$customField->column_name}` LIKE %3";
58eaa092
CW
333 CRM_Core_DAO::executeQuery($sql, $params);
334 }
58eaa092
CW
335 }
336
6a488035 337}