diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e5cbc3d..d2af19a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Fixed +- Fix nested array stored in DB for readonly dropdown - Fix empty dropdown value (-1) on form submission - Fix text area fields size and alignment - Optimize container loading when there are a large number of entities diff --git a/inc/container.class.php b/inc/container.class.php index abcf900b..d1581d8f 100644 --- a/inc/container.class.php +++ b/inc/container.class.php @@ -1403,11 +1403,12 @@ public function updateFieldsValues($data, $itemtype, $massiveaction = false) // Add new values to existing ones $existing_values = json_decode($obj->fields[$field_name] ?? '[]', true); $new_values = is_array($data[$field_name]) ? $data[$field_name] : [$data[$field_name]]; + $new_values = $this->flattenScalars($new_values); $data[$field_name] = json_encode(array_values(array_unique(array_merge($existing_values, $new_values)))); } else { $value = $data[$field_name]; - $value = is_array($value) ? $value : []; + $value = is_array($value) ? $this->flattenScalars($value) : []; $data[$field_name] = json_encode($value); } } elseif (array_key_exists('_' . $field_name . '_defined', $data)) { @@ -1956,6 +1957,29 @@ public static function preItem(CommonDBTM $item) return false; } + /** + * Flatten a one-level-deep array of mixed scalars/arrays into a flat array of scalars. + * Guards against nested arrays produced when a readonly multiple-dropdown field submits + * with a doubly-bracketed name (e.g. foo[][][]). + */ + private function flattenScalars(array $values): array + { + $flat = []; + foreach ($values as $v) { + if (is_array($v)) { + foreach ($v as $inner) { + if (is_scalar($inner)) { + $flat[] = $inner; + } + } + } elseif (is_scalar($v)) { + $flat[] = $v; + } + } + + return $flat; + } + /** * Populates fields data from item * diff --git a/inc/field.class.php b/inc/field.class.php index 6ff05e1d..bd1d4205 100644 --- a/inc/field.class.php +++ b/inc/field.class.php @@ -1283,6 +1283,18 @@ public static function prepareHtmlFields( $value = is_array($decoded) ? $decoded : []; } + if ($field['multiple'] && is_array($value)) { + // Flatten any nested arrays caused by corrupted DB data (double-encoded values) + // so that Dropdown::show() always receives a flat list of scalars. + $value = array_values(array_filter( + array_merge(...array_map( + static fn($v) => is_array($v) ? array_values($v) : [$v], + $value, + )), + is_scalar(...), + )); + } + $field['value'] = $value; }