From 51592930185f924a50d082f2326f486367c246a0 Mon Sep 17 00:00:00 2001 From: Johann Schopplich Date: Mon, 20 Mar 2023 19:56:17 +0100 Subject: [PATCH] feat!: resolve files field with `toFiles` inside `toResolvedBlocks` --- README.md | 4 ++-- src/extensions/fieldMethods.php | 39 ++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 1b2fa56..07524e2 100755 --- a/README.md +++ b/README.md @@ -249,8 +249,6 @@ The `toResolvedBlocks()` method is a wrapper around the `toBlocks()` method. It' This field method will resolve the UUIDs to the actual file or page objects, so you can access their properties directly in your frontend. -> ℹ️ At the moment, only image references are resolved. If you need to resolve other references, please open an issue. - ```php # /site/config/config.php return [ @@ -267,6 +265,8 @@ return [ For an example, take a look at the 🍫 [Cacao Kit frontend](https://github.com/johannschopplich/cacao-kit-frontend). +> ℹ️ At the moment, only image references are resolved. If you need to resolve other references, please open an issue. + ## Advanced ### API Builder diff --git a/src/extensions/fieldMethods.php b/src/extensions/fieldMethods.php index ed5be56..07bec4c 100644 --- a/src/extensions/fieldMethods.php +++ b/src/extensions/fieldMethods.php @@ -1,44 +1,47 @@ 'image'])) as $key) { - /** @var \Kirby\Cms\File|null $image */ - $image = $item->content()->get($key)->toFile(); + /** @var \Kirby\Cms\Files $images */ + $images = $item->content()->get($key)->toFiles(); - if (!$image) { + if ($images->count() === 0) { continue; } + // Get already resolved images + $resolved = $item->content()->get('resolved')->or([])->value(); + // Replace the image field with the resolved image $item->content()->update([ - 'resolved' => [ - $key => [ + 'resolved' => array_merge($resolved, [ + $key => $images->map(fn ($image) => [ 'url' => $image->url(), 'width' => $image->width(), 'height' => $image->height(), 'srcset' => $image->srcset(), 'alt' => $image->alt()->value() - ] - ] + ])->values() + ]) ]); } return $item; }; -$imageFieldResolver = function (\Kirby\Cms\Block $block) use ($imageResolver) { +$filesFieldResolver = function (\Kirby\Cms\Block $block) use ($filesResolver) { if (in_array( $block->type(), array_keys(option('blocksResolver.files', ['image' => 'image'])), true )) { - return $imageResolver($block); + return $filesResolver($block); } return $block; }; -$nestedBlocksResolver = function (\Kirby\Cms\Block $block) use ($imageFieldResolver) { +$nestedBlocksFieldResolver = function (\Kirby\Cms\Block $block) use ($filesFieldResolver) { /** @var \Kirby\Cms\Block $block */ $nestedBlocks = option('blocksResolver.nested', ['prose']); $blocksKeys = array_filter( @@ -51,7 +54,7 @@ $field = $block->content()->get($key); $block->content()->update([ - $key => $field->toBlocks()->map($imageFieldResolver)->toArray() + $key => $field->toBlocks()->map($filesFieldResolver)->toArray() ]); } @@ -64,11 +67,11 @@ * * @kql-allowed */ - 'toResolvedBlocks' => function (\Kirby\Cms\Field $field) use ($imageFieldResolver, $nestedBlocksResolver) { + 'toResolvedBlocks' => function (\Kirby\Cms\Field $field) use ($filesFieldResolver, $nestedBlocksFieldResolver) { return $field ->toBlocks() - ->map($nestedBlocksResolver) - ->map($imageFieldResolver); + ->map($nestedBlocksFieldResolver) + ->map($filesFieldResolver); }, /** @@ -76,14 +79,14 @@ * * @kql-allowed */ - 'toResolvedLayouts' => function (\Kirby\Cms\Field $field) use ($imageFieldResolver) { + 'toResolvedLayouts' => function (\Kirby\Cms\Field $field) use ($filesFieldResolver) { return $field ->toLayouts() - ->map(function (\Kirby\Cms\Layout $layout) use ($imageFieldResolver) { + ->map(function (\Kirby\Cms\Layout $layout) use ($filesFieldResolver) { $columns = $layout->columns(); foreach ($columns as $column) { - $column->blocks()->map($imageFieldResolver); + $column->blocks()->map($filesFieldResolver); } return $layout;