diff --git a/typo3/sysext/extbase/Classes/Utility/ExtensionUtility.php b/typo3/sysext/extbase/Classes/Utility/ExtensionUtility.php index 9fc7beabd11b398e46d2da45bcf8eda19af10fd0..aba43e713d57e04c057acf55b975836c25e621c8 100644 --- a/typo3/sysext/extbase/Classes/Utility/ExtensionUtility.php +++ b/typo3/sysext/extbase/Classes/Utility/ExtensionUtility.php @@ -52,23 +52,10 @@ class ExtensionUtility $extensionName = str_replace(' ', '', ucwords(str_replace('_', ' ', $extensionName))); $pluginSignature = strtolower($extensionName . '_' . $pluginName); - if (!is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName] ?? false)) { - $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName] = []; - } - foreach ($controllerActions as $controllerClassName => $actionsList) { - $controllerAlias = self::resolveControllerAliasFromControllerClassName($controllerClassName); - $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName]['controllers'][$controllerClassName] = [ - 'className' => $controllerClassName, - 'alias' => $controllerAlias, - 'actions' => GeneralUtility::trimExplode(',', (string)$actionsList), - ]; - - if (!empty($nonCacheableControllerActions[$controllerClassName])) { - $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName]['controllers'][$controllerClassName]['nonCacheableActions'] - = GeneralUtility::trimExplode(',', (string)$nonCacheableControllerActions[$controllerClassName]); - } - } + $controllerActions = self::actionCommaListToArray($controllerActions); + $nonCacheableControllerActions = self::actionCommaListToArray($nonCacheableControllerActions); + self::registerControllerActions($extensionName, $pluginName, $controllerActions, $nonCacheableControllerActions); switch ($pluginType) { case self::PLUGIN_TYPE_PLUGIN: @@ -100,6 +87,32 @@ tt_content.' . $pluginSignature . ' { ' . $pluginContent, 'defaultContentRendering'); } + /** + * @param array<string, string[]> $controllerActions + * @param array<string, string[]> $nonCacheableControllerActions + * @internal + */ + public static function registerControllerActions(string $extensionName, string $pluginName, array $controllerActions, array $nonCacheableControllerActions): void + { + if (!is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName] ?? false)) { + $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName] = []; + } + foreach ($controllerActions as $controllerClassName => $actionsList) { + $controllerAlias = self::resolveControllerAliasFromControllerClassName($controllerClassName); + + $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName]['controllers'][$controllerClassName] = [ + 'className' => $controllerClassName, + 'alias' => $controllerAlias, + 'actions' => $actionsList, + ]; + + if (!empty($nonCacheableControllerActions[$controllerClassName])) { + $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['plugins'][$pluginName]['controllers'][$controllerClassName]['nonCacheableActions'] + = $nonCacheableControllerActions[$controllerClassName]; + } + } + } + /** * Register an Extbase PlugIn into backend's list of plugins * FOR USE IN Configuration/TCA/Overrides/tt_content.php @@ -199,6 +212,22 @@ tt_content.' . $pluginSignature . ' { ); } + /** + * @param array<string, string|string[]> $controllerActions + * @return array<string, string[]> + */ + protected static function actionCommaListToArray(array $controllerActions): array + { + foreach ($controllerActions as $controllerClassName => $actionsList) { + if (is_array($actionsList)) { + continue; + } + $actionsListArray = GeneralUtility::trimExplode(',', (string)$actionsList); + $controllerActions[$controllerClassName] = $actionsListArray; + } + return $controllerActions; + } + /** * Register a type converter by class name. * diff --git a/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php b/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php index 6115f3d9fb233b4b50502417b918bd7abd281c9b..0eda20b5b74f56aa472002bb813afa548473c57e 100644 --- a/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php +++ b/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php @@ -202,6 +202,45 @@ final class ExtensionUtilityTest extends UnitTestCase self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']); } + /** + * @test + */ + public function configurePluginWorksForMultipleControllerActionsAsArrayWithCacheableActionAsDefault(): void + { + $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = []; + ExtensionUtility::configurePlugin('MyExtension', 'Pi1', [ + FirstController::class => ['index', 'show', 'new', 'create', 'delete', 'edit', 'update'], + SecondController::class => ['index', 'show', 'delete'], + ThirdController::class => ['create'], + ], [ + FirstController::class => ['new', 'create', 'edit', 'update'], + ThirdController::class => ['create'], + ]); + $expectedResult = [ + 'controllers' => [ + FirstController::class => [ + 'className' => FirstController::class, + 'alias' => 'First', + 'actions' => ['index', 'show', 'new', 'create', 'delete', 'edit', 'update'], + 'nonCacheableActions' => ['new', 'create', 'edit', 'update'], + ], + SecondController::class => [ + 'className' => SecondController::class, + 'alias' => 'Second', + 'actions' => ['index', 'show', 'delete'], + ], + ThirdController::class => [ + 'className' => ThirdController::class, + 'alias' => 'Third', + 'actions' => ['create'], + 'nonCacheableActions' => ['create'], + ], + ], + 'pluginType' => 'list_type', + ]; + self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']); + } + /** * @test */