From 55683f76822be16e1b7d547d04814cde67b8cdc8 Mon Sep 17 00:00:00 2001 From: Sebastian Blank Date: Fri, 5 May 2023 12:40:36 +0200 Subject: [PATCH] Fix: Block fields in object bricks are always output as null even though they are filled (#734) * Fix: Block fields in object bricks are always output as null even though they are filled * Fix PhpStan * Fix: language arg is ignored --- .../Block.php | 19 ++++++++++++++----- src/GraphQL/Service.php | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/GraphQL/DataObjectQueryFieldConfigGenerator/Block.php b/src/GraphQL/DataObjectQueryFieldConfigGenerator/Block.php index 625b7f42..8b3db209 100644 --- a/src/GraphQL/DataObjectQueryFieldConfigGenerator/Block.php +++ b/src/GraphQL/DataObjectQueryFieldConfigGenerator/Block.php @@ -75,6 +75,9 @@ public function getResolver($attribute, $fieldDefinition, $class) $isBrick = false; $attributeParts = explode('~', $attribute); $fieldname = $fieldDefinition->getName(); + $brickDescriptor = null; + $brickType = null; + $brickKey = null; if (count($attributeParts) > 1) { $id = $value['id']; @@ -85,9 +88,13 @@ public function getResolver($attribute, $fieldDefinition, $class) } $context = ['object' => $object]; - $brickDescriptor = null; $brickType = $attributeParts[0]; + if (strpos($brickType, '?') !== false) { + $brickDescriptor = substr($brickType, 1); + $brickDescriptor = json_decode($brickDescriptor, true); + $brickType = $brickDescriptor['containerKey']; + } $brickKey = $attributeParts[1]; $key = Service::getFieldForBrickType($object->getclass(), $brickType); @@ -152,8 +159,9 @@ public function getResolver($attribute, $fieldDefinition, $class) $blockDescriptor['__fcType'] = $originalValue['__fcType']; $blockDescriptor['__itemIdx'] = $originalValue['__itemIdx']; } elseif ($isBrick) { - $blockDescriptor['__brickType'] = $attributeParts[0]; - $blockDescriptor['__brickKey'] = $attributeParts[1]; + $blockDescriptor['__brickDescriptor'] = $brickDescriptor; + $blockDescriptor['__brickType'] = $brickType; + $blockDescriptor['__brickKey'] = $brickKey; } $result[$blockIndex][$localizedDef->getName()] = $blockDescriptor; @@ -174,8 +182,9 @@ public function getResolver($attribute, $fieldDefinition, $class) $blockDescriptor['__fcType'] = $originalValue['__fcType']; $blockDescriptor['__itemIdx'] = $originalValue['__itemIdx']; } elseif ($isBrick) { - $blockDescriptor['__brickType'] = $attributeParts[0]; - $blockDescriptor['__brickKey'] = $attributeParts[1]; + $blockDescriptor['__brickDescriptor'] = $brickDescriptor; + $blockDescriptor['__brickType'] = $brickType; + $blockDescriptor['__brickKey'] = $brickKey; } $result[$blockIndex][$key] = $blockDescriptor; diff --git a/src/GraphQL/Service.php b/src/GraphQL/Service.php index 2026b11f..63ba02d8 100644 --- a/src/GraphQL/Service.php +++ b/src/GraphQL/Service.php @@ -986,7 +986,7 @@ public static function resolveValue(BaseDescriptor $descriptor, Data $fieldDefin } } elseif (isset($descriptorData['__brickType']) && $descriptorData['__brickType']) { $context = ['object' => $object]; - $brickDescriptor = null; + $brickDescriptor = $descriptorData['__brickDescriptor'] ?? null; $brickType = $descriptorData['__brickType']; $brickKey = $descriptorData['__brickKey']; @@ -1008,7 +1008,7 @@ public static function resolveValue(BaseDescriptor $descriptor, Data $fieldDefin } if (!empty($key)) { - $blockData = self::getValueForObject($object, $key, $brickType, $brickKey, $def, $context, $brickDescriptor, $args); + $blockData = self::getValueForObject($object, $key, $brickType, $brickKey, $def, $context, $brickDescriptor, $descriptorData['args'] ?? []); } } else { $blockGetter = 'get'.ucfirst($descriptorData['__blockName']);