diff --git a/typo3/sysext/setup/Classes/Controller/SetupModuleController.php b/typo3/sysext/setup/Classes/Controller/SetupModuleController.php index 6c1278ac714c84ee6b23765aa0ef856f607d951d..c08c3e69c5b3dfe8fb34ed357939a29763338e23 100644 --- a/typo3/sysext/setup/Classes/Controller/SetupModuleController.php +++ b/typo3/sysext/setup/Classes/Controller/SetupModuleController.php @@ -27,6 +27,7 @@ use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Messaging\FlashMessage; +use TYPO3\CMS\Core\Messaging\FlashMessageService; use TYPO3\CMS\Core\Resource\Exception\FileDoesNotExistException; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; @@ -375,42 +376,7 @@ class SetupModuleController extends AbstractModule $this->loadModules->observeWorkspaces = true; $this->loadModules->load($GLOBALS['TBE_MODULES']); $this->content .= $this->moduleTemplate->header($this->getLanguageService()->getLL('UserSettings')); - // Show if setup was saved - if ($this->setupIsUpdated && !$this->settingsAreResetToDefault) { - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $this->getLanguageService()->getLL('setupWasUpdated'), $this->getLanguageService()->getLL('UserSettings')); - $this->content .= $flashMessage->render(); - } - - // Show if temporary data was cleared - if ($this->settingsAreResetToDefault) { - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $this->getLanguageService()->getLL('settingsAreReset'), $this->getLanguageService()->getLL('resetConfiguration')); - $this->content .= $flashMessage->render(); - } - - // Notice - if ($this->setupIsUpdated || $this->settingsAreResetToDefault) { - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $this->getLanguageService()->getLL('activateChanges'), '', FlashMessage::INFO); - $this->content .= $flashMessage->render(); - } - - // If password is updated, output whether it failed or was OK. - if ($this->passwordIsSubmitted) { - $flashMessage = null; - switch ($this->passwordIsUpdated) { - case self::PASSWORD_OLD_WRONG: - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $this->getLanguageService()->getLL('oldPassword_failed'), $this->getLanguageService()->getLL('newPassword'), FlashMessage::ERROR); - break; - case self::PASSWORD_NOT_THE_SAME: - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $this->getLanguageService()->getLL('newPassword_failed'), $this->getLanguageService()->getLL('newPassword'), FlashMessage::ERROR); - break; - case self::PASSWORD_UPDATED: - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $this->getLanguageService()->getLL('newPassword_ok'), $this->getLanguageService()->getLL('newPassword')); - break; - } - if ($flashMessage) { - $this->content .= $flashMessage->render(); - } - } + $this->addFlashMessages(); // Render user switch $this->content .= $this->renderSimulateUserSelectAndLabel(); @@ -718,9 +684,9 @@ class SetupModuleController extends AbstractModule <select id="field_lang" name="data[lang]" class="form-control">' . implode('', $languageOptions) . ' </select>'; if ($this->getBackendUser()->uc['lang'] && !@is_dir((PATH_typo3conf . 'l10n/' . $this->getBackendUser()->uc['lang']))) { - $languageUnavailableWarning = 'The selected language "' . $this->getLanguageService()->getLL(('lang_' . $this->getBackendUser()->uc['lang']), true) . '" is not available before the language files are installed.<br />' . ($this->getBackendUser()->isAdmin() ? 'You can use the Language module to easily download new language files.' : 'Please ask your system administrator to do this.'); - $languageUnavailableMessage = GeneralUtility::makeInstance(FlashMessage::class, $languageUnavailableWarning, '', FlashMessage::WARNING); - $languageCode = $languageUnavailableMessage->render() . $languageCode; + // TODO: The text constants have to be moved into language files + $languageUnavailableWarning = 'The selected language "' . $this->getLanguageService()->getLL(('lang_' . $this->getBackendUser()->uc['lang']), true) . '" is not available before the language files are installed. <br /> ' . ($this->getBackendUser()->isAdmin() ? 'You can use the Language module to easily download new language files.' : 'Please ask your system administrator to do this.'); + $languageCode = '<br /><span class="label label-danger">' . $languageUnavailableWarning . '</span><br /><br />' . $languageCode; } return $languageCode; } @@ -743,7 +709,7 @@ class SetupModuleController extends AbstractModule $modName = $subData['name']; $modules .= '<option value="' . htmlspecialchars($modName) . '"'; $modules .= $this->getBackendUser()->uc['startModule'] === $modName ? ' selected="selected"' : ''; - $modules .= '>' . $this->getLanguageService()->moduleLabels['tabs'][$modName . '_tab'] . '</option>'; + $modules .= '>' . $this->getLanguageService()->moduleLabels['tabs'][$modName . '_tab'] . '</option>'; } $groupLabel = $this->getLanguageService()->moduleLabels['tabs'][$mainMod . '_tab']; $startModuleSelect .= '<optgroup label="' . htmlspecialchars($groupLabel) . '">' . $modules . '</optgroup>'; @@ -1028,4 +994,79 @@ class SetupModuleController extends AbstractModule { return $GLOBALS['TYPO3_DB']; } + + /** + * Add FlashMessages for various actions + * + * @return void + */ + protected function addFlashMessages() + { + $flashMessages = []; + + // Show if setup was saved + if ($this->setupIsUpdated && !$this->settingsAreResetToDefault) { + $flashMessages[] = $this->getFlashMessage('setupWasUpdated', 'UserSettings'); + } + + // Show if temporary data was cleared + if ($this->settingsAreResetToDefault) { + $flashMessages[] = $this->getFlashMessage('settingsAreReset', 'resetConfiguration'); + } + + // Notice + if ($this->setupIsUpdated || $this->settingsAreResetToDefault) { + $flashMessages[] = $this->getFlashMessage('activateChanges', '', FlashMessage::INFO); + } + + // If password is updated, output whether it failed or was OK. + if ($this->passwordIsSubmitted) { + $flashMessage = null; + switch ($this->passwordIsUpdated) { + case self::PASSWORD_OLD_WRONG: + $flashMessages[] = $this->getFlashMessage('oldPassword_failed', 'newPassword', FlashMessage::ERROR); + break; + case self::PASSWORD_NOT_THE_SAME: + $flashMessages[] = $this->getFlashMessage('newPassword_failed', 'newPassword', FlashMessage::ERROR); + break; + case self::PASSWORD_UPDATED: + $flashMessages[] = $this->getFlashMessage('newPassword_ok', 'newPassword'); + break; + } + } + if (!empty($flashMessages)) { + $this->enqueueFlashMessages($flashMessages); + } + } + + /** + * @param array $flashMessages + * @throws \TYPO3\CMS\Core\Exception + * @return void + */ + protected function enqueueFlashMessages(array $flashMessages) + { + $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); + $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier(); + foreach ($flashMessages as $flashMessage) { + $defaultFlashMessageQueue->enqueue($flashMessage); + } + } + + /** + * @param string $message + * @param string $title + * @param int $severity + * @return FlashMessage + */ + protected function getFlashMessage($message, $title, $severity = FlashMessage::OK) + { + $title = !empty($title) ? $this->getLanguageService()->getLL($title) : ' '; + return GeneralUtility::makeInstance( + FlashMessage::class, + $this->getLanguageService()->getLL($message), + $title, + $severity + ); + } } diff --git a/typo3/sysext/setup/Tests/Unit/SetupModuleControllerTest.php b/typo3/sysext/setup/Tests/Unit/SetupModuleControllerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0d6090b2930679c52e9ebcea68730fdd615fe5ae --- /dev/null +++ b/typo3/sysext/setup/Tests/Unit/SetupModuleControllerTest.php @@ -0,0 +1,190 @@ +<?php +namespace TYPO3\CMS\Setup\Tests\Unit\Controller; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Messaging\FlashMessage; +use TYPO3\CMS\Setup\Controller\SetupModuleController; + +/** + * Class SetupModuleControllerTest + */ +class SetupModuleControllerTest extends \TYPO3\CMS\Core\Tests\UnitTestCase +{ + + /** + * @test + * @return void + */ + public function addFlashMessagesAddsMessagesIfSetupIsUpdated() + { + $setupModuleControllerMock = $this->getAccessibleMock( + SetupModuleController::class, + ['getFlashMessage', 'enqueueFlashMessages'], + [], + '', + false + ); + $setupModuleControllerMock->_set('setupIsUpdated', true); + + $setupModuleControllerMock + ->expects($this->atMost(2)) + ->method('getFlashMessage') + ->withConsecutive( + ['setupWasUpdated', 'UserSettings'], + ['activateChanges', ''] + ); + + $setupModuleControllerMock->_call('addFlashMessages'); + } + + /** + * @test + * @return void + */ + public function addFlashMessagesAddsMessageIfSettingsAreResetToDefault() + { + $setupModuleControllerMock = $this->getAccessibleMock( + SetupModuleController::class, + ['getFlashMessage', 'enqueueFlashMessages'], + [], + '', + false + ); + $setupModuleControllerMock->_set('settingsAreResetToDefault', true); + + $setupModuleControllerMock + ->expects($this->atMost(2)) + ->method('getFlashMessage') + ->withConsecutive( + ['settingsAreReset', 'resetConfiguration'], + ['activateChanges', ''] + ); + + $setupModuleControllerMock->_call('addFlashMessages'); + } + + /** + * @test + * @return void + */ + public function addFlashMessagesAddsMessageIfPasswordWasSuccessfullyUpdated() + { + $setupModuleControllerMock = $this->getAccessibleMock( + SetupModuleController::class, + ['getFlashMessage', 'enqueueFlashMessages'], + [], + '', + false + ); + $setupModuleControllerMock->_set('passwordIsSubmitted', true); + $setupModuleControllerMock->_set('passwordIsUpdated', SetupModuleController::PASSWORD_UPDATED); + + $setupModuleControllerMock + ->expects($this->once()) + ->method('getFlashMessage') + ->withConsecutive( + ['newPassword_ok', 'newPassword'] + ); + + $setupModuleControllerMock->_call('addFlashMessages'); + } + + /** + * @test + * @return void + */ + public function addFlashMessagesAddsMessageIfOldPasswordWasWrong() + { + $setupModuleControllerMock = $this->getAccessibleMock( + SetupModuleController::class, + ['getFlashMessage', 'enqueueFlashMessages'], + [], + '', + false + ); + $setupModuleControllerMock->_set('passwordIsSubmitted', true); + $setupModuleControllerMock->_set('passwordIsUpdated', SetupModuleController::PASSWORD_OLD_WRONG); + + $setupModuleControllerMock + ->expects($this->once()) + ->method('getFlashMessage') + ->withConsecutive( + ['oldPassword_failed', 'newPassword'] + ); + + $setupModuleControllerMock->_call('addFlashMessages'); + } + + /** + * @test + * @return void + */ + public function addFlashMessagesAddsMessageIfPasswordsNotTheSame() + { + $setupModuleControllerMock = $this->getAccessibleMock( + SetupModuleController::class, + ['getFlashMessage', 'enqueueFlashMessages'], + [], + '', + false + ); + $setupModuleControllerMock->_set('passwordIsSubmitted', true); + $setupModuleControllerMock->_set('passwordIsUpdated', SetupModuleController::PASSWORD_NOT_THE_SAME); + + $setupModuleControllerMock + ->expects($this->once()) + ->method('getFlashMessage') + ->withConsecutive( + ['newPassword_failed', 'newPassword'] + ); + + $setupModuleControllerMock->_call('addFlashMessages'); + } + + /** + * @test + * @return void + */ + public function addFlashMessagesAddsMessagesToQueue() + { + $setupModuleControllerMock = $this->getAccessibleMock( + SetupModuleController::class, + ['getFlashMessage', 'enqueueFlashMessages'], + [], + '', + false + ); + + $setupModuleControllerMock->_set('settingsAreResetToDefault', true); + $flashMessage1 = new FlashMessage('foo', 'bar'); + $flashMessage2 = new FlashMessage('bar', 'foo'); + $setupModuleControllerMock + ->expects($this->atMost(2)) + ->method('getFlashMessage') + ->withConsecutive( + ['settingsAreReset', 'resetConfiguration'], + ['activateChanges', ''] + )->willReturnOnConsecutiveCalls( + $flashMessage1, + $flashMessage2 + ); + + $setupModuleControllerMock + ->expects($this->once()) + ->method('enqueueFlashMessages') + ->with([$flashMessage1, $flashMessage2]); + $setupModuleControllerMock->_call('addFlashMessages'); + } +}