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 diff --git a/inc/container.class.php b/inc/container.class.php index bd663d6f..c3956d33 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,22 @@ public static function preItem(CommonDBTM $item) return false; } + /** + * Flatten a one-level-deep array of mixed scalars/arrays into a flat array of scalars. + * + * @param array $values + * @return array $values the flattened array with only scalar values + */ + private function flattenScalars(array $values): array + { + $flat = []; + foreach ($values as $v) { + array_push($flat, ...(is_array($v) ? $v : [$v])); + } + + return array_values(array_filter($flat, is_scalar(...))); + } + /** * Populates fields data from item * 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; }