From aaa51321ec057680c7176fa7bb2b354f3c91b546 Mon Sep 17 00:00:00 2001 From: Eike Starkmann Date: Fri, 28 Aug 2026 10:21:07 +0200 Subject: [PATCH] [BUGFIX] TYPO3 13 and 14 compatible modul registration --- Classes/Controller/TaskController.php | 31 ++++++++++---- Configuration/Services.php | 9 ---- Configuration/Services.yaml | 5 ++- .../TaskControllerContainerTest.php | 42 +++++++++++++++++++ 4 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 Tests/Functional/Controller/TaskControllerContainerTest.php diff --git a/Classes/Controller/TaskController.php b/Classes/Controller/TaskController.php index 1b027e2..ee8171e 100644 --- a/Classes/Controller/TaskController.php +++ b/Classes/Controller/TaskController.php @@ -11,6 +11,7 @@ use TYPO3\CMS\Backend\Template\ModuleTemplateFactory; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Imaging\IconSize; +use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Pagination\SimplePagination; use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity; @@ -90,7 +91,7 @@ public function __construct( PersistenceManagerInterface $persistenceManager, ModuleTemplateFactory $moduleTemplateFactory, IconFactory $iconFactory, - private readonly ComponentFactory $componentFactory + private readonly Typo3Version $typo3Version ) { $this->taskRepository = $taskRepository; $this->persitenceManager = $persistenceManager; @@ -102,10 +103,17 @@ public function initializeAction(): void { parent::initializeAction(); // TODO: Change the autogenerated stub $this->moduleTemplate = $this->moduleTemplateFactory->create($this->request); - $menu = $this->componentFactory->createMenu(); + if ($this->typo3Version->getMajorVersion() >= 14) { + $componentFactory = GeneralUtility::makeInstance(ComponentFactory::class); + $menu = $componentFactory->createMenu(); + $menuItem = $componentFactory->createMenuItem(); + } else { + // @todo Remove this TYPO3 13 fallback (and this version check) once TYPO3 13 support is dropped. + $menu = $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry()->makeMenu(); + $menuItem = $menu->makeMenuItem(); + } $menu->setIdentifier('TaskqueueMenu'); - $menuItem = $this->componentFactory - ->createMenuItem() + $menuItem = $menuItem ->setHref( $this->uriBuilder->buildBackendUri() ) @@ -366,6 +374,13 @@ protected function buildSimplePagination(SimplePagination $simplePagination, Que protected function buildButtons() { $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); + if ($this->typo3Version->getMajorVersion() >= 14) { + $componentFactory = GeneralUtility::makeInstance(ComponentFactory::class); + $createLinkButton = static fn () => $componentFactory->createLinkButton(); + } else { + // @todo Remove this TYPO3 13 fallback (and this version check) once TYPO3 13 support is dropped. + $createLinkButton = static fn () => $buttonBar->makeLinkButton(); + } $buttons = [ [ 'table' => 'tx_taskqueue_domain_model_task', @@ -382,7 +397,7 @@ protected function buildButtons() ]; foreach ($buttons as $tableConfiguration) { $title = LocalizationUtility::translate($tableConfiguration['label'], 'taskqueue'); - $viewButton = $this->componentFactory->createLinkButton() + $viewButton = $createLinkButton() ->setHref($this->uriBuilder->reset()->setRequest($this->request)->uriFor( $tableConfiguration['action'], [], @@ -397,7 +412,7 @@ protected function buildButtons() $buttonBar->addButton($viewButton, ButtonBar::BUTTON_POSITION_LEFT, 2); } - $deleteFinished = $this->componentFactory->createLinkButton() + $deleteFinished = $createLinkButton() ->setShowLabelText(true) ->setHref($this->uriBuilder->reset()->setRequest($this->request)->uriFor( 'deleteFinished', @@ -413,7 +428,7 @@ protected function buildButtons() ->setIcon($this->iconFactory->getIcon('actions-delete', IconSize::SMALL, 'tx-taskqueue-status-finished')); $buttonBar->addButton($deleteFinished, ButtonBar::BUTTON_POSITION_LEFT, 3); - $deleteFailed = $this->componentFactory->createLinkButton() + $deleteFailed = $createLinkButton() ->setShowLabelText(true) ->setHref($this->uriBuilder->reset()->setRequest($this->request)->uriFor( 'deleteFailed', @@ -430,7 +445,7 @@ protected function buildButtons() $buttonBar->addButton($deleteFailed, ButtonBar::BUTTON_POSITION_LEFT, 3); // Refresh - $refreshButton = $this->componentFactory->createLinkButton() + $refreshButton = $createLinkButton() ->setHref(GeneralUtility::getIndpEnv('REQUEST_URI')) ->setTitle($this->getLanguageService()->sL('core.core:labels.reload')) ->setIcon($this->iconFactory->getIcon('actions-refresh', IconSize::SMALL)); diff --git a/Configuration/Services.php b/Configuration/Services.php index 94d7f2e..83b54b1 100644 --- a/Configuration/Services.php +++ b/Configuration/Services.php @@ -5,10 +5,8 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\DependencyInjection\Reference; -use TYPO3\CMS\Backend\Template\Components\ComponentFactory; use TYPO3\CMS\Backend\View\BackendViewFactory; use TYPO3\CMS\Dashboard\Dashboard; -use Undkonsorten\Taskqueue\Controller\TaskController; use TYPO3\CMS\Dashboard\Widgets\BarChartWidget; use Undkonsorten\Taskqueue\Widget\LatestTasksWidget; use Undkonsorten\Taskqueue\Widget\Provider\FailedTasksProvider; @@ -21,13 +19,6 @@ return static function (ContainerConfigurator $configurator, ContainerBuilder $containerBuilder) { $services = $configurator->services(); - if (class_exists(ComponentFactory::class)) { - $services->set(TaskController::class) - ->autowire() - ->autoconfigure() - ->tag('backend.controller'); - } - if ($containerBuilder->hasDefinition(Dashboard::class)) { $services->set('dashboard.widget.taskqueue.latestTasks') ->class(LatestTasksWidget::class) diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 98583ea..3e87d12 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -6,8 +6,9 @@ services: Undkonsorten\Taskqueue\: resource: '../Classes/*' - exclude: - - '../Classes/Controller/TaskController.php' + + Undkonsorten\Taskqueue\Controller\TaskController: + tags: [ 'backend.controller' ] Undkonsorten\Taskqueue\Command\RunTasksCommand: tags: diff --git a/Tests/Functional/Controller/TaskControllerContainerTest.php b/Tests/Functional/Controller/TaskControllerContainerTest.php new file mode 100644 index 0000000..232e307 --- /dev/null +++ b/Tests/Functional/Controller/TaskControllerContainerTest.php @@ -0,0 +1,42 @@ +has(TaskController::class)); + } +}