From dd44a9efcc65441abeb62b526e099416d02bfad0 Mon Sep 17 00:00:00 2001 From: tremo Date: Fri, 15 May 2026 15:14:51 +0200 Subject: [PATCH 1/4] fix: nested array stored in DB for readonly dropdown --- inc/container.class.php | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/inc/container.class.php b/inc/container.class.php index bd663d6f..3c109cf6 100644 --- a/inc/container.class.php +++ b/inc/container.class.php @@ -1413,11 +1413,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)) { @@ -1966,6 +1967,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 * From 300525e085e628e0add1662b2d8b404f932de913 Mon Sep 17 00:00:00 2001 From: tremo Date: Fri, 15 May 2026 15:31:29 +0200 Subject: [PATCH 2/4] CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d00feb06..997e5a1c 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 migration abort when a GenericObject container name produces a table name exceeding MySQL's 64-character limit after conversion to GlpiCustomAsset. - Fix empty dropdown value (-1) on form submission - Fix text area fields size and alignment From 60683440adec793e6360f459c073f4da272c8cb2 Mon Sep 17 00:00:00 2001 From: tremo Date: Fri, 15 May 2026 15:38:45 +0200 Subject: [PATCH 3/4] flatten values already corrupted in db at display time --- inc/field.class.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/inc/field.class.php b/inc/field.class.php index 039e812f..44bf2cd8 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; } From e2ade040a6832c1a16cdc6596fc49087a53f0513 Mon Sep 17 00:00:00 2001 From: tremo Date: Mon, 18 May 2026 10:18:06 +0200 Subject: [PATCH 4/4] refactor function --- inc/container.class.php | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/inc/container.class.php b/inc/container.class.php index 3c109cf6..c3956d33 100644 --- a/inc/container.class.php +++ b/inc/container.class.php @@ -1969,25 +1969,18 @@ public static function preItem(CommonDBTM $item) /** * 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[][][]). + * + * @param array $values + * @return array $values the flattened array with only scalar values */ 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; - } + array_push($flat, ...(is_array($v) ? $v : [$v])); } - return $flat; + return array_values(array_filter($flat, is_scalar(...))); } /**