Commit | Line | Data |
---|---|---|
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 | * form to process actions on the set aspect of Custom Data | |
20 | */ | |
21 | class CRM_Custom_Form_Group extends CRM_Core_Form { | |
22 | ||
23 | /** | |
fe482240 | 24 | * The set id saved to the session for an update. |
6a488035 TO |
25 | * |
26 | * @var int | |
6a488035 TO |
27 | */ |
28 | protected $_id; | |
29 | ||
30 | /** | |
fe482240 | 31 | * set is empty or not. |
6a488035 TO |
32 | * |
33 | * @var bool | |
6a488035 TO |
34 | */ |
35 | protected $_isGroupEmpty = TRUE; | |
36 | ||
37 | /** | |
fe482240 | 38 | * Array of existing subtypes set for a custom set. |
6a488035 TO |
39 | * |
40 | * @var array | |
6a488035 | 41 | */ |
be2fb01f | 42 | protected $_subtypes = []; |
6a488035 | 43 | |
6a488035 | 44 | /** |
fe482240 | 45 | * Set variables up before form is built. |
6a488035 | 46 | * |
6a488035 TO |
47 | * |
48 | * @return void | |
6a488035 TO |
49 | */ |
50 | public function preProcess() { | |
2af06525 CW |
51 | Civi::resources()->addScriptFile('civicrm', 'js/jquery/jquery.crmIconPicker.js'); |
52 | ||
6a488035 TO |
53 | // current set id |
54 | $this->_id = $this->get('id'); | |
55 | ||
148c89c8 | 56 | if ($this->_id && $isReserved = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_id, 'is_reserved', 'id')) { |
fbdcf459 | 57 | CRM_Core_Error::statusBounce("You cannot edit the settings of a reserved custom field-set."); |
d06700a7 | 58 | } |
6a488035 TO |
59 | // setting title for html page |
60 | if ($this->_action == CRM_Core_Action::UPDATE) { | |
61 | $title = CRM_Core_BAO_CustomGroup::getTitle($this->_id); | |
be2fb01f | 62 | CRM_Utils_System::setTitle(ts('Edit %1', [1 => $title])); |
6a488035 TO |
63 | } |
64 | elseif ($this->_action == CRM_Core_Action::VIEW) { | |
65 | $title = CRM_Core_BAO_CustomGroup::getTitle($this->_id); | |
be2fb01f | 66 | CRM_Utils_System::setTitle(ts('Preview %1', [1 => $title])); |
6a488035 TO |
67 | } |
68 | else { | |
69 | CRM_Utils_System::setTitle(ts('New Custom Field Set')); | |
70 | } | |
71 | ||
72 | if (isset($this->_id)) { | |
be2fb01f | 73 | $params = ['id' => $this->_id]; |
6a488035 TO |
74 | CRM_Core_BAO_CustomGroup::retrieve($params, $this->_defaults); |
75 | ||
9c1bc317 | 76 | $subExtends = $this->_defaults['extends_entity_column_value'] ?? NULL; |
6a488035 TO |
77 | if (!empty($subExtends)) { |
78 | $this->_subtypes = explode(CRM_Core_DAO::VALUE_SEPARATOR, substr($subExtends, 1, -1)); | |
79 | } | |
80 | } | |
81 | } | |
82 | ||
83 | /** | |
fe482240 | 84 | * Global form rule. |
6a488035 | 85 | * |
c4ca4892 TO |
86 | * @param array $fields |
87 | * The input form values. | |
88 | * @param array $files | |
89 | * The uploaded files if any. | |
dd244018 EM |
90 | * @param $self |
91 | * | |
6a488035 | 92 | * |
72b3a70c CW |
93 | * @return bool|array |
94 | * true if no errors, else array of errors | |
6a488035 | 95 | */ |
00be9182 | 96 | public static function formRule($fields, $files, $self) { |
be2fb01f | 97 | $errors = []; |
6a488035 TO |
98 | |
99 | //validate group title as well as name. | |
353ffa53 TO |
100 | $title = $fields['title']; |
101 | $name = CRM_Utils_String::munge($title, '_', 64); | |
9d5dc965 | 102 | $query = 'select count(*) from civicrm_custom_group where ( name like %1) and id != %2'; |
be2fb01f CW |
103 | $grpCnt = CRM_Core_DAO::singleValueQuery($query, [ |
104 | 1 => [$name, 'String'], | |
105 | 2 => [(int) $self->_id, 'Integer'], | |
106 | ]); | |
6a488035 | 107 | if ($grpCnt) { |
be2fb01f | 108 | $errors['title'] = ts('Custom group \'%1\' already exists in Database.', [1 => $title]); |
6a488035 TO |
109 | } |
110 | ||
a7488080 | 111 | if (!empty($fields['extends'][1])) { |
6a488035 TO |
112 | if (in_array('', $fields['extends'][1]) && count($fields['extends'][1]) > 1) { |
113 | $errors['extends'] = ts("Cannot combine other option with 'Any'."); | |
114 | } | |
115 | } | |
116 | ||
117 | if (empty($fields['extends'][0])) { | |
118 | $errors['extends'] = ts("You need to select the type of record that this set of custom fields is applicable for."); | |
119 | } | |
120 | ||
be2fb01f | 121 | $extends = ['Activity', 'Relationship', 'Group', 'Contribution', 'Membership', 'Event', 'Participant']; |
6a488035 TO |
122 | if (in_array($fields['extends'][0], $extends) && $fields['style'] == 'Tab') { |
123 | $errors['style'] = ts("Display Style should be Inline for this Class"); | |
124 | $self->assign('showStyle', TRUE); | |
125 | } | |
126 | ||
a7488080 | 127 | if (!empty($fields['is_multiple'])) { |
e8646905 | 128 | $self->assign('showMultiple', TRUE); |
6a488035 TO |
129 | } |
130 | ||
b05a0fb6 | 131 | if (empty($fields['is_multiple']) && $fields['style'] == 'Tab with table') { |
e232751e | 132 | $errors['style'] = ts("Display Style 'Tab with table' is only supported for multiple-record custom field sets."); |
b05a0fb6 PJ |
133 | } |
134 | ||
6a488035 TO |
135 | //checks the given custom set doesnot start with digit |
136 | $title = $fields['title']; | |
137 | if (!empty($title)) { | |
138 | // gives the ascii value | |
e1499714 | 139 | $asciiValue = ord($title[0]); |
6a488035 | 140 | if ($asciiValue >= 48 && $asciiValue <= 57) { |
5ab78070 | 141 | $errors['title'] = ts("Name cannot not start with a digit"); |
6a488035 TO |
142 | } |
143 | } | |
144 | ||
145 | return empty($errors) ? TRUE : $errors; | |
146 | } | |
147 | ||
148 | /** | |
dc195289 | 149 | * add the rules (mainly global rules) for form. |
6a488035 TO |
150 | * All local rules are added near the element |
151 | * | |
6a488035 TO |
152 | * |
153 | * @return void | |
6a488035 TO |
154 | * @see valid_date |
155 | */ | |
00be9182 | 156 | public function addRules() { |
be2fb01f | 157 | $this->addFormRule(['CRM_Custom_Form_Group', 'formRule'], $this); |
6a488035 TO |
158 | } |
159 | ||
160 | /** | |
fe482240 | 161 | * Build the form object. |
6a488035 | 162 | * |
6a488035 TO |
163 | * |
164 | * @return void | |
6a488035 TO |
165 | */ |
166 | public function buildQuickForm() { | |
167 | $this->applyFilter('__ALL__', 'trim'); | |
168 | ||
169 | $attributes = CRM_Core_DAO::getAttribute('CRM_Core_DAO_CustomGroup'); | |
170 | ||
171 | //title | |
172 | $this->add('text', 'title', ts('Set Name'), $attributes['title'], TRUE); | |
173 | ||
174 | //Fix for code alignment, CRM-3058 | |
be2fb01f | 175 | $contactTypes = ['Contact', 'Individual', 'Household', 'Organization']; |
6a488035 TO |
176 | $this->assign('contactTypes', json_encode($contactTypes)); |
177 | ||
be2fb01f | 178 | $sel1 = ["" => ts("- select -")] + CRM_Core_SelectValues::customGroupExtends(); |
6a488035 | 179 | ksort($sel1); |
13d328b3 | 180 | $sel2 = CRM_Core_BAO_CustomGroup::getSubTypes(); |
6a488035 TO |
181 | |
182 | foreach ($sel2 as $main => $sub) { | |
183 | if (!empty($sel2[$main])) { | |
be2fb01f | 184 | $sel2[$main] = [ |
a9c1ff43 | 185 | '' => ts("- Any -"), |
be2fb01f | 186 | ] + $sel2[$main]; |
6a488035 TO |
187 | } |
188 | } | |
189 | ||
190 | $cSubTypes = CRM_Core_Component::contactSubTypes(); | |
191 | ||
192 | if (!empty($cSubTypes)) { | |
be2fb01f | 193 | $contactSubTypes = []; |
6a488035 TO |
194 | foreach ($cSubTypes as $key => $value) { |
195 | $contactSubTypes[$key] = $key; | |
196 | } | |
be2fb01f | 197 | $sel2['Contact'] = [ |
b6b6d6cc | 198 | "" => ("- Any -"), |
be2fb01f | 199 | ] + $contactSubTypes; |
6a488035 TO |
200 | } |
201 | else { | |
202 | if (!isset($this->_id)) { | |
203 | $formName = 'document.forms.' . $this->_name; | |
204 | ||
205 | $js = "<script type='text/javascript'>\n"; | |
206 | $js .= "{$formName}['extends_1'].style.display = 'none';\n"; | |
207 | $js .= "</script>"; | |
208 | $this->assign('initHideBlocks', $js); | |
209 | } | |
210 | } | |
211 | ||
212 | $sel = &$this->add('hierselect', | |
213 | 'extends', | |
214 | ts('Used For'), | |
be2fb01f | 215 | [ |
6a488035 | 216 | 'name' => 'extends[0]', |
21dfd5f5 | 217 | 'style' => 'vertical-align: top;', |
be2fb01f | 218 | ], |
6a488035 TO |
219 | TRUE |
220 | ); | |
be2fb01f | 221 | $sel->setOptions([$sel1, $sel2]); |
6a488035 TO |
222 | if (is_a($sel->_elements[1], 'HTML_QuickForm_select')) { |
223 | // make second selector a multi-select - | |
224 | $sel->_elements[1]->setMultiple(TRUE); | |
225 | $sel->_elements[1]->setSize(5); | |
226 | } | |
227 | if ($this->_action == CRM_Core_Action::UPDATE) { | |
9c1bc317 | 228 | $subName = $this->_defaults['extends_entity_column_id'] ?? NULL; |
6a488035 TO |
229 | if ($this->_defaults['extends'] == 'Participant') { |
230 | if ($subName == 1) { | |
231 | $this->_defaults['extends'] = 'ParticipantRole'; | |
232 | } | |
233 | elseif ($subName == 2) { | |
234 | $this->_defaults['extends'] = 'ParticipantEventName'; | |
235 | } | |
236 | elseif ($subName == 3) { | |
237 | $this->_defaults['extends'] = 'ParticipantEventType'; | |
238 | } | |
239 | } | |
240 | ||
241 | //allow to edit settings if custom set is empty CRM-5258 | |
242 | $this->_isGroupEmpty = CRM_Core_BAO_CustomGroup::isGroupEmpty($this->_id); | |
243 | if (!$this->_isGroupEmpty) { | |
244 | if (!empty($this->_subtypes)) { | |
245 | // we want to allow adding / updating subtypes for this case, | |
246 | // and therefore freeze the first selector only. | |
247 | $sel->_elements[0]->freeze(); | |
248 | } | |
249 | else { | |
250 | // freeze both the selectors | |
251 | $sel->freeze(); | |
252 | } | |
253 | } | |
254 | $this->assign('isCustomGroupEmpty', $this->_isGroupEmpty); | |
255 | $this->assign('gid', $this->_id); | |
256 | } | |
257 | $this->assign('defaultSubtypes', json_encode($this->_subtypes)); | |
258 | ||
259 | // help text | |
5d51a2f9 CW |
260 | $this->add('wysiwyg', 'help_pre', ts('Pre-form Help'), $attributes['help_pre']); |
261 | $this->add('wysiwyg', 'help_post', ts('Post-form Help'), $attributes['help_post']); | |
6a488035 TO |
262 | |
263 | // weight | |
f20d2b0d | 264 | $this->add('number', 'weight', ts('Order'), $attributes['weight'], TRUE); |
6a488035 TO |
265 | $this->addRule('weight', ts('is a numeric field'), 'numeric'); |
266 | ||
267 | // display style | |
268 | $this->add('select', 'style', ts('Display Style'), CRM_Core_SelectValues::customGroupStyle()); | |
269 | ||
2af06525 CW |
270 | $this->add('text', 'icon', ts('Tab icon'), ['class' => 'crm-icon-picker', 'allowClear' => TRUE]); |
271 | ||
6a488035 | 272 | // is this set collapsed or expanded ? |
cbaf6620 | 273 | $this->addElement('advcheckbox', 'collapse_display', ts('Collapse this set on initial display')); |
6a488035 TO |
274 | |
275 | // is this set collapsed or expanded ? in advanced search | |
cbaf6620 | 276 | $this->addElement('advcheckbox', 'collapse_adv_display', ts('Collapse this set in Advanced Search')); |
6a488035 TO |
277 | |
278 | // is this set active ? | |
cbaf6620 | 279 | $this->addElement('advcheckbox', 'is_active', ts('Is this Custom Data Set active?')); |
6a488035 | 280 | |
460931ca JP |
281 | //Is this set visible on public pages? |
282 | $this->addElement('advcheckbox', 'is_public', ts('Is this Custom Data Set public?')); | |
283 | ||
6a488035 | 284 | // does this set have multiple record? |
cbaf6620 | 285 | $multiple = $this->addElement('advcheckbox', 'is_multiple', |
d9aa50a7 | 286 | ts('Does this Custom Field Set allow multiple records?'), NULL); |
6a488035 TO |
287 | |
288 | // $min_multiple = $this->add('text', 'min_multiple', ts('Minimum number of multiple records'), $attributes['min_multiple'] ); | |
289 | // $this->addRule('min_multiple', ts('is a numeric field') , 'numeric'); | |
290 | ||
73cda6c5 | 291 | $max_multiple = $this->add('number', 'max_multiple', ts('Maximum number of multiple records'), $attributes['max_multiple']); |
6a488035 TO |
292 | $this->addRule('max_multiple', ts('is a numeric field'), 'numeric'); |
293 | ||
294 | //allow to edit settings if custom set is empty CRM-5258 | |
295 | $this->assign('isGroupEmpty', $this->_isGroupEmpty); | |
296 | if (!$this->_isGroupEmpty) { | |
297 | $multiple->freeze(); | |
298 | //$min_multiple->freeze(); | |
299 | $max_multiple->freeze(); | |
300 | } | |
301 | ||
302 | $this->assign('showStyle', FALSE); | |
303 | $this->assign('showMultiple', FALSE); | |
be2fb01f CW |
304 | $buttons = [ |
305 | [ | |
6a488035 TO |
306 | 'type' => 'next', |
307 | 'name' => ts('Save'), | |
308 | 'spacing' => ' ', | |
309 | 'isDefault' => TRUE, | |
be2fb01f CW |
310 | ], |
311 | [ | |
6a488035 TO |
312 | 'type' => 'cancel', |
313 | 'name' => ts('Cancel'), | |
be2fb01f CW |
314 | ], |
315 | ]; | |
6a488035 | 316 | if (!$this->_isGroupEmpty && !empty($this->_subtypes)) { |
b01812e5 | 317 | $buttons[0]['class'] = 'crm-warnDataLoss'; |
6a488035 TO |
318 | } |
319 | $this->addButtons($buttons); | |
320 | ||
b6b6d6cc | 321 | // TODO: Is this condition ever true? Can this code be removed? |
6a488035 TO |
322 | if ($this->_action & CRM_Core_Action::VIEW) { |
323 | $this->freeze(); | |
cbd83dde AH |
324 | $this->addElement('xbutton', 'done', ts('Done'), [ |
325 | 'type' => 'button', | |
326 | 'onclick' => "location.href='civicrm/admin/custom/group?reset=1&action=browse'", | |
327 | ]); | |
6a488035 TO |
328 | } |
329 | } | |
330 | ||
331 | /** | |
c490a46a | 332 | * Set default values for the form. Note that in edit/view mode |
6a488035 TO |
333 | * the default values are retrieved from the database |
334 | * | |
6a488035 | 335 | * |
a6c01b45 CW |
336 | * @return array |
337 | * array of default values | |
6a488035 | 338 | */ |
00be9182 | 339 | public function setDefaultValues() { |
6a488035 TO |
340 | $defaults = &$this->_defaults; |
341 | $this->assign('showMaxMultiple', TRUE); | |
342 | if ($this->_action == CRM_Core_Action::ADD) { | |
343 | $defaults['weight'] = CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_CustomGroup'); | |
344 | ||
345 | $defaults['is_multiple'] = $defaults['min_multiple'] = 0; | |
460931ca | 346 | $defaults['is_active'] = $defaults['is_public'] = $defaults['collapse_display'] = 1; |
6a488035 TO |
347 | $defaults['style'] = 'Inline'; |
348 | } | |
a7488080 | 349 | elseif (empty($defaults['max_multiple']) && !$this->_isGroupEmpty) { |
6a488035 TO |
350 | $this->assign('showMaxMultiple', FALSE); |
351 | } | |
352 | ||
b05a0fb6 | 353 | if (($this->_action & CRM_Core_Action::UPDATE) && !empty($defaults['is_multiple'])) { |
5a205b89 PJ |
354 | $defaults['collapse_display'] = 0; |
355 | } | |
356 | ||
6a488035 TO |
357 | if (isset($defaults['extends'])) { |
358 | $extends = $defaults['extends']; | |
359 | unset($defaults['extends']); | |
360 | ||
361 | $defaults['extends'][0] = $extends; | |
362 | ||
363 | if (!empty($this->_subtypes)) { | |
364 | $defaults['extends'][1] = $this->_subtypes; | |
365 | } | |
366 | else { | |
be2fb01f | 367 | $defaults['extends'][1] = [0 => '']; |
6a488035 TO |
368 | } |
369 | ||
6a488035 | 370 | if ($extends == 'Relationship' && !empty($this->_subtypes)) { |
be2fb01f | 371 | $relationshipDefaults = []; |
6a488035 TO |
372 | foreach ($defaults['extends'][1] as $donCare => $rel_type_id) { |
373 | $relationshipDefaults[] = $rel_type_id; | |
374 | } | |
375 | ||
376 | $defaults['extends'][1] = $relationshipDefaults; | |
377 | } | |
378 | } | |
379 | ||
380 | return $defaults; | |
381 | } | |
382 | ||
383 | /** | |
fe482240 | 384 | * Process the form. |
6a488035 | 385 | * |
6a488035 TO |
386 | * |
387 | * @return void | |
6a488035 TO |
388 | */ |
389 | public function postProcess() { | |
390 | // get the submitted form values. | |
391 | $params = $this->controller->exportValues('Group'); | |
392 | $params['overrideFKConstraint'] = 0; | |
393 | if ($this->_action & CRM_Core_Action::UPDATE) { | |
394 | $params['id'] = $this->_id; | |
395 | if ($this->_defaults['extends'][0] != $params['extends'][0]) { | |
396 | $params['overrideFKConstraint'] = 1; | |
397 | } | |
398 | ||
399 | if (!empty($this->_subtypes)) { | |
be2fb01f | 400 | $subtypesToBeRemoved = []; |
00aca323 | 401 | $subtypesToPreserve = $params['extends'][1]; |
5737ecff | 402 | // Don't remove any value if group is extended to -any- subtype |
b27a1338 | 403 | if (!empty($subtypesToPreserve[0])) { |
5737ecff | 404 | $subtypesToBeRemoved = array_diff($this->_subtypes, array_intersect($this->_subtypes, $subtypesToPreserve)); |
405 | } | |
00aca323 | 406 | CRM_Contact_BAO_ContactType::deleteCustomRowsOfSubtype($this->_id, $subtypesToBeRemoved, $subtypesToPreserve); |
6a488035 TO |
407 | } |
408 | } | |
409 | elseif ($this->_action & CRM_Core_Action::ADD) { | |
410 | //new custom set , so lets set the created_id | |
411 | $session = CRM_Core_Session::singleton(); | |
412 | $params['created_id'] = $session->get('userID'); | |
413 | $params['created_date'] = date('YmdHis'); | |
414 | } | |
415 | ||
9857487f SL |
416 | $result = civicrm_api3('CustomGroup', 'create', $params); |
417 | $group = $result['values'][$result['id']]; | |
6a488035 TO |
418 | |
419 | // reset the cache | |
9cdf85c1 | 420 | Civi::cache('fields')->flush(); |
5e601882 SL |
421 | // reset ACL and system caches. |
422 | CRM_Core_BAO_Cache::resetCaches(); | |
6a488035 TO |
423 | |
424 | if ($this->_action & CRM_Core_Action::UPDATE) { | |
9857487f | 425 | CRM_Core_Session::setStatus(ts('Your custom field set \'%1 \' has been saved.', [1 => $group['title']]), ts('Saved'), 'success'); |
6a488035 TO |
426 | } |
427 | else { | |
704f21c0 CW |
428 | // Jump directly to adding a field if popups are disabled |
429 | $action = CRM_Core_Resources::singleton()->ajaxPopupsEnabled ? '' : '/add'; | |
9857487f | 430 | $url = CRM_Utils_System::url("civicrm/admin/custom/group/field$action", 'reset=1&new=1&gid=' . $group['id'] . '&action=' . ($action ? 'add' : 'browse')); |
6a488035 | 431 | CRM_Core_Session::setStatus(ts("Your custom field set '%1' has been added. You can add custom fields now.", |
9857487f | 432 | [1 => $group['title']] |
353ffa53 | 433 | ), ts('Saved'), 'success'); |
6a488035 TO |
434 | $session = CRM_Core_Session::singleton(); |
435 | $session->replaceUserContext($url); | |
436 | } | |
437 | ||
438 | // prompt Drupal Views users to update $db_prefix in settings.php, if necessary | |
439 | global $db_prefix; | |
440 | $config = CRM_Core_Config::singleton(); | |
441 | if (is_array($db_prefix) && $config->userSystem->is_drupal && module_exists('views')) { | |
442 | // get table_name for each custom group | |
be2fb01f | 443 | $tables = []; |
353ffa53 | 444 | $sql = "SELECT table_name FROM civicrm_custom_group WHERE is_active = 1"; |
6a488035 TO |
445 | $result = CRM_Core_DAO::executeQuery($sql); |
446 | while ($result->fetch()) { | |
447 | $tables[$result->table_name] = $result->table_name; | |
448 | } | |
449 | ||
450 | // find out which tables are missing from the $db_prefix array | |
451 | $missingTableNames = array_diff_key($tables, $db_prefix); | |
452 | ||
453 | if (!empty($missingTableNames)) { | |
454 | CRM_Core_Session::setStatus(ts("To ensure that all of your custom data groups are available to Views, you may need to add the following key(s) to the db_prefix array in your settings.php file: '%1'.", | |
be2fb01f | 455 | [1 => implode(', ', $missingTableNames)] |
353ffa53 | 456 | ), ts('Note'), 'info'); |
6a488035 TO |
457 | } |
458 | } | |
459 | } | |
460 | ||
e0ef6999 | 461 | /** |
a9c1ff43 | 462 | * Return a formatted list of relationship labels. |
e0ef6999 | 463 | * |
a6c01b45 | 464 | * @return array |
a9c1ff43 | 465 | * Array (int $id => string $label). |
e0ef6999 | 466 | */ |
a9c1ff43 TO |
467 | public static function getRelationshipTypes() { |
468 | // Note: We include inactive reltypes because we don't want to break custom-data | |
469 | // UI when a reltype is disabled. | |
470 | return CRM_Core_DAO::executeQuery(' | |
471 | SELECT | |
472 | id, | |
473 | (CASE 1 | |
474 | WHEN label_a_b is not null AND label_b_a is not null AND label_a_b != label_b_a | |
475 | THEN concat(label_a_b, \' / \', label_b_a) | |
476 | WHEN label_a_b is not null | |
477 | THEN label_a_b | |
478 | WHEN label_b_a is not null | |
479 | THEN label_b_a | |
480 | ELSE concat("RelType #", id) | |
481 | END) as label | |
482 | FROM civicrm_relationship_type | |
483 | ' | |
484 | )->fetchMap('id', 'label'); | |
6a488035 | 485 | } |
96025800 | 486 | |
6a488035 | 487 | } |