Last active
June 10, 2022 13:42
-
-
Save einpraegsam/0a65b1366e670d5f8e46a80130e3fb8f to your computer and use it in GitHub Desktop.
What can you do with SiteConfiguration in TYPO3 and how to get a site object from anywhere?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
namespace Vendor\Extension\Factory; | |
use GuzzleHttp\Psr7\Uri; | |
use TYPO3\CMS\Core\Exception\SiteNotFoundException; | |
use TYPO3\CMS\Core\Http\Request; | |
use TYPO3\CMS\Core\Http\ServerRequest; | |
use TYPO3\CMS\Core\Routing\SiteMatcher; | |
use TYPO3\CMS\Core\Site\Entity\Site; | |
use TYPO3\CMS\Core\Site\SiteFinder; | |
use TYPO3\CMS\Core\Utility\GeneralUtility; | |
/** | |
* Class SiteFactory | |
* with some examples how to get a site object anywhere | |
*/ | |
class SiteFactory | |
{ | |
/** | |
* Try to find a matching site from a given url (e.g. a deeplink) | |
* | |
* @param string $url | |
* @return Site | |
*/ | |
public function getSiteFromUrl(string $url = 'https://domain.org/path/path/'): Site | |
{ | |
$uri = GeneralUtility::makeInstance(Uri::class, $url); | |
$request = GeneralUtility::makeInstance(ServerRequest::class, $uri); | |
$matcher = GeneralUtility::makeInstance(SiteMatcher::class); | |
$routeResult = $matcher->matchRequest($request); | |
return $routeResult->getSite(); | |
} | |
/** | |
* Get fitting site from a page identifier | |
* | |
* @param int $pageIdentifier | |
* @return Site | |
* @throws SiteNotFoundException | |
*/ | |
public function getSiteFromPageIdentifier(int $pageIdentifier = 123): Site | |
{ | |
$siteFinder = GeneralUtility::makeInstance(SiteFinder::class); | |
return $siteFinder->getSiteByPageId($pageIdentifier); | |
} | |
/** | |
* Get site from a root page identifier | |
* | |
* @param int $rootpageIdentifier | |
* @return Site | |
* @throws SiteNotFoundException | |
*/ | |
public function getSiteByRootpageIdentifier(int $rootpageIdentifier = 123): Site | |
{ | |
$siteFinder = GeneralUtility::makeInstance(SiteFinder::class); | |
return $siteFinder->getSiteByRootPageId($rootpageIdentifier); | |
} | |
/** | |
* Get first defined site configuration | |
* | |
* @return Site | |
*/ | |
public function getFirstSite(): Site | |
{ | |
$siteFinder = GeneralUtility::makeInstance(SiteFinder::class); | |
$sites = $siteFinder->getAllSites(); | |
return array_values($sites)[0]; | |
} | |
/** | |
* Get site from a request object | |
* | |
* @param Request $request | |
* @return Site | |
*/ | |
public function getSiteFromRequest(Request $request): Site | |
{ | |
return $request->getAttribute('site'); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
namespace Vendor\Extension\Helper; | |
use TYPO3\CMS\Core\Site\Entity\Site; | |
use TYPO3\CMS\Core\Utility\ArrayUtility; | |
/** | |
* Class SiteHelper | |
* with some examples how to play with it | |
*/ | |
class SiteHelper | |
{ | |
/** | |
* Build a link to a page by given page identifier | |
* | |
* @param int $pageIdentifier | |
* @param Site $site | |
* @return string | |
*/ | |
public function buildUrlToPage(int $pageIdentifier, Site $site): string | |
{ | |
$uri = $site->getRouter()->generateUri($pageIdentifier); | |
return $uri->__toString(); | |
} | |
/** | |
* Build a link to a page by given page identifier and any parameters (like typeNum) | |
* | |
* @param int $pageIdentifier | |
* @param array $arguments | |
* @param Site $site | |
* @return string | |
*/ | |
public function buildUrlToPageWithArguments(int $pageIdentifier, array $arguments = ['type' => 98], Site $site): string | |
{ | |
$uri = $site->getRouter()->generateUri($pageIdentifier, $arguments); | |
return $uri->__toString(); | |
} | |
/** | |
* Get the root page identifier | |
* | |
* @param Site $site | |
* @return int | |
*/ | |
public function getRootpageIdentifier(Site $site): int | |
{ | |
return $site->getRootPageId(); | |
} | |
/** | |
* Get any configuration from site object | |
* | |
* Example with your individual configuration in site yaml: | |
* rootPageId: 1 | |
* base: https://domain.org | |
* myProject: | |
* recordStorage: 123 | |
* | |
* @param string $configurationPath | |
* @param Site $site | |
* @return string|int|array | |
*/ | |
public function getConfigurationFromSite(Site $site, string $configurationPath = 'myProject.recordStorage') | |
{ | |
$array = $site->getConfiguration(); | |
return ArrayUtility::getValueByPath($array, $configurationPath, '.'); | |
} | |
/** | |
* Get the default language identifier | |
* | |
* @param Site $site | |
* @return int | |
*/ | |
public function getDefaultLanguageId(Site $site): int | |
{ | |
return $site->getDefaultLanguage()->getLanguageId(); | |
} | |
/** | |
* Get all language configurations (with all properties) | |
* | |
* @param Site $site | |
* @return array | |
*/ | |
public function getAllLanguages(Site $site): array | |
{ | |
return $site->getAllLanguages(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment