From 13c758f1401bb73af84bb1379e7af51c890d470c Mon Sep 17 00:00:00 2001 From: Stefan Hagspiel Date: Thu, 30 May 2024 11:18:58 +0200 Subject: [PATCH] add property_normalizer.default_type_mapping config (#216) * add property_normalizer.default_type_mapping config * remove invalid normalizer from accordion config * respect thumbnail config in normalizer --- UPGRADE.md | 5 +++++ config/core_areas/accordion_config.yaml | 1 - docs/90_Headless.md | 19 ++++++++++++++++--- src/DependencyInjection/Configuration.php | 19 +++++++++++++++++++ src/Document/Editable/EditableWorker.php | 19 +++++++++++++++++-- .../Editable/HeadlessEditableRenderer.php | 3 ++- src/Document/Response/HeadlessResponse.php | 8 +++++++- src/Normalizer/ImageEditableNormalizer.php | 11 +++++++++-- 8 files changed, 75 insertions(+), 10 deletions(-) diff --git a/UPGRADE.md b/UPGRADE.md index ba275ce..7f44178 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,5 +1,10 @@ # Upgrade Notes +## 5.1.0 +- [NEW FEATURE] Add `property_normalizer.default_type_mapping` feature +- [ENHANCEMENT] Respect thumbnail config in normalizer +- [BUGFIX] Remove invalid normalizer from accordion config + ## 5.0.5 - Add `caption`, `marker` and `hotspots` to image normalizer diff --git a/config/core_areas/accordion_config.yaml b/config/core_areas/accordion_config.yaml index aaa1e41..4012c2b 100644 --- a/config/core_areas/accordion_config.yaml +++ b/config/core_areas/accordion_config.yaml @@ -32,7 +32,6 @@ toolbox: ac_name: type: input title: 'Name' - property_normalizer: ToolboxBundle\Normalizer\DownloadRelationsNormalizer ac_data: type: areablock title: 'Content' diff --git a/docs/90_Headless.md b/docs/90_Headless.md index 7b4e71e..8ef578c 100644 --- a/docs/90_Headless.md +++ b/docs/90_Headless.md @@ -152,7 +152,7 @@ This normalizer will transform gallery relations to thumbnail data arrays ### ImageEditableNormalizer This normalizer will transform the inline image editable to a thumbnail data array -## Custom normalizer +### Custom normalizer First, you need to add your normalizer: ```yaml @@ -179,8 +179,8 @@ class MyNormalizer implements PropertyNormalizerInterface } } ``` -Then, assign them: +Then, assign them: ```yaml toolbox: areas: @@ -198,4 +198,17 @@ toolbox: config: ~ additional_property_normalizer: myAdditionalProperty: App\Normalizer\MyNormalizer # normalize your config property, added in your "headlessAction() method -``` \ No newline at end of file +``` + +### Default normalizer definition +If you want to apply a normalizer to every element of type `checkbox`, you're able to define it globally: + +```yaml +toolbox: + property_normalizer: + default_type_mapping: + checkbox: App\Normalizer\MyNormalizer +``` + +> It is still possible, to override the default mapping by using the `property_normalizer` in your element config +> since those will be processed with the highest priority! \ No newline at end of file diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 11ae386..7933c54 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -48,6 +48,7 @@ public function addContextNode(ArrayNodeDefinition $rootNode): void ->append($this->buildAreaBlockConfiguration()) ->append($this->buildThemeConfiguration()) ->append($this->buildDataAttributeConfiguration()) + ->append($this->buildPropertyNormalizerDefaultsConfiguration()) ->end() ->end() ->end() @@ -68,6 +69,7 @@ public function addRootNode(ArrayNodeDefinition $rootNode): void ->append($this->buildAreaBlockConfiguration()) ->append($this->buildThemeConfiguration()) ->append($this->buildDataAttributeConfiguration()) + ->append($this->buildPropertyNormalizerDefaultsConfiguration()) ->end(); } @@ -316,6 +318,23 @@ protected function buildDataAttributeConfiguration(): ArrayNodeDefinition return $treeBuilder; } + protected function buildPropertyNormalizerDefaultsConfiguration(): ArrayNodeDefinition + { + $treeBuilder = new ArrayNodeDefinition('property_normalizer'); + + $treeBuilder + ->addDefaultsIfNotSet() + ->children() + ->arrayNode('default_type_mapping') + ->useAttributeAsKey('name') + ->prototype('scalar') + ->end() + ->end() + ->end(); + + return $treeBuilder; + } + protected function buildAreasSection(): ArrayNodeDefinition { $treeBuilder = new ArrayNodeDefinition('areas'); diff --git a/src/Document/Editable/EditableWorker.php b/src/Document/Editable/EditableWorker.php index 4f0b883..e217ded 100644 --- a/src/Document/Editable/EditableWorker.php +++ b/src/Document/Editable/EditableWorker.php @@ -106,12 +106,15 @@ private function processSimpleEditableData(HeadlessResponse $data): array $normalizedData = []; $config = $data->getEditableConfiguration(); + $editableType = $data->getEditableType(); $elementData = $data->getInlineConfigElementData(); foreach ($elementData as $configName => $configData) { if (array_key_exists('property_normalizer', $config) && $config['property_normalizer'] !== null) { $configData = $this->applyNormalizer($config['property_normalizer'], $configData); + } elseif (null !== $defaultNormalizer = $this->getDefaultNormalizer($editableType)) { + $configData = $this->applyNormalizer($defaultNormalizer, $configData); } elseif ($configData instanceof Editable) { $configData = $configData->render(); } else { @@ -144,8 +147,12 @@ private function processElementData(HeadlessResponse $data, string $areaName): a $configData = $this->applyNormalizer($configElements[$configName], $configData); } elseif ($configBlockName !== 'additional_property_normalizer') { $configNode = $this->findBrickConfigNode($configName, $configElements); - if ($configNode !== null && $configNode['property_normalizer'] !== null) { - $configData = $this->applyNormalizer($configNode['property_normalizer'], $configData); + if ($configNode !== null) { + if ($configNode['property_normalizer'] !== null) { + $configData = $this->applyNormalizer($configNode['property_normalizer'], $configData); + } elseif (null !== $defaultNormalizer = $this->getDefaultNormalizer($configNode['type'])) { + $configData = $this->applyNormalizer($defaultNormalizer, $configData); + } } } @@ -181,6 +188,14 @@ private function applyNormalizer(string $normalizerName, mixed $value) return $this->normalizerRegistry->get($normalizerName)->normalize($value, $this->configManager->getContextIdentifier()); } + private function getDefaultNormalizer(string $type): ?string + { + $propertyNormalizerConfig = $this->configManager->getConfig('property_normalizer'); + $defaultMapping = $propertyNormalizerConfig['default_type_mapping']; + + return $defaultMapping[$type] ?? null; + } + private function getBlockState(): BlockState { return $this->blockStateStack->getCurrentState(); diff --git a/src/Document/Editable/HeadlessEditableRenderer.php b/src/Document/Editable/HeadlessEditableRenderer.php index 2cf3dd7..8b45e8c 100644 --- a/src/Document/Editable/HeadlessEditableRenderer.php +++ b/src/Document/Editable/HeadlessEditableRenderer.php @@ -190,8 +190,9 @@ private function processEditable(HeadlessEditableInfo $headlessEditableInfo, boo $simpleHeadlessResponse = new HeadlessResponse( HeadlessResponse::TYPE_EDITABLE, + $type, $headlessEditableInfo->getBrickParent(), - $headlessEditableInfo->getEditableConfiguration() + $headlessEditableInfo->getEditableConfiguration(), ); $simpleHeadlessResponse->setInlineConfigElementData([$editable->getRealName() => $editable]); diff --git a/src/Document/Response/HeadlessResponse.php b/src/Document/Response/HeadlessResponse.php index bab3391..d88c5ce 100644 --- a/src/Document/Response/HeadlessResponse.php +++ b/src/Document/Response/HeadlessResponse.php @@ -16,8 +16,9 @@ class HeadlessResponse public function __construct( protected string $type, + protected ?string $editableType = null, protected ?string $brickParent = null, - protected ?array $editableConfiguration = null + protected ?array $editableConfiguration = null, ) { } @@ -26,6 +27,11 @@ public function getType(): string return $this->type; } + public function getEditableType(): ?string + { + return $this->editableType; + } + public function hasBrickParent(): bool { return $this->brickParent !== null; diff --git a/src/Normalizer/ImageEditableNormalizer.php b/src/Normalizer/ImageEditableNormalizer.php index 22d8b64..ca668ee 100644 --- a/src/Normalizer/ImageEditableNormalizer.php +++ b/src/Normalizer/ImageEditableNormalizer.php @@ -20,8 +20,15 @@ public function normalize(mixed $value, ?string $toolboxContextId = null): mixed return $value; } - $imageLightbox = $this->configManager->getImageThumbnailFromConfig('image_lightbox'); - $imageElement = $this->configManager->getImageThumbnailFromConfig('image_element'); + $config = $value->getConfig(); + + $imageLightbox = array_key_exists('lightbox_thumbnail', $config) + ? $config['lightbox_thumbnail'] + : $this->configManager->getImageThumbnailFromConfig('image_lightbox'); + + $imageElement = array_key_exists('thumbnail', $config) + ? $config['thumbnail'] + : $this->configManager->getImageThumbnailFromConfig('image_element'); if ($value->getThumbnailConfig()) { $imageElement = $value->getThumbnailConfig();