diff --git a/typo3/sysext/extbase/Classes/Service/ExtensionService.php b/typo3/sysext/extbase/Classes/Service/ExtensionService.php index eb274cc29a67c4be80b92087220d04691803e2c1..4228b1c002995008f4cc93afd276054b9a6467a6 100644 --- a/typo3/sysext/extbase/Classes/Service/ExtensionService.php +++ b/typo3/sysext/extbase/Classes/Service/ExtensionService.php @@ -88,13 +88,11 @@ class ExtensionService implements SingletonInterface */ public function getPluginNameByAction(string $extensionName, string $controllerName, ?string $actionName): ?string { - $frameworkConfiguration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); // check, whether the current plugin is configured to handle the action - if (!empty($frameworkConfiguration['extensionName']) && $extensionName === $frameworkConfiguration['extensionName']) { - if (isset($frameworkConfiguration['controllerConfiguration'][$controllerName]) && in_array($actionName, $frameworkConfiguration['controllerConfiguration'][$controllerName]['actions'], true)) { - return $frameworkConfiguration['pluginName']; - } + if (($pluginName = $this->getPluginNameFromFrameworkConfiguration($extensionName, $controllerName, $actionName)) !== null) { + return $pluginName; } + $plugins = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'] ?? false; if (!$plugins) { return null; @@ -119,6 +117,36 @@ class ExtensionService implements SingletonInterface return !empty($pluginNames) ? $pluginNames[0] : null; } + private function getPluginNameFromFrameworkConfiguration(string $extensionName, string $controllerAlias, ?string $actionName): ?string + { + if ($actionName === null) { + return null; + } + + $frameworkConfiguration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + + if (!is_string($pluginName = ($frameworkConfiguration['pluginName'] ?? null))) { + return null; + } + + $configuredExtensionName = $frameworkConfiguration['extensionName'] ?? ''; + $configuredExtensionName = is_string($configuredExtensionName) ? $configuredExtensionName : ''; + + if ($configuredExtensionName === '' || $configuredExtensionName !== $extensionName) { + return null; + } + + $configuredControllers = $frameworkConfiguration['controllerConfiguration'] ?? []; + $configuredControllers = is_array($configuredControllers) ? $configuredControllers : []; + + $configuredActionsByControllerAliases = array_column($configuredControllers, 'actions', 'alias'); + + $actions = $configuredActionsByControllerAliases[$controllerAlias] ?? []; + $actions = is_array($actions) ? $actions : []; + + return in_array($actionName, $actions, true) ? $pluginName : null; + } + /** * Determines the target page of the specified plugin. * If plugin.tx_$pluginSignature.view.defaultPid is set, this value is used as target page id diff --git a/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php index f4c8e03d8050b8fbb1c1c40fa39182341a45c1a3..82e709ab0d51e1f672269918eced17b01ab473b6 100644 --- a/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php +++ b/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php @@ -216,7 +216,23 @@ class ExtensionServiceTest extends UnitTestCase */ public function getPluginNameByActionReturnsCurrentIfItCanHandleTheActionEvenIfMoreThanOnePluginMatches() { - $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->with(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK)->willReturn(['extensionName' => 'CurrentExtension', 'pluginName' => 'CurrentPlugin', 'controllerConfiguration' => ['ControllerName' => ['actions' => ['otherAction']]]]); + $frameworkConfiguration = [ + 'extensionName' => 'CurrentExtension', + 'pluginName' => 'CurrentPlugin', + 'controllerConfiguration' => [ + 'Fully\\Qualified\\ControllerName' => [ + 'alias' => 'ControllerName', + 'actions' => ['otherAction'] + ] + ] + ]; + + $this->mockConfigurationManager + ->expects(self::once()) + ->method('getConfiguration') + ->with(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK) + ->willReturn($frameworkConfiguration); + $actualResult = $this->extensionService->getPluginNameByAction('CurrentExtension', 'ControllerName', 'otherAction'); $expectedResult = 'CurrentPlugin'; self::assertEquals($expectedResult, $actualResult);