moduleLoader = $moduleLoader ?? GeneralUtility::makeInstance(ModuleLoader::class); $this->uriBuilder = $uriBuilder ?? GeneralUtility::makeInstance(UriBuilder::class); $this->configurationService = $configurationService ?? GeneralUtility::makeInstance(ConfigurationService::class); $this->adminPanelModuleConfiguration = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules'] ?? []; } /** * Initializes settings for the admin panel. * * @param ServerRequestInterface $request */ public function initialize(ServerRequestInterface $request): void { $this->modules = $this->moduleLoader->validateSortAndInitializeModules( $this->adminPanelModuleConfiguration ); if (StateUtility::isActivatedForUser()) { $this->initializeModules($request, $this->modules); } } /** * Renders the admin panel - Called in PSR-15 Middleware * * @see \TYPO3\CMS\Adminpanel\Middleware\AdminPanelRenderer * @param \Psr\Http\Message\ServerRequestInterface $request * @return string */ public function render(ServerRequestInterface $request): string { // legacy handling, deprecated, will be removed in TYPO3 v10.0. $adminPanelView = GeneralUtility::makeInstance(AdminPanelView::class); $hookObjectContent = $adminPanelView->callDeprecatedHookObject(); // end legacy handling $resources = ResourceUtility::getResources(); $view = GeneralUtility::makeInstance(StandaloneView::class); $templateNameAndPath = 'EXT:adminpanel/Resources/Private/Templates/Main.html'; $view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName($templateNameAndPath)); $view->setPartialRootPaths(['EXT:adminpanel/Resources/Private/Partials']); $view->setLayoutRootPaths(['EXT:adminpanel/Resources/Private/Layouts']); $view->assignMultiple( [ 'toggleActiveUrl' => $this->generateBackendUrl('ajax_adminPanel_toggle'), 'resources' => $resources, 'adminPanelActive' => StateUtility::isOpen(), ] ); if (StateUtility::isOpen()) { $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('adminpanel_requestcache'); $requestId = $request->getAttribute('adminPanelRequestId'); $data = $cache->get($requestId); $moduleResources = ResourceUtility::getAdditionalResourcesForModules($this->modules); $settingsModules = array_filter($this->modules, function (ModuleInterface $module) { return $module instanceof PageSettingsProviderInterface; }); $parentModules = array_filter( $this->modules, function (ModuleInterface $module) { return $module instanceof SubmoduleProviderInterface && $module instanceof ShortInfoProviderInterface; } ); $view->assignMultiple( [ 'modules' => $this->modules, 'settingsModules' => $settingsModules, 'parentModules' => $parentModules, 'hookObjectContent' => $hookObjectContent, 'saveUrl' => $this->generateBackendUrl('ajax_adminPanel_saveForm'), 'moduleResources' => $moduleResources, 'requestId' => $requestId, 'data' => $data ?? [], ] ); } return $view->render(); } /** * Stores data for admin panel in cache - Called in PSR-15 Middleware * * @see \TYPO3\CMS\Adminpanel\Middleware\AdminPanelDataPersister * @param \Psr\Http\Message\ServerRequestInterface $request * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException */ public function storeData(ServerRequestInterface $request): void { if (StateUtility::isOpen()) { $data = $this->storeDataPerModule( $request, $this->modules, GeneralUtility::makeInstance(ModuleDataStorageCollection::class) ); $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('adminpanel_requestcache'); $cache->set($request->getAttribute('adminPanelRequestId'), $data); $cache->collectGarbage(); } } /** * Generate a url to a backend route * * @param string $route * @return string */ protected function generateBackendUrl(string $route): string { return (string)$this->uriBuilder->buildUriFromRoute($route); } /** * @param \Psr\Http\Message\ServerRequestInterface $request * @param \TYPO3\CMS\Adminpanel\ModuleApi\ModuleInterface[] $modules */ protected function initializeModules(ServerRequestInterface $request, array $modules): void { foreach ($modules as $module) { if ( ($module instanceof InitializableInterface) && ( (($module instanceof ConfigurableInterface) && $module->isEnabled()) || (!($module instanceof ConfigurableInterface)) ) ) { $module->initializeModule($request); } if ($module instanceof SubmoduleProviderInterface) { $this->initializeModules($request, $module->getSubModules()); } } } /** * @param \Psr\Http\Message\ServerRequestInterface $request * @param \TYPO3\CMS\Adminpanel\ModuleApi\ModuleInterface[] $modules * @param ModuleDataStorageCollection $data * @return ModuleDataStorageCollection */ protected function storeDataPerModule(ServerRequestInterface $request, array $modules, ModuleDataStorageCollection $data): ModuleDataStorageCollection { foreach ($modules as $module) { if ( ($module instanceof DataProviderInterface) && ( (($module instanceof ConfigurableInterface) && $module->isEnabled()) || (!($module instanceof ConfigurableInterface)) ) ) { $data->addModuleData($module, $module->getDataToStore($request)); } if ($module instanceof SubmoduleProviderInterface) { $this->storeDataPerModule($request, $module->getSubModules(), $data); } } return $data; } }