From 858421a9eb65c74d41969473f3d168a98e122fec Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Wed, 15 Oct 2025 14:48:00 +0200 Subject: [PATCH] fix: prevent broken link upon thumbnail in variety list when having uploaded a PNG file --- app/Repositories/Core/Medias.php | 60 ++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/app/Repositories/Core/Medias.php b/app/Repositories/Core/Medias.php index fb7ca0f9..d59d1b78 100644 --- a/app/Repositories/Core/Medias.php +++ b/app/Repositories/Core/Medias.php @@ -2,6 +2,8 @@ namespace App\Repositories\Core; +use Spatie\MediaLibrary\MediaCollections\Models\Media as MediaModel; + class Medias { public static function getImage($model, $conversion = 'normal', $collection = 'images') @@ -79,13 +81,9 @@ class Medias public static function getImageSrc($image) { - if (! $image) { - return null; - } - $id = $image['id']; - $filename = self::getFilename($image); + $media = self::resolveMedia($image); - return "/storage/{$id}/{$filename}"; + return $media ? $media->getUrl() : null; } public static function getThumbSrc($image) @@ -110,6 +108,12 @@ class Medias public static function getSrcByType($image, $type) { + $media = self::resolveMedia($image); + + if ($media) { + return $type ? $media->getUrl($type) : $media->getUrl(); + } + return $image ? '/storage/'.$image['id'].'/conversions/'.self::getFilename($image, $type) : false; } @@ -124,4 +128,48 @@ class Medias { return str_replace(['#', '/', '\\', ' '], '-', $name); } + + protected static function resolveMedia($image): ?MediaModel + { + if ($image instanceof MediaModel) { + return $image; + } + + if (is_null($image)) { + return null; + } + + if (is_array($image)) { + return self::hydrateMedia($image); + } + + if (is_object($image)) { + if ($image instanceof \ArrayAccess) { + return self::hydrateMedia((array) $image); + } + + $array = method_exists($image, 'toArray') ? $image->toArray() : (array) $image; + + return self::hydrateMedia($array); + } + + $id = data_get($image, 'id'); + + return $id ? MediaModel::query()->withoutGlobalScopes()->find($id) : null; + } + + protected static function hydrateMedia(array $attributes): ?MediaModel + { + $id = data_get($attributes, 'id'); + + if (! $id) { + return null; + } + + $media = new MediaModel(); + $media->forceFill($attributes); + $media->exists = true; + + return $media; + } }