diff --git a/Classes/Controller/ModuleController.php b/Classes/Controller/ModuleController.php index 92e214d..d64cb76 100644 --- a/Classes/Controller/ModuleController.php +++ b/Classes/Controller/ModuleController.php @@ -5,12 +5,15 @@ 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; 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 +26,7 @@ public function __construct( readonly protected FileRepository $fileRepository, readonly protected FlashMessageService $flashMessageService, readonly protected UriBuilder $uriBuilderCore, + readonly protected ResourceFactory $resourceFactory, ) { } @@ -44,6 +48,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 +69,23 @@ protected function addMessage(string $message, ContextualFeedbackSeverity $sever $messageQueue = $this->flashMessageService->getMessageQueueByIdentifier(); $messageQueue->addMessage($message); } + + protected function addMetaDataToFolder(Folder $folder): void + { + $successes = 0; + foreach ($folder->getFiles() as $file) { + if (FileUtility::isImage($file)) { + if ($this->alternativeService->setImageMetadata($file, false)) { + $successes++; + } + } + } + + if ($successes) { + $key = $successes === 1 ? 'bulk_action_singular.finished' : 'bulk_action.finished'; + $this->addMessage(LocalizationUtility::translate( + 'LLL:EXT:alternative/Resources/Private/Language/Backend/locallang.xlf:' . $key, 'alternative', [$successes] + )); + } + } } 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..5850c3d 100644 --- a/Resources/Private/Language/Backend/de.locallang.xlf +++ b/Resources/Private/Language/Backend/de.locallang.xlf @@ -1,6 +1,7 @@ - +
@@ -15,6 +16,14 @@ 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 successfully added for %1$s files + Metadaten erfolgreich für %1$s Dateien gesetzt + diff --git a/Resources/Private/Language/Backend/locallang.xlf b/Resources/Private/Language/Backend/locallang.xlf index 8e6850e..1c84bac 100644 --- a/Resources/Private/Language/Backend/locallang.xlf +++ b/Resources/Private/Language/Backend/locallang.xlf @@ -12,6 +12,12 @@ Metadata could not be added + + Metadata successfully added for %1$s file + + + Metadata successfully added for %1$s files +