‪TYPO3CMS  ‪main
HrefLangGenerator.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
32 
39 {
40  public function ‪__construct(
41  protected ‪ContentObjectRenderer $cObj,
42  protected ‪LanguageMenuProcessor $languageMenuProcessor,
43  ) {}
44 
45  #[AsEventListener('typo3-seo/hreflangGenerator')]
46  public function ‪__invoke(‪ModifyHrefLangTagsEvent $event): void
47  {
48  $hrefLangs = $event->‪getHrefLangs();
49  if ((int)$this->‪getTypoScriptFrontendController()->page['no_index'] === 1) {
50  return;
51  }
52 
53  $this->cObj->setRequest($event->‪getRequest());
54  ‪$languages = $this->languageMenuProcessor->process($this->cObj, [], [], []);
55  $tsfe = $this->‪getTypoScriptFrontendController();
56  $site = $tsfe->getSite();
57  $siteLanguage = $tsfe->getLanguage();
58  $pageId = $tsfe->id;
59 
60  foreach (‪$languages['languagemenu'] as $language) {
61  if (!empty($language['link']) && $language['hreflang']) {
62  if ($language['languageId'] === 0) {
63  // No need to fetch default language
64  $page = ($tsfe->page['_TRANSLATION_SOURCE'] ?? null)?->toArray(true) ?? $tsfe->page;
65  } elseif ($language['languageId'] === ($tsfe->page['_PAGES_OVERLAY_REQUESTEDLANGUAGE'] ?? false)) {
66  // No need to fetch current language
67  $page = $tsfe->page;
68  } else {
69  $page = $this->‪getTranslatedPageRecord($pageId, $language['languageId'], $site);
70  }
71  // do not set hreflang if a page is not translated explicitly
72  if (empty($page)) {
73  continue;
74  }
75  // do not set hreflang when canonical is set explicitly
76  if (!empty($page['canonical_link'])) {
77  continue;
78  }
79 
80  $href = $this->‪getAbsoluteUrl($language['link'], $siteLanguage);
81  $hrefLangs[$language['hreflang']] = $href;
82  }
83  }
84 
85  if (count($hrefLangs) > 1) {
86  if (array_key_exists(‪$languages['languagemenu'][0]['hreflang'], $hrefLangs)) {
87  $hrefLangs['x-default'] = $hrefLangs[‪$languages['languagemenu'][0]['hreflang']];
88  }
89  }
90 
91  $event->‪setHrefLangs($hrefLangs);
92  }
93 
94  protected function ‪getAbsoluteUrl(string ‪$url, ‪SiteLanguage $siteLanguage): string
95  {
96  $uri = new ‪Uri(‪$url);
97  if (empty($uri->getHost())) {
98  ‪$url = $siteLanguage->‪getBase()->withPath($uri->getPath());
99 
100  if ($uri->getQuery()) {
101  ‪$url = ‪$url->withQuery($uri->getQuery());
102  }
103  }
104 
105  return (string)‪$url;
106  }
107 
109  {
110  return ‪$GLOBALS['TSFE'];
111  }
112 
113  protected function ‪getTranslatedPageRecord(int $pageId, int $languageId, ‪Site $site): array
114  {
115  $targetSiteLanguage = $site->‪getLanguageById($languageId);
116  $languageAspect = ‪LanguageAspectFactory::createFromSiteLanguage($targetSiteLanguage);
117 
118  $context = clone GeneralUtility::makeInstance(Context::class);
119  $context->setAspect('language', $languageAspect);
120 
121  $pageRepository = GeneralUtility::makeInstance(PageRepository::class, $context);
122  $pageRecord = $pageRepository->getPage($pageId);
123  // Overlay was requested but did not apply
124  if ($languageId > 0 && !($pageRecord['_PAGES_OVERLAY'] ?? false)) {
125  return [];
126  }
127  return $pageRecord;
128  }
129 }
‪TYPO3\CMS\Core\Context\LanguageAspectFactory
Definition: LanguageAspectFactory.php:27
‪TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent\getRequest
‪getRequest()
Definition: ModifyHrefLangTagsEvent.php:37
‪TYPO3\CMS\Core\Attribute\AsEventListener
Definition: AsEventListener.php:25
‪$languages
‪$languages
Definition: updateIsoDatabase.php:104
‪TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent\getHrefLangs
‪getHrefLangs()
Definition: ModifyHrefLangTagsEvent.php:32
‪TYPO3\CMS\Core\Context\LanguageAspectFactory\createFromSiteLanguage
‪static createFromSiteLanguage(SiteLanguage $language)
Definition: LanguageAspectFactory.php:31
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\Seo\HrefLang\HrefLangGenerator\getTypoScriptFrontendController
‪getTypoScriptFrontendController()
Definition: HrefLangGenerator.php:108
‪TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor
Definition: LanguageMenuProcessor.php:47
‪TYPO3\CMS\Core\Http\Uri
Definition: Uri.php:30
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Seo\HrefLang\HrefLangGenerator\getAbsoluteUrl
‪getAbsoluteUrl(string $url, SiteLanguage $siteLanguage)
Definition: HrefLangGenerator.php:94
‪TYPO3\CMS\Core\Site\Entity\SiteLanguage
Definition: SiteLanguage.php:27
‪TYPO3\CMS\Seo\HrefLang\HrefLangGenerator
Definition: HrefLangGenerator.php:39
‪TYPO3\CMS\Core\Site\Entity\SiteLanguage\getBase
‪getBase()
Definition: SiteLanguage.php:179
‪TYPO3\CMS\Seo\HrefLang
Definition: HrefLangGenerator.php:18
‪TYPO3\CMS\Seo\HrefLang\HrefLangGenerator\getTranslatedPageRecord
‪getTranslatedPageRecord(int $pageId, int $languageId, Site $site)
Definition: HrefLangGenerator.php:113
‪TYPO3\CMS\Seo\HrefLang\HrefLangGenerator\__construct
‪__construct(protected ContentObjectRenderer $cObj, protected LanguageMenuProcessor $languageMenuProcessor,)
Definition: HrefLangGenerator.php:40
‪TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent
Definition: ModifyHrefLangTagsEvent.php:27
‪TYPO3\CMS\Webhooks\Message\$url
‪identifier readonly UriInterface $url
Definition: LoginErrorOccurredMessage.php:36
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
Definition: TypoScriptFrontendController.php:102
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent\setHrefLangs
‪setHrefLangs(array $hrefLangs)
Definition: ModifyHrefLangTagsEvent.php:54
‪TYPO3\CMS\Seo\HrefLang\HrefLangGenerator\__invoke
‪__invoke(ModifyHrefLangTagsEvent $event)
Definition: HrefLangGenerator.php:46
‪TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
Definition: ContentObjectRenderer.php:91
‪TYPO3\CMS\Core\Domain\Repository\PageRepository
Definition: PageRepository.php:61
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Site\Entity\SiteInterface\getLanguageById
‪getLanguageById(int $languageId)