diff --git a/Classes/Controller/PreviewController.php b/Classes/Controller/PreviewController.php index bc6822f..ddbfe3f 100644 --- a/Classes/Controller/PreviewController.php +++ b/Classes/Controller/PreviewController.php @@ -17,6 +17,7 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Backend\Template\ModuleTemplateFactory; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Http\HtmlResponse; use TYPO3\CMS\Core\Http\ServerRequest; use TYPO3\CMS\Core\Site\Entity\Site; @@ -28,12 +29,15 @@ class PreviewController { protected StandaloneView $view; protected SiteFinder $siteFinder; + protected ExtensionConfiguration $extensionConfiguration; private ModuleTemplateFactory $moduleTemplateFactory; - public function __construct(ModuleTemplateFactory $moduleTemplateFactory, SiteFinder $siteFinder) + public function __construct(ModuleTemplateFactory $moduleTemplateFactory, SiteFinder $siteFinder, + ExtensionConfiguration $extensionConfiguration) { $this->moduleTemplateFactory = $moduleTemplateFactory; $this->siteFinder = $siteFinder; + $this->extensionConfiguration = $extensionConfiguration; $this->initializeView('index'); } @@ -77,7 +81,8 @@ protected function getAllSites(): array if (!($site instanceof Site)) { continue; } - $sites[] = GeneralUtility::makeInstance(SiteWrapper::class, $site); + $sites[] = GeneralUtility::makeInstance(SiteWrapper::class, $site, + $this->extensionConfiguration); } usort($sites, function (SiteWrapper $siteA, SiteWrapper $siteB) { return $siteA->getCountDisabledLanguages() <=> $siteB->getCountDisabledLanguages(); diff --git a/Classes/Http/Middleware/Preview.php b/Classes/Http/Middleware/Preview.php index c9f7dd5..49c4c46 100644 --- a/Classes/Http/Middleware/Preview.php +++ b/Classes/Http/Middleware/Preview.php @@ -19,6 +19,7 @@ use Psr\Http\Server\RequestHandlerInterface; use Symfony\Component\HttpFoundation\Cookie; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Context\UserAspect; use TYPO3\CMS\Core\Database\ConnectionPool; @@ -36,9 +37,12 @@ class Preview implements MiddlewareInterface protected Context $context; - public function __construct(Context $context) + protected array $extConf; + + public function __construct(Context $context, ExtensionConfiguration $extensionConfiguration) { $this->context = $context; + $this->extConf = $extensionConfiguration->get('authorized_preview'); } public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface @@ -57,8 +61,10 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $handler->handle($request); } - if ($language->isEnabled()) { - return $handler->handle($request); + if (!($this->extConf['showPreviewForEnabledLanguages'] ?? false)) { + if ($language->isEnabled()) { + return $handler->handle($request); + } } $hash = $this->findHashInRequest($request); @@ -76,7 +82,11 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface // Store config in request $request = $request->withAttribute(self::REQUEST_ATTRIBUTE, $config); - $this->initializePreviewUser($language); + $pageId = $config->getPageId(); + + if (!$this->initializePreviewUser($language, $pageId)) { + return $handler->handle($request); + } $response = $handler->handle($request); // If the GET parameter PreviewUriBuilder::PARAMETER_NAME is set, then a cookie is set for the next request @@ -108,12 +118,21 @@ protected function findHashInRequest(ServerRequestInterface $request): string /** * Creates a preview user and sets the current page ID (for accessing the page) */ - protected function initializePreviewUser(SiteLanguage $language): void + protected function initializePreviewUser(SiteLanguage $language, int $pageId = 0): bool { $previewUser = GeneralUtility::makeInstance(PreviewUserAuthentication::class, $language); - $previewUser->setWebmounts([$GLOBALS['TSFE']->id]); + if (!$pageId) { + if (isset($GLOBALS['TSFE'])) { + $pageId = $GLOBALS['TSFE']->id; + } + } + if (!$pageId) { + return false; + } + $previewUser->setWebmounts([$pageId]); $GLOBALS['BE_USER'] = $previewUser; $this->setBackendUserAspect($previewUser); + return true; } /** diff --git a/Classes/Preview/Config.php b/Classes/Preview/Config.php index 9a72e02..a53ad5c 100644 --- a/Classes/Preview/Config.php +++ b/Classes/Preview/Config.php @@ -47,4 +47,9 @@ public function validForPageId(int $pageId): bool { return $pageId === $this->pageId; } + + public function getPageId(): int + { + return $this->pageId; + } } diff --git a/Classes/SiteWrapper.php b/Classes/SiteWrapper.php index 39479ff..fe1c8d1 100644 --- a/Classes/SiteWrapper.php +++ b/Classes/SiteWrapper.php @@ -10,6 +10,7 @@ * of the License, or any later version. */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Site\Entity\SiteLanguage; @@ -27,12 +28,13 @@ class SiteWrapper */ protected array $disabledLanguages = []; - public function __construct(Site $site) + public function __construct(Site $site, ExtensionConfiguration $extensionConfiguration) { $this->site = $site; - + $showPreviewForEnabledLanguages = (bool)$extensionConfiguration->get('authorized_preview', + 'showPreviewForEnabledLanguages'); foreach ($this->site->getAllLanguages() as $languageId => $language) { - if ($language->enabled() === false) { + if ($showPreviewForEnabledLanguages || $language->enabled() === false) { $this->disabledLanguages[] = $language; } } diff --git a/ext_conf_template.txt b/ext_conf_template.txt new file mode 100644 index 0000000..fe8c8d6 --- /dev/null +++ b/ext_conf_template.txt @@ -0,0 +1,2 @@ +# cat=basic; type=bool; label=If this is enabled, it is also possible to show preview URLS for enabled languages +showPreviewForEnabledLanguages = 0