From 12eebb950fd099677c6a2aabbd0259860e187c5e Mon Sep 17 00:00:00 2001 From: Olayinka Azeez Date: Thu, 21 Mar 2024 12:32:11 +0100 Subject: [PATCH] added support for medias in json repeaters --- src/Helpers/helpers.php | 7 ++++++ .../Behaviors/HandleJsonRepeaters.php | 21 +++++++++++++++++ src/Repositories/Behaviors/HandleMedias.php | 23 +++++++++++++++---- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/Helpers/helpers.php b/src/Helpers/helpers.php index 777f14255..2a11ed6a7 100644 --- a/src/Helpers/helpers.php +++ b/src/Helpers/helpers.php @@ -311,3 +311,10 @@ function str_after_last($subject, $search) return substr($subject, $position + strlen($search)); } } + +if (! function_exists('getJsonRepeaterMediaRole')) { + function getJsonRepeaterMediaRole($role, $repeaterName, $index): string + { + return "$repeaterName|$index|$role"; + } +} diff --git a/src/Repositories/Behaviors/HandleJsonRepeaters.php b/src/Repositories/Behaviors/HandleJsonRepeaters.php index bf4d85fb1..29e495521 100644 --- a/src/Repositories/Behaviors/HandleJsonRepeaters.php +++ b/src/Repositories/Behaviors/HandleJsonRepeaters.php @@ -47,6 +47,14 @@ public function prepareFieldsBeforeSaveHandleJsonRepeaters($object, $fields) foreach ($this->jsonRepeaters as $repeater) { if (isset($fields['repeaters'][$repeater])) { $fields[$repeater] = $fields['repeaters'][$repeater]; + + foreach ($fields['repeaters'][$repeater] as $index => $repeaterItem) { + if (isset($repeaterItem['medias']) && !empty($repeaterItem['medias'])) { + foreach ($repeaterItem['medias'] as $role => $medias) { + $fields['medias'][getJsonRepeaterMediaRole($role, $repeater, $index)] = $medias; + } + } + } } } @@ -73,6 +81,7 @@ public function getJsonRepeater(array $fields, string $repeaterName, array $seri { $repeatersFields = []; $repeatersBrowsers = []; + $repeatersMedias = []; /** @var \A17\Twill\Services\Blocks\Block[] $repeatersList */ $repeatersList = TwillBlocks::getRepeaters()->keyBy('name'); $repeaters = []; @@ -110,11 +119,23 @@ public function getJsonRepeater(array $fields, string $repeaterName, array $seri 'value' => $value, ]; } + + if (isset($repeaterItem['medias']) && !empty($repeaterItem['medias'])) { + $mediaKeys = array_keys($repeaterItem['medias']); + + foreach ($mediaKeys as $mediaKey) { + $key = getJsonRepeaterMediaRole($mediaKey, $repeaterName, $index); + if (isset($fields['medias'][$key])) { + $repeatersMedias["blocks[$id][$mediaKey]"] = $fields['medias'][$key]; + } + } + } } $fields['repeaters'][$repeaterName] = $repeaters; $fields['repeaterFields'][$repeaterName] = $repeatersFields; $fields['repeaterBrowsers'][$repeaterName] = $repeatersBrowsers; + $fields['repeaterMedias'][$repeaterName] = $repeatersMedias; return $fields; } diff --git a/src/Repositories/Behaviors/HandleMedias.php b/src/Repositories/Behaviors/HandleMedias.php index 4d38b58c1..bb1d1b680 100644 --- a/src/Repositories/Behaviors/HandleMedias.php +++ b/src/Repositories/Behaviors/HandleMedias.php @@ -79,11 +79,7 @@ private function getMedias($fields) $locale = $locale ?? config('app.locale'); - if ( - array_key_exists($role, $this->model->getMediasParams()) - || array_key_exists($role, TwillBlocks::getAllCropConfigs()) - || array_key_exists($role, config('twill.settings.crops', [])) - ) { + if ($this->hasRole($role) || $this->hasJsonRepeaterRole($role)) { Collection::make($mediasForRole)->each(function ($media) use (&$medias, $role, $locale) { $customMetadatas = $media['metadatas']['custom'] ?? []; if (isset($media['crops']) && !empty($media['crops'])) { @@ -212,4 +208,21 @@ public function afterDuplicateHandleMedias(TwillModelContract $original, TwillMo $newObject->medias()->attach($media->id, $newPushData); } } + + private function hasRole($role): bool + { + return array_key_exists($role, $this->model->getMediasParams()) + || array_key_exists($role, TwillBlocks::getAllCropConfigs()) + || array_key_exists($role, config('twill.settings.crops', [])); + } + + private function hasJsonRepeaterRole($role): bool + { + if (! Str::contains($role, '|')) { + return false; + } + + $role = last(explode('|', $role)); + return $this->hasRole($role); + } }