From 99aa903da23e477dd2dbb386ae77d86a0d6be90b Mon Sep 17 00:00:00 2001 From: Simon Schmidt Date: Tue, 31 Mar 2026 13:11:43 +0200 Subject: [PATCH 1/3] [FEATURE] allow metadata generation for images in a folder --- Classes/Controller/ModuleController.php | 39 ++++++++++++++++++ .../EventListeners/AddFileButtonListener.php | 40 +++++++++++++++---- Configuration/Backend/Modules.php | 1 + .../Private/Language/Backend/de.locallang.xlf | 16 ++++++++ .../Private/Language/Backend/locallang.xlf | 12 ++++++ 5 files changed, 100 insertions(+), 8 deletions(-) diff --git a/Classes/Controller/ModuleController.php b/Classes/Controller/ModuleController.php index 92e214d..56b7775 100644 --- a/Classes/Controller/ModuleController.php +++ b/Classes/Controller/ModuleController.php @@ -11,6 +11,8 @@ use TYPO3\CMS\Core\Messaging\FlashMessageService; use TYPO3\CMS\Core\Resource\File; use TYPO3\CMS\Core\Resource\FileRepository; +use TYPO3\CMS\Core\Resource\Folder; +use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; @@ -23,6 +25,7 @@ public function __construct( readonly protected FileRepository $fileRepository, readonly protected FlashMessageService $flashMessageService, readonly protected UriBuilder $uriBuilderCore, + readonly protected ResourceFactory $resourceFactory, ) { } @@ -44,6 +47,13 @@ public function addMetadataAction(int $file): ResponseInterface } return $this->openFileList($file); } + public function addMetadataFromFolderAction(string $folderName): ResponseInterface + { + $folder = $this->resourceFactory->getFolderObjectFromCombinedIdentifier($folderName); + $this->addMetaDataToFolder($folder); + + return $this->redirectToUri($this->uriBuilderCore->buildUriFromRoute('media_management', ['id' => $folder->getParentFolder()->getCombinedIdentifier()])); + } protected function openFileList(File $file): ResponseInterface { @@ -58,4 +68,33 @@ protected function addMessage(string $message, ContextualFeedbackSeverity $sever $messageQueue = $this->flashMessageService->getMessageQueueByIdentifier(); $messageQueue->addMessage($message); } + + protected function addMetaDataToFolder(Folder $folder): void + { + $errors = 0; + $successes = 0; + foreach ($folder->getFiles() as $file) { + if ($this->alternativeService->setImageMetadata($file, false)) { + $successes++; + } else { + $errors++; + } + } + + if ($successes) { + $singular = $successes === 1 ? '_singular' : ''; + $this->addMessage(LocalizationUtility::translate( + 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:bulk_action' . $singular . '.finished', 'alternative', [$successes] + )); + } + if ($errors) { + $singular = $errors === 1 ? '_singular' : ''; + $this->addMessage( + LocalizationUtility::translate( + 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:bulk_action' . $singular . '.notfinished', 'alternative', [$errors] + ), + ContextualFeedbackSeverity::ERROR + ); + } + } } diff --git a/Classes/EventListeners/AddFileButtonListener.php b/Classes/EventListeners/AddFileButtonListener.php index 70ec6c2..54a250a 100644 --- a/Classes/EventListeners/AddFileButtonListener.php +++ b/Classes/EventListeners/AddFileButtonListener.php @@ -1,6 +1,6 @@ setTitle(LocalizationUtility::translate( + 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:button.translate') + ) + ->setIcon($this->iconFactory->getIcon('extension-alternative-icon-magic', IconSize::SMALL)) + ->setHref( + (string)$this->uriBuilder->buildUriFromRoute( + 'alternative_Module.Module_addMetadataFromFolder', + ['folderName' => $event->getResource()->getStorage()->getUid() . ':' . $event->getResource()->getIdentifier()] + ) + ); + } + /** * Todo: Can be removed once TYPO3 13 support is dropped * @@ -73,10 +91,14 @@ protected function addButtonLegacy(ProcessFileListActionsEvent $event): void { if ((new Typo3Version())->getMajorVersion() === 13) { $actionItems = $event->getActionItems(); - $actionItems = $this->insertArrayIntoArray( - $actionItems, - ['metadata2' => $this->getButton($event, $actionItems['metadata'])] - ); + if ($actionItems['metadata'] !== null) { + $actionItems = $this->insertArrayIntoArray( + $actionItems, + ['metadata2' => $this->getButton($event, $actionItems['metadata'])] + ); + } else { + $actionItems['metadata'] = $this->createFolderButton($event); + } $event->setActionItems($actionItems); } } @@ -100,10 +122,12 @@ protected function insertArrayIntoArray(array $existingArray, array $addArray, s return array_merge($firstPart, $addArray, $lastPart); } - protected function isActivated(ResourceInterface $file): bool + protected function isActivated(ResourceInterface $resource): bool { - return is_a($file, File::class, true) - && FileUtility::isImage($file) + return ( + (is_a($resource, File::class, true) && FileUtility::isImage($resource)) + || is_a($resource, Folder::class, true) + ) && $this->hasAccessToModule() && ConfigurationUtility::getConfigurationByKey('showButtonInFileList') === '1'; } diff --git a/Configuration/Backend/Modules.php b/Configuration/Backend/Modules.php index 412192e..dd11c80 100644 --- a/Configuration/Backend/Modules.php +++ b/Configuration/Backend/Modules.php @@ -14,6 +14,7 @@ 'controllerActions' => [ ModuleController::class => [ 'addMetadata', + 'addMetadataFromFolder', ], ], ], diff --git a/Resources/Private/Language/Backend/de.locallang.xlf b/Resources/Private/Language/Backend/de.locallang.xlf index 82eea25..805bb9a 100644 --- a/Resources/Private/Language/Backend/de.locallang.xlf +++ b/Resources/Private/Language/Backend/de.locallang.xlf @@ -15,6 +15,22 @@ Metadata could not be added Metadaten konnten nicht gesetzt werden + + Metadata successfully added for %1$s file + Metadaten erfolgreich für %1$s Datei gesetzt + + + Metadata could not be added for %1$s file + Metadaten konnten für %1$s Datei nicht gesetzt werden + + + Metadata successfully added for %1$s files + Metadaten erfolgreich für %1$s Dateien gesetzt + + + Metadata could not be added for %1$s files + Metadaten konnten für %1$s Dateien nicht gesetzt werden + diff --git a/Resources/Private/Language/Backend/locallang.xlf b/Resources/Private/Language/Backend/locallang.xlf index 8e6850e..e1dabb9 100644 --- a/Resources/Private/Language/Backend/locallang.xlf +++ b/Resources/Private/Language/Backend/locallang.xlf @@ -12,6 +12,18 @@ Metadata could not be added + + Metadata successfully added for %1$s file + + + Metadata could not be added for %1$s file + + + Metadata successfully added for %1$s files + + + Metadata could not be added for %1$s files + From 19ca1c337613cd88f8b08acf6410c014b03bfe8e Mon Sep 17 00:00:00 2001 From: Simon Schmidt Date: Mon, 13 Apr 2026 14:58:29 +0200 Subject: [PATCH 2/3] [BUGFIX] filter out non image files --- Classes/Controller/ModuleController.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Classes/Controller/ModuleController.php b/Classes/Controller/ModuleController.php index 56b7775..9173af9 100644 --- a/Classes/Controller/ModuleController.php +++ b/Classes/Controller/ModuleController.php @@ -5,6 +5,7 @@ namespace In2code\Alternative\Controller; use In2code\Alternative\Domain\Service\AlternativeService; +use In2code\Alternative\Utility\FileUtility; use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Core\Messaging\FlashMessage; @@ -74,10 +75,12 @@ protected function addMetaDataToFolder(Folder $folder): void $errors = 0; $successes = 0; foreach ($folder->getFiles() as $file) { - if ($this->alternativeService->setImageMetadata($file, false)) { - $successes++; - } else { - $errors++; + if (FileUtility::isImage($file)) { + if ($this->alternativeService->setImageMetadata($file, false)) { + $successes++; + } else { + $errors++; + } } } From 0d36cac1748a22541f073f17bc0c1eeb64521a4f Mon Sep 17 00:00:00 2001 From: Simon Schmidt Date: Mon, 20 Apr 2026 15:15:48 +0200 Subject: [PATCH 3/3] [TASK] update error handling for bulk action --- Classes/Controller/ModuleController.php | 16 ++-------------- .../Private/Language/Backend/de.locallang.xlf | 11 ++--------- Resources/Private/Language/Backend/locallang.xlf | 6 ------ 3 files changed, 4 insertions(+), 29 deletions(-) diff --git a/Classes/Controller/ModuleController.php b/Classes/Controller/ModuleController.php index 9173af9..d64cb76 100644 --- a/Classes/Controller/ModuleController.php +++ b/Classes/Controller/ModuleController.php @@ -72,32 +72,20 @@ protected function addMessage(string $message, ContextualFeedbackSeverity $sever protected function addMetaDataToFolder(Folder $folder): void { - $errors = 0; $successes = 0; foreach ($folder->getFiles() as $file) { if (FileUtility::isImage($file)) { if ($this->alternativeService->setImageMetadata($file, false)) { $successes++; - } else { - $errors++; } } } if ($successes) { - $singular = $successes === 1 ? '_singular' : ''; + $key = $successes === 1 ? 'bulk_action_singular.finished' : 'bulk_action.finished'; $this->addMessage(LocalizationUtility::translate( - 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:bulk_action' . $singular . '.finished', 'alternative', [$successes] + 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:' . $key, 'alternative', [$successes] )); } - if ($errors) { - $singular = $errors === 1 ? '_singular' : ''; - $this->addMessage( - LocalizationUtility::translate( - 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:bulk_action' . $singular . '.notfinished', 'alternative', [$errors] - ), - ContextualFeedbackSeverity::ERROR - ); - } } } diff --git a/Resources/Private/Language/Backend/de.locallang.xlf b/Resources/Private/Language/Backend/de.locallang.xlf index 805bb9a..5850c3d 100644 --- a/Resources/Private/Language/Backend/de.locallang.xlf +++ b/Resources/Private/Language/Backend/de.locallang.xlf @@ -1,6 +1,7 @@ - +
@@ -18,18 +19,10 @@ Metadata successfully added for %1$s file Metadaten erfolgreich für %1$s Datei gesetzt - - - Metadata could not be added for %1$s file - Metadaten konnten für %1$s Datei nicht gesetzt werden Metadata successfully added for %1$s files Metadaten erfolgreich für %1$s Dateien gesetzt - - - Metadata could not be added for %1$s files - Metadaten konnten für %1$s Dateien nicht gesetzt werden diff --git a/Resources/Private/Language/Backend/locallang.xlf b/Resources/Private/Language/Backend/locallang.xlf index e1dabb9..1c84bac 100644 --- a/Resources/Private/Language/Backend/locallang.xlf +++ b/Resources/Private/Language/Backend/locallang.xlf @@ -15,15 +15,9 @@ Metadata successfully added for %1$s file - - Metadata could not be added for %1$s file - Metadata successfully added for %1$s files - - Metadata could not be added for %1$s files -