Skip to content

Commit a2eb584

Browse files
authored
Fix: search on multi-dropdown (#1003)
* Fix: search on multi-dropdown * changelog
1 parent 8f7e293 commit a2eb584

File tree

3 files changed

+31
-27
lines changed

3 files changed

+31
-27
lines changed

CHANGELOG.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,31 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## [UNRELEASED]
9+
10+
### Fixed
11+
12+
- Fix `search option` for `multiple` dropdown
13+
814
## [1.21.23] - 2025-08-26
915

10-
- FIx undefined array key `multiple_dropdown_action` during import
16+
### Fixed
17+
18+
- Fix undefined array key `multiple_dropdown_action` during import
1119
- Fix incompatibility of `multiple` dropdowns with `massiveaction`
1220
- Fix default value properly applied in multiple dropdown search options
1321
- Fix `search option` for default values in `multiple` dropdown
1422
- Fix shared dropdowns not displaying in `massiveaction`
1523
- The field name was empty in the GLPI logs
1624

1725
### Added
26+
1827
- Add `replace` and `add` options in massive action for the multiple dropdowns fields
1928

2029
## [1.21.22] - 2025-05-28
2130

2231
### Fixed
32+
2333
- Fix condition check logic for dropdown field values
2434
- Fix validation for mandatory multiple dropdown
2535
- Fix `twig` error about undefined `dropdown_options`

hook.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,9 @@ function plugin_fields_addWhere($link, $nott, $itemtype, $ID, $val, $searchtype)
400400
$tablefield = "$table" . '_' . "$field";
401401
switch ($searchtype) {
402402
case 'equals':
403-
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'notequals' : 'equals', $itemtype, $field_field);
403+
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'notequals' : 'equals', $field_field);
404404
case 'notequals':
405-
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'equals' : 'notequals', $itemtype, $field_field);
405+
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'equals' : 'notequals', $field_field);
406406
}
407407
} else {
408408
// if 'multiple' field with cleaned name is found -> 'dropdown' case
@@ -420,9 +420,9 @@ function plugin_fields_addWhere($link, $nott, $itemtype, $ID, $val, $searchtype)
420420
) {
421421
switch ($searchtype) {
422422
case 'equals':
423-
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'notequals' : 'equals', $itemtype, $field_field);
423+
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'notequals' : 'equals', $field_field);
424424
case 'notequals':
425-
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'equals' : 'notequals', $itemtype, $field_field);
425+
return PluginFieldsDropdown::multipleDropdownAddWhere($link, $tablefield, $field, $val, $nott ? 'equals' : 'notequals', $field_field);
426426
}
427427
} else {
428428
return false;

inc/dropdown.class.php

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -255,32 +255,26 @@ public static function getClassname($system_name)
255255
return 'PluginFields' . ucfirst($system_name) . 'Dropdown';
256256
}
257257

258-
public static function multipleDropdownAddWhere($link, $tablefield, $field, $val, $searchtype, $itemtype, $field_field)
258+
public static function multipleDropdownAddWhere($link, $tablefield, $field, $val, $searchtype, $field_field = [])
259259
{
260260
/** @var \DBmysql $DB */
261261
global $DB;
262262

263-
$default_value_request = "";
264-
265-
if ($field_field->fields['default_value'] === '["' . $val . '"]') {
266-
switch ($searchtype) {
267-
case 'equals':
268-
$default_value_request = ' OR (' . $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName('itemtype') . ' IS NULL' .
269-
' AND ' . $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName('items_id') . ' IS NULL)';
270-
break;
271-
case 'notequals':
272-
$default_value_request = ' AND (' . $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName('itemtype') . '=' . $DB->quoteValue($itemtype) .
273-
' OR ' . $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName('items_id') . '=' . $itemtype::getTable() . '.id)';
274-
break;
275-
}
276-
}
263+
// Determines the default value
264+
$default_value = $field_field->fields['default_value'] ?? '';
265+
$default_value = ($default_value == '[]') ? '' : $DB->quoteValue($default_value);
277266

278-
switch ($searchtype) {
279-
case 'equals':
280-
return $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName($field) . ' LIKE ' . $DB->quoteValue("%\"$val\"%") . $default_value_request;
281-
case 'notequals':
282-
return $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName($field) . ' NOT LIKE ' . $DB->quoteValue("%\"$val\"%") .
283-
' OR ' . $link . $DB->quoteName($tablefield) . '.' . $DB->quoteName($field) . ' IS NULL' . $default_value_request;
284-
}
267+
// Constructs the SQL query base
268+
$quotedField = $DB->quoteName($tablefield) . '.' . $DB->quoteName($field);
269+
$sqlBase = $link . ' COALESCE(' . $quotedField . ', ' . $default_value . ')';
270+
271+
// Handles “equals” and “notequals” cases in a unified manner
272+
$operator = ($searchtype === 'equals') ? '' : 'NOT ';
273+
$condition = ($val == '0')
274+
? $operator . 'IN("", "[]")'
275+
: $operator . 'LIKE ' . $DB->quoteValue("%\"$val\"%");
276+
277+
return $sqlBase . ' ' . $condition;
285278
}
279+
286280
}

0 commit comments

Comments
 (0)