From b1357a6ffec3eff6d0d56c4430eab62f1b8bcaf4 Mon Sep 17 00:00:00 2001 From: Oliver Rasche Date: Fri, 23 Oct 2026 14:13:56 +0200 Subject: [PATCH] Megamenu: ship menu images as processed 640px webp MenuBuilder::image() returned getPublicUrl() of the ORIGINAL upload, so the Success Stories teaser cards (and item/featured images) carried multi-MB files into every page payload. All menu images now go through the ImageService (maxWidth 640, webp - the search-tile convention); width/height report the processed size, and the original URL remains the fallback when processing fails so the menu never loses an image. Co-Authored-By: Claude Fable 5 --- .../Classes/Service/MenuBuilder.php | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/packages/evo_megamenu_json/Classes/Service/MenuBuilder.php b/packages/evo_megamenu_json/Classes/Service/MenuBuilder.php index d234866..d7c4d57 100644 --- a/packages/evo_megamenu_json/Classes/Service/MenuBuilder.php +++ b/packages/evo_megamenu_json/Classes/Service/MenuBuilder.php @@ -14,6 +14,7 @@ use TYPO3\CMS\Core\Domain\Repository\PageRepository; use TYPO3\CMS\Core\Resource\FileRepository; use TYPO3\CMS\Core\Service\FlexFormService; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Service\ImageService; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; /** @@ -349,13 +350,33 @@ final class MenuBuilder return null; } try { - return [ - 'url' => $reference->getPublicUrl(), - 'alternative' => (string)$reference->getProperty('alternative'), - 'title' => (string)$reference->getProperty('title'), - 'width' => (int)$reference->getProperty('width'), - 'height' => (int)$reference->getProperty('height'), - ]; + // Menu tiles are small: ship a processed 640px webp instead of the + // original upload - multi-MB teaser images went over the wire + // (found 2026-10-23). 640 matches the search-tile convention; the + // original URL stays the fallback when processing fails, so the + // menu never loses an image over a converter hiccup. + try { + $imageService = GeneralUtility::makeInstance(ImageService::class); + $processed = $imageService->applyProcessingInstructions( + $reference, + ['maxWidth' => 640, 'fileExtension' => 'webp'] + ); + return [ + 'url' => $imageService->getImageUri($processed), + 'alternative' => (string)$reference->getProperty('alternative'), + 'title' => (string)$reference->getProperty('title'), + 'width' => (int)$processed->getProperty('width'), + 'height' => (int)$processed->getProperty('height'), + ]; + } catch (\Throwable) { + return [ + 'url' => $reference->getPublicUrl(), + 'alternative' => (string)$reference->getProperty('alternative'), + 'title' => (string)$reference->getProperty('title'), + 'width' => (int)$reference->getProperty('width'), + 'height' => (int)$reference->getProperty('height'), + ]; + } } catch (\Throwable) { return null; }