diff --git a/CHANGELOG.md b/CHANGELOG.md index 7146dc2fd..2b270d807 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Made `Grav::redirect()` to accept `Route` class 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility + * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Common/Data/Blueprint.php b/system/src/Grav/Common/Data/Blueprint.php index 287819939..df434267f 100644 --- a/system/src/Grav/Common/Data/Blueprint.php +++ b/system/src/Grav/Common/Data/Blueprint.php @@ -293,15 +293,16 @@ class Blueprint extends BlueprintForm /** * Flatten data by using blueprints. * - * @param array $data - * @param bool $includeAll + * @param array $data Data to be flattened. + * @param bool $includeAll True if undefined properties should also be included. + * @param string $name Property which will be flattened, useful for flattening repeating data. * @return array */ - public function flattenData(array $data, bool $includeAll = false) + public function flattenData(array $data, bool $includeAll = false, string $name = '') { $this->initInternals(); - return $this->blueprintSchema->flattenData($data, $includeAll); + return $this->blueprintSchema->flattenData($data, $includeAll, $name); } diff --git a/system/src/Grav/Common/Data/BlueprintSchema.php b/system/src/Grav/Common/Data/BlueprintSchema.php index db5e6af7d..c28ed7a8d 100644 --- a/system/src/Grav/Common/Data/BlueprintSchema.php +++ b/system/src/Grav/Common/Data/BlueprintSchema.php @@ -115,23 +115,29 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface /** * Flatten data by using blueprints. * - * @param array $data Data to be flattened. - * @param bool $includeAll + * @param array $data Data to be flattened. + * @param bool $includeAll True if undefined properties should also be included. + * @param string $name Property which will be flattened, useful for flattening repeating data. * @return array */ - public function flattenData(array $data, bool $includeAll = false) + public function flattenData(array $data, bool $includeAll = false, string $name = '') { + $prefix = $name !== '' ? $name . '.' : ''; + $list = []; if ($includeAll) { - foreach ($this->items as $key => $rules) { + $items = $name !== '' ? $this->getProperty($name)['fields'] ?? [] : $this->items; + foreach ($items as $key => $rules) { $type = $rules['type'] ?? ''; if (!str_starts_with($type, '_') && !str_contains($key, '*')) { - $list[$key] = null; + $list[$prefix . $key] = null; } } } - return array_replace($list, $this->flattenArray($data, $this->nested, '')); + $nested = $this->getNestedRules($name); + + return array_replace($list, $this->flattenArray($data, $nested, $prefix)); } /**