From 41589d7d0442d486220cf934ffb245de0324d849 Mon Sep 17 00:00:00 2001 From: Krzysztof Grabania Date: Thu, 20 Oct 2022 10:15:16 +0200 Subject: [PATCH 1/2] fix disabled cast when in Nova context --- src/Concerns/HasFlexible.php | 17 ----------------- src/Value/Resolver.php | 23 ++++++++++++++++++++++- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/Concerns/HasFlexible.php b/src/Concerns/HasFlexible.php index 0ae1a335..035c50fc 100644 --- a/src/Concerns/HasFlexible.php +++ b/src/Concerns/HasFlexible.php @@ -3,7 +3,6 @@ namespace Whitecube\NovaFlexibleContent\Concerns; use Illuminate\Support\Collection as BaseCollection; -use Laravel\Nova\NovaServiceProvider; use Whitecube\NovaFlexibleContent\Layouts\Collection; use Whitecube\NovaFlexibleContent\Layouts\Layout; use Whitecube\NovaFlexibleContent\Value\FlexibleCast; @@ -32,22 +31,6 @@ public function flexible($attribute, $layoutMapping = []) * @return \Whitecube\NovaFlexibleContent\Layouts\Collection */ public function cast($value, $layoutMapping = []) - { - if (app()->getProvider(NovaServiceProvider::class) && ! app()->runningInConsole()) { - return $value; - } - - return $this->toFlexible($value ?: null, $layoutMapping); - } - - /** - * Parse a Flexible Content from value - * - * @param mixed $value - * @param array $layoutMapping - * @return \Whitecube\NovaFlexibleContent\Layouts\Collection - */ - public function toFlexible($value, $layoutMapping = []) { $flexible = $this->getFlexibleArrayFromValue($value); diff --git a/src/Value/Resolver.php b/src/Value/Resolver.php index 65615e3c..903b8a2f 100644 --- a/src/Value/Resolver.php +++ b/src/Value/Resolver.php @@ -2,6 +2,7 @@ namespace Whitecube\NovaFlexibleContent\Value; +use Illuminate\Database\Eloquent\Concerns\HasAttributes; use Illuminate\Support\Collection; class Resolver implements ResolverInterface @@ -57,7 +58,13 @@ public function get($resource, $attribute, $layouts) */ protected function extractValueFromResource($resource, $attribute) { - $value = data_get($resource, str_replace('->', '.', $attribute)) ?? []; + $attribute = str_replace('->', '.', $attribute); + + if ($this->attributeIsFlexible($resource, $attribute)) { + $value = $resource->getRawOriginal($attribute) ?? []; + } else { + $value = data_get($resource, $attribute) ?? []; + } if ($value instanceof Collection) { $value = $value->toArray(); @@ -74,4 +81,18 @@ protected function extractValueFromResource($resource, $attribute) return is_array($item) ? (object) $item : $item; }, $value); } + + /** + * Indicate whether resource attribute is flexible or not. + * + * @param mixed $resource + * @param string $attribute + * @return bool + */ + protected function attributeIsFlexible($resource, $attribute) + { + return is_object($resource) && + in_array(HasAttributes::class, class_uses_recursive($resource), true) && + is_subclass_of($resource->getCasts()[$attribute] ?? null, FlexibleCast::class); + } } From 9ee91c8550c8af00ebb988b2554a0a073afa7e75 Mon Sep 17 00:00:00 2001 From: Krzysztof Grabania Date: Thu, 20 Oct 2022 11:34:52 +0200 Subject: [PATCH 2/2] simplify fix for missing cast in Nova context --- src/Value/Resolver.php | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/Value/Resolver.php b/src/Value/Resolver.php index 903b8a2f..7ee9d765 100644 --- a/src/Value/Resolver.php +++ b/src/Value/Resolver.php @@ -2,8 +2,9 @@ namespace Whitecube\NovaFlexibleContent\Value; -use Illuminate\Database\Eloquent\Concerns\HasAttributes; use Illuminate\Support\Collection; +use Whitecube\NovaFlexibleContent\Layouts\Collection as LayoutsCollection; +use Whitecube\NovaFlexibleContent\Layouts\Layout; class Resolver implements ResolverInterface { @@ -39,13 +40,16 @@ public function get($resource, $attribute, $layouts) $value = $this->extractValueFromResource($resource, $attribute); return collect($value)->map(function ($item) use ($layouts) { - $layout = $layouts->find($item->layout); + $layout = $layouts->find($item instanceof Layout ? $item->name() : $item->layout); if (! $layout) { return; } - return $layout->duplicateAndHydrate($item->key, (array) $item->attributes); + $key = $item instanceof Layout ? $item->key() : $item->key; + $attributes = $item instanceof Layout ? $item->getAttributes() : (array) $item->attributes; + + return $layout->duplicateAndHydrate($key, $attributes); })->filter()->values(); } @@ -58,15 +62,11 @@ public function get($resource, $attribute, $layouts) */ protected function extractValueFromResource($resource, $attribute) { - $attribute = str_replace('->', '.', $attribute); - - if ($this->attributeIsFlexible($resource, $attribute)) { - $value = $resource->getRawOriginal($attribute) ?? []; - } else { - $value = data_get($resource, $attribute) ?? []; - } + $value = data_get($resource, str_replace('->', '.', $attribute)) ?? []; - if ($value instanceof Collection) { + if ($value instanceof LayoutsCollection) { + $value = $value->all(); + } elseif ($value instanceof Collection) { $value = $value->toArray(); } elseif (is_string($value)) { $value = json_decode($value) ?? []; @@ -81,18 +81,4 @@ protected function extractValueFromResource($resource, $attribute) return is_array($item) ? (object) $item : $item; }, $value); } - - /** - * Indicate whether resource attribute is flexible or not. - * - * @param mixed $resource - * @param string $attribute - * @return bool - */ - protected function attributeIsFlexible($resource, $attribute) - { - return is_object($resource) && - in_array(HasAttributes::class, class_uses_recursive($resource), true) && - is_subclass_of($resource->getCasts()[$attribute] ?? null, FlexibleCast::class); - } }