Tym razem chcemy podzielić się naszym rozwiązaniem, które jest bardzo przydatne jeśli dana strona w CMS TYPO3 wymaga wcześniejszego zalgowania, czyli musimy być zalgowani jako użytkownik FE. Sam CMS daje nam wiele możliwości w jaki sposób możemy możemy zarządzać widocznością stron oraz poszczegółnych elementów strony. W przypadku stron dostęp taki możemy skonfigorować w zakładce "ACCESS"
Mamy tu do wyboru 3 możliwości
Jeśli nie mamy skonfirowanego żadneg mechanizmu który przekieruje nas do strony logowania, zobaczymy poniższy błąd
Aby to zmienić musimy dodać do Site Configuration obłsugę błędu 403
lub dopsiać poniższy kod do do pliku config/sites/DomainKey/config.yaml
errorHandling: - errorCode: '403' errorHandler: PHP errorPhpClassFQCN: VendorName\MyExtension\PageHandler\NotAuthorized
php
Kolejnym krokiem jest stworzenie klasy która zajammie się wykonaniem przekierowania do strony gdzie mamy umieszczony formularz logowania. Do takiego url dostanie duklejony parametr referer, który będzie zawierał adres strony do której będziemy zalogowaniu po dokonaniu poprawnej autoryzacji.
<?php declare(strict_types=1); namespace VendorName\MyExtension\PageHandler; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface; use TYPO3\CMS\Core\Http\RedirectResponse; use TYPO3\CMS\Core\Http\Uri; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Core\Site\SiteFinder; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; class NotAuthorized implements PageErrorHandlerInterface { /** * @var ServerRequestInterface */ protected $request = null; /** * @param ServerRequestInterface $request * @param string $message * @param array $reasons * @return ResponseInterface */ public function handlePageError( ServerRequestInterface $request, string $message, array $reasons = [] ): ResponseInterface { $this->request = $request; return new RedirectResponse($this->getLoginUrl(), 302); } /** * @return string */ protected function getLoginUrl(): string { $loginPage = $this->getLoginPageId(); /** @var Site $site */ $siteFinder = GeneralUtility::makeInstance(SiteFinder::class); $site = $siteFinder->getSiteByPageId($loginPage); /** @var Uri $uri */ $uri = $site->getRouter()->generateUri( $loginPage, [ '_language' => $this->getLanguageIdentifier(), 'referer' => $this->request->getUri()->__toString() ] ); return $uri->__toString(); } /** * @return int */ protected function getLanguageIdentifier(): int { /** @var SiteLanguage $language */ $language = $this->request->getAttribute('language'); return $language->getLanguageId(); } private function getLoginPageId(): int { return (int)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('my_extnsion')['loginPage']; } }
php
Ostatnim krokiem jest stworzenie pliku ext_conf_template.txt gdzie musimy podać Id strony gdzie znajduje się formularz logowania
# cat=basic/enable; type=string; label=Login Page loginPage = 97
php