Skip to content

Commit 3dfe08e

Browse files
authored
fix: nested array stored in DB for readonly dropdown (#1197)
* fix: nested array stored in DB for readonly dropdown * CHANGELOG * flatten values already corrupted in db at display time * refactor function
1 parent 0158d07 commit 3dfe08e

3 files changed

Lines changed: 31 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
### Fixed
1111

12+
- Fix nested array stored in DB for readonly dropdown
1213
- Fix migration abort when a GenericObject container name produces a table name exceeding MySQL's 64-character limit after conversion to GlpiCustomAsset.
1314
- Fix empty dropdown value (-1) on form submission
1415
- Fix text area fields size and alignment

inc/container.class.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1413,11 +1413,12 @@ public function updateFieldsValues($data, $itemtype, $massiveaction = false)
14131413
// Add new values to existing ones
14141414
$existing_values = json_decode($obj->fields[$field_name] ?? '[]', true);
14151415
$new_values = is_array($data[$field_name]) ? $data[$field_name] : [$data[$field_name]];
1416+
$new_values = $this->flattenScalars($new_values);
14161417
$data[$field_name] = json_encode(array_values(array_unique(array_merge($existing_values, $new_values))));
14171418

14181419
} else {
14191420
$value = $data[$field_name];
1420-
$value = is_array($value) ? $value : [];
1421+
$value = is_array($value) ? $this->flattenScalars($value) : [];
14211422
$data[$field_name] = json_encode($value);
14221423
}
14231424
} elseif (array_key_exists('_' . $field_name . '_defined', $data)) {
@@ -1966,6 +1967,22 @@ public static function preItem(CommonDBTM $item)
19661967
return false;
19671968
}
19681969

1970+
/**
1971+
* Flatten a one-level-deep array of mixed scalars/arrays into a flat array of scalars.
1972+
*
1973+
* @param array<mixed, mixed> $values
1974+
* @return array<mixed, mixed> $values the flattened array with only scalar values
1975+
*/
1976+
private function flattenScalars(array $values): array
1977+
{
1978+
$flat = [];
1979+
foreach ($values as $v) {
1980+
array_push($flat, ...(is_array($v) ? $v : [$v]));
1981+
}
1982+
1983+
return array_values(array_filter($flat, is_scalar(...)));
1984+
}
1985+
19691986
/**
19701987
* Populates fields data from item
19711988
*

inc/field.class.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,18 @@ public static function prepareHtmlFields(
12831283
$value = is_array($decoded) ? $decoded : [];
12841284
}
12851285

1286+
if ($field['multiple'] && is_array($value)) {
1287+
// Flatten any nested arrays caused by corrupted DB data (double-encoded values)
1288+
// so that Dropdown::show() always receives a flat list of scalars.
1289+
$value = array_values(array_filter(
1290+
array_merge(...array_map(
1291+
static fn($v) => is_array($v) ? array_values($v) : [$v],
1292+
$value,
1293+
)),
1294+
is_scalar(...),
1295+
));
1296+
}
1297+
12861298
$field['value'] = $value;
12871299
}
12881300

0 commit comments

Comments
 (0)