isBackend()) { $this->backendUser = $GLOBALS['BE_USER']; } $editingMode = $this->session->getDataByKey('editingMode'); $availableEditingModes = $this->configurationService->getAvailableEditingModes(); if ($this->backendUser->isAdmin()) { if (!\array_key_exists($editingMode, $availableEditingModes)) { $firstAvailableEditMode = \key($availableEditingModes); $this->session->setDataByKey('editingMode', $firstAvailableEditMode); } $canChangeEditingModes = \count($availableEditingModes) > 0; } else { $canChangeEditingModes = \count($availableEditingModes) > 0 && $this->backendUser->user['lfeditor_change_editing_modes'] !== 0; if (!$canChangeEditingModes || !\array_key_exists($editingMode, $availableEditingModes)) { $lastAvailableEditMode = array_key_last($availableEditingModes); $this->session->setDataByKey('editingMode', $lastAvailableEditMode); } } $this->session->setDataByKey('defaultLanguagePermission', $this->backendUser->checkLanguageAccess(0)); $this->session->setDataByKey('canChangeEditingModes', $canChangeEditingModes); } /** * Saves the the last called controller/action pair into the backend user * configuration if available * * @param bool $saveWithRedirectPair * @return void */ protected function setLastCalledControllerActionPair($saveWithRedirectPair = TRUE) { if (!$this->backendUser) { return; } $extensionKey = $this->request->getControllerExtensionKey(); $pair = [ 'action' => $this->request->getControllerActionName(), 'controller' => $this->request->getControllerName(), ]; $this->backendUser->uc[$extensionKey . 'State']['LastActionControllerPair'] = $pair; if ($saveWithRedirectPair) { $this->backendUser->uc[$extensionKey . 'State']['LastActionControllerPairForRedirect'] = $pair; } $this->backendUser->writeUC($this->backendUser->uc); } /** * Resets the last called controller/action pair combination from the * backend user session * * @return void */ protected function resetLastCalledControllerActionPair() { if (!$this->backendUser) { return; } $extensionKey = $this->request->getControllerExtensionKey(); $this->backendUser->uc[$extensionKey . 'State']['LastActionControllerPair'] = []; $this->backendUser->uc[$extensionKey . 'State']['LastActionControllerPairForRedirect'] = []; $this->backendUser->writeUC($this->backendUser->uc); if ($this->view instanceof ViewInterface) { $this->view->assign('lastCalledControllerActionPair', NULL); } } /** * Returns the last called controller/action pair from the backend user session * * @return array */ protected function getLastCalledControllerActionPair() { if (!$this->backendUser) { return []; } $extensionKey = $this->request->getControllerExtensionKey(); $state = $this->backendUser->uc[$extensionKey . 'State']['LastActionControllerPair']; return (!\is_array($state) ? [] : $state); } /** * Returns the last called controller/action pair from the backend user session * * @return array */ protected function getLastCalledControllerActionPairForRedirect() { if (!$this->backendUser) { return []; } $extensionKey = $this->request->getControllerExtensionKey(); return $this->backendUser->uc[$extensionKey . 'State']['LastActionControllerPairForRedirect'] ?? []; } /** * Redirects to the last called controller/action pair saved inside the * backend user session * * @return \TYPO3\CMS\Extbase\Http\ForwardResponse|null * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException */ protected function redirectToLastCalledControllerActionPair(): ?\TYPO3\CMS\Extbase\Http\ForwardResponse { $state = $this->getLastCalledControllerActionPairForRedirect(); if (\count($state) && \trim($state['action']) !== '' && \trim($state['controller']) !== '') { $currentAction = $this->request->getControllerActionName(); $currentController = $this->request->getControllerName(); if (!($currentController === $state['controller'] && $currentAction === $state['action'])) { $extensionName = $this->request->getControllerExtensionName(); $moduleSignature = $this->request->getPluginName(); $extensionConfig = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]; $availableControllers = $extensionConfig['modules'][$moduleSignature]['controllers']; $controllerExists = isset($availableControllers[$state['controller']]); if ($controllerExists) { $actionExists = \in_array( $state['action'], $availableControllers[$state['controller']]['actions'], TRUE ); if ($actionExists) { if (version_compare( \TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '11.0.0', '<' )) { $this->forward($state['action'], $state['controller']); } return (new \TYPO3\CMS\Extbase\Http\ForwardResponse($state['action']))->withControllerName( $state['controller'] ); } } } } return NULL; } /** * Sets last called controller-action pair and assigns common view variables. * This function should be called at the end of actions which render view * (and does not do redirection or forwarding at the end) */ protected function commonViewRenderingActionSettings() { $this->setLastCalledControllerActionPair(); $this->view->assign('editingMode', $this->session->getDataByKey('editingMode')); $this->view->assign('editingModeOptions', $this->configurationService->getAvailableEditingModes()); $this->view->assign('adminUser', $this->backendUser->isAdmin()); $this->view->assign('defaultLanguagePermission', $this->session->getDataByKey('defaultLanguagePermission')); $this->view->assign('canChangeEditingModes', $this->session->getDataByKey('canChangeEditingModes')); } /** * Since we cannot use constructor Injection, we do have to get one dynamically. If we want to use * our ModuleTemplate, call GetModuleTemplate before, which will init one if there is none for some reason */ protected function getModuleTemplate() { if ($this->moduleTemplate === NULL) { $moduleTemplateFactory = GeneralUtility::makeInstance( \TYPO3\CMS\Backend\Template\ModuleTemplateFactory::class ); $this->moduleTemplate = $moduleTemplateFactory->create($this->request); } } /** * Use the ModuleTemplateResponse to create a response object for the backend * * @return \Psr\Http\Message\ResponseInterface */ protected function createBackendResponse(): \Psr\Http\Message\ResponseInterface { return $this->htmlResponse($this->view->render()); } }