Added third $name parameter to Blueprint::flattenData() method, useful for flattening repeating data

This commit is contained in:
Matias Griese
2021-11-25 11:07:20 +02:00
parent 6e9f6e8f7a
commit a8d292a0d9
3 changed files with 18 additions and 10 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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));
}
/**