Skip to content

Commit

Permalink
feat!: resolve files field with toFiles inside toResolvedBlocks
Browse files Browse the repository at this point in the history
  • Loading branch information
johannschopplich committed Mar 20, 2023
1 parent 7271926 commit 5159293
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 20 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 [
Expand All @@ -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
Expand Down
39 changes: 21 additions & 18 deletions src/extensions/fieldMethods.php
Original file line number Diff line number Diff line change
@@ -1,44 +1,47 @@
<?php

$imageResolver = function (\Kirby\Cms\Block $item) {
$filesResolver = function (\Kirby\Cms\Block $item) {
foreach (array_values(option('blocksResolver.files', ['image' => '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(
Expand All @@ -51,7 +54,7 @@
$field = $block->content()->get($key);

$block->content()->update([
$key => $field->toBlocks()->map($imageFieldResolver)->toArray()
$key => $field->toBlocks()->map($filesFieldResolver)->toArray()
]);
}

Expand All @@ -64,26 +67,26 @@
*
* @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);
},

/**
* Enhances the `toLayouts()` method to resolve images
*
* @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;
Expand Down

0 comments on commit 5159293

Please sign in to comment.