diff --git a/controller/AuthoringTool.php b/controller/AuthoringTool.php index 4b75f955..d2436ce5 100644 --- a/controller/AuthoringTool.php +++ b/controller/AuthoringTool.php @@ -28,6 +28,7 @@ use helpers_Random; use InterruptedActionException; use OAT\Library\Lti1p3Core\Message\Payload\LtiMessagePayloadInterface; +use oat\tao\model\theme\ThemeService; use oat\taoLti\models\classes\LtiException; use oat\taoLti\models\classes\LtiMessages\LtiErrorMessage; use oat\taoLti\models\classes\LtiService; diff --git a/manifest.php b/manifest.php index cb1145e9..1a757a3e 100755 --- a/manifest.php +++ b/manifest.php @@ -19,10 +19,8 @@ * Copyright (c) 2013-2021 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT); */ -use oat\ltiTestReview\controller\Review; use oat\tao\model\accessControl\func\AccessRule; use oat\tao\model\user\TaoRoles; -use oat\taoLti\controller\AuthoringTool; use oat\taoLti\controller\CookieUtils; use oat\taoLti\controller\Security; use oat\taoLti\models\classes\LtiRoles; @@ -30,7 +28,7 @@ use oat\taoLti\scripts\install\CreateLti1p3RegistrationSnapshotSchema; use oat\taoLti\scripts\install\GenerateKeys; use oat\taoLti\scripts\install\GenerisSearchWhitelist; -use oat\taoLti\scripts\install\RegisterPortalTheme; +use oat\taoLti\scripts\install\RegisterPortalThemeDetailProvider; use oat\taoLti\scripts\install\SetupServices; use oat\taoLti\scripts\install\MapLtiSectionVisibility; use oat\taoLti\scripts\update\Updater; @@ -67,7 +65,7 @@ MapLtiSectionVisibility::class, GenerisSearchWhitelist::class, CreateLti1p3RegistrationSnapshotSchema::class, - RegisterPortalTheme::class + RegisterPortalThemeDetailProvider::class, ] ], 'update' => Updater::class, diff --git a/migrations/Version202406060802293772_taoLti.php b/migrations/Version202406060802293772_taoLti.php index 8666a5dc..3c53073b 100644 --- a/migrations/Version202406060802293772_taoLti.php +++ b/migrations/Version202406060802293772_taoLti.php @@ -23,7 +23,7 @@ public function getDescription(): string public function up(Schema $schema): void { - $this->runAction(new RegisterPortalTheme()); + // Action removed due to conflicting with multiple instance implementations. } public function down(Schema $schema): void diff --git a/migrations/Version202406101417393772_taoLti.php b/migrations/Version202406101417393772_taoLti.php new file mode 100644 index 00000000..e5f5d032 --- /dev/null +++ b/migrations/Version202406101417393772_taoLti.php @@ -0,0 +1,34 @@ +runAction(new UnregisterLtiPortalTheme()); + } + + public function down(Schema $schema): void + { + $this->throwIrreversibleMigrationException(); + } +} diff --git a/models/classes/theme/PortalThemeDetailProvider.php b/models/classes/theme/PortalThemeDetailProvider.php new file mode 100644 index 00000000..172a3c22 --- /dev/null +++ b/models/classes/theme/PortalThemeDetailProvider.php @@ -0,0 +1,57 @@ +isSessionFromPortal()) { + return PortalTheme::THEME_ID; + }; + + return ''; + } + + /** + * @inheritDoc + */ + public function isHeadless(): bool + { + return false; + } + + private function isSessionFromPortal(): bool + { + $session = SessionManager::getSession(); + return $session instanceof TaoLtiSession + && !empty($session->getContexts(TenantDataSessionContext::class)); + } +} diff --git a/scripts/install/RegisterPortalTheme.php b/scripts/install/RegisterPortalThemeDetailProvider.php similarity index 57% rename from scripts/install/RegisterPortalTheme.php rename to scripts/install/RegisterPortalThemeDetailProvider.php index 12760d7e..989d4c8d 100644 --- a/scripts/install/RegisterPortalTheme.php +++ b/scripts/install/RegisterPortalThemeDetailProvider.php @@ -22,24 +22,17 @@ namespace oat\taoLti\scripts\install; -use oat\oatbox\config\ConfigurationService; use oat\oatbox\extension\InstallAction; -use oat\tao\model\theme\PortalTheme; use oat\tao\model\theme\ThemeServiceInterface; -use oat\taoLti\models\classes\theme\PortalThemeService; -class RegisterPortalTheme extends InstallAction +class RegisterPortalThemeDetailProvider extends InstallAction { - public function __invoke($params = []) + public function __invoke($params) { - /** @var ConfigurationService $previousThemeService */ - $previousThemeService = $this->getServiceManager()->get(ThemeServiceInterface::SERVICE_ID); - - /** @var ThemeServiceInterface $service */ - $service = $this->propagate(new PortalThemeService()); - $service->setOptions($previousThemeService->getOptions()); - $service->addTheme(new PortalTheme(), false); - - $this->getServiceManager()->register(ThemeServiceInterface::SERVICE_ID, $service); + $service = $this->getServiceManager()->get(ThemeServiceInterface::SERVICE_ID); + $themeDetailsProviders = $service->getOption('themeDetailsProviders'); + $themeDetailsProviders[] = new \oat\taoLti\models\classes\theme\PortalThemeDetailProvider(); + $service->setOption('themeDetailsProviders', $themeDetailsProviders); + $this->registerService(ThemeServiceInterface::SERVICE_ID, $service); } } diff --git a/scripts/install/UnregisterLtiPortalTheme.php b/scripts/install/UnregisterLtiPortalTheme.php new file mode 100644 index 00000000..e01d9bb7 --- /dev/null +++ b/scripts/install/UnregisterLtiPortalTheme.php @@ -0,0 +1,118 @@ +getServiceManager()->get(ThemeServiceInterface::SERVICE_ID); + $oldConfig = $service->getOptions(); + + //This provider will allow to display Portal Theme + if (!isset($oldConfig['themeDetailsProviders'])) { + $oldConfig['themeDetailsProviders'] = [ + new PortalThemeDetailProvider() + ]; + } + + /** @var common_ext_ExtensionsManager $extManager */ + $extManager = $this->getServiceManager()->get(common_ext_ExtensionsManager::class); + //If taoStyles is installed, we had PersistenceThemeService used as theming.conf.php and we should still use it + if ($extManager->isInstalled('taoStyles') && $service instanceof PortalThemeService) { + try { + $oldConfig = $this->validateConfig($oldConfig); + } catch (Exception $e) { + $this->getLogger()->error($e->getMessage()); + return; + } + + $revertedService = $this->propagate(new PersistenceThemeService($oldConfig)); + $this->getServiceManager()->register(ThemeServiceInterface::SERVICE_ID, $revertedService); + $revertedService->addTheme(new PortalTheme(), false); + $revertedService->addTheme(new DefaultTheme(), false); + + return; + } + + //Make sure current theme is set + if (!isset($oldConfig['current']) && !($service instanceof PersistenceThemeService)) { + $oldConfig = $this->defineCurrent($oldConfig); + } + + if ($service instanceof PortalThemeService) { + $reverseService = $this->propagate(new ThemeService($oldConfig)); + $this->getServiceManager()->register(ThemeServiceInterface::SERVICE_ID, $reverseService); + } + + $service->setOptions($oldConfig); + $this->getServiceManager()->register(ThemeServiceInterface::SERVICE_ID, $service); + } + + private function defineCurrent(array $config): array + { + if (!isset($config['available'])) { + $config['available'] = [ + 'default' => DefaultTheme::class, + 'portal' => array( + 'class' => 'oat\\tao\\model\\theme\\PortalTheme', + 'options' => array() + ) + ]; + } + + if (!isset($config['available']['default'])) { + $config['available']['default'] = DefaultTheme::class; + } + + if (!isset($config['current'])) { + $config['current'] = 'default'; + } + + return $config; + } + + private function validateConfig(array $oldConfig): array + { + //On taoLtiThemeService registration we migrated all configs and we may encounter some unused configs + unset($oldConfig['available']); + if (!isset($oldConfig['persistence'])) { + throw new Exception('Missing previous config for PersistenceThemeService'); + } + + return $oldConfig; + } +}