Passed
Push — master ( dd3c52...8dbb66 )
by
unknown
19:37
created

HrefLangGenerator::getTranslatedPageRecord()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
c 0
b 0
f 0
dl 0
loc 18
rs 9.9
cc 3
nc 3
nop 3
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
18
namespace TYPO3\CMS\Seo\HrefLang;
19
20
use Psr\Http\Message\ServerRequestInterface;
21
use TYPO3\CMS\Core\Context\Context;
22
use TYPO3\CMS\Core\Context\LanguageAspectFactory;
23
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
24
use TYPO3\CMS\Core\Http\Uri;
25
use TYPO3\CMS\Core\Site\Entity\SiteInterface;
26
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
27
use TYPO3\CMS\Core\Utility\GeneralUtility;
28
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
29
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
30
use TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor;
31
use TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent;
32
33
/**
34
 * Class to add the hreflang tags to the page
35
 *
36
 * @internal
37
 */
38
class HrefLangGenerator
39
{
40
    /**
41
     * The content object renderer
42
     *
43
     * @var ContentObjectRenderer
44
     */
45
    public $cObj;
46
47
    /**
48
     * @var LanguageMenuProcessor
49
     */
50
    protected $languageMenuProcessor;
51
52
    public function __construct(ContentObjectRenderer $cObj, LanguageMenuProcessor $languageMenuProcessor)
53
    {
54
        $this->cObj = $cObj;
55
        $this->languageMenuProcessor = $languageMenuProcessor;
56
    }
57
58
    public function __invoke(ModifyHrefLangTagsEvent $event): void
59
    {
60
        $hrefLangs = $event->getHrefLangs();
61
        if ((int)$this->getTypoScriptFrontendController()->page['no_index'] === 1) {
62
            return;
63
        }
64
65
        $this->cObj->setRequest($event->getRequest());
66
        $languages = $this->languageMenuProcessor->process($this->cObj, [], [], []);
67
        /** @var SiteLanguage $siteLanguage */
68
        $siteLanguage = $event->getRequest()->getAttribute('language');
69
        $pageId = (int)$this->getTypoScriptFrontendController()->id;
70
71
        foreach ($languages['languagemenu'] as $language) {
72
            if ($language['available'] === 1 && !empty($language['link']) && $language['hreflang']) {
73
                $page = $this->getTranslatedPageRecord($pageId, $language['languageId'], $event->getRequest());
74
                if (!empty($page['canonical_link'])) {
75
                    // do not set hreflang when canonical is set
76
                    continue;
77
                }
78
79
                $href = $this->getAbsoluteUrl($language['link'], $siteLanguage);
80
                $hrefLangs[$language['hreflang']] = $href;
81
            }
82
        }
83
84
        if (count($hrefLangs) > 1) {
85
            if (array_key_exists($languages['languagemenu'][0]['hreflang'], $hrefLangs)) {
86
                $hrefLangs['x-default'] = $hrefLangs[$languages['languagemenu'][0]['hreflang']];
87
            }
88
        }
89
90
        $event->setHrefLangs($hrefLangs);
91
    }
92
93
    /**
94
     * @param string $url
95
     * @param SiteLanguage $siteLanguage
96
     * @return string
97
     */
98
    protected function getAbsoluteUrl(string $url, SiteLanguage $siteLanguage): string
99
    {
100
        $uri = new Uri($url);
101
        if (empty($uri->getHost())) {
102
            $url = $siteLanguage->getBase()->withPath($uri->getPath());
103
104
            if ($uri->getQuery()) {
105
                $url = $url->withQuery($uri->getQuery());
106
            }
107
        }
108
109
        return (string)$url;
110
    }
111
112
    /**
113
     * @return TypoScriptFrontendController
114
     */
115
    protected function getTypoScriptFrontendController(): TypoScriptFrontendController
116
    {
117
        return $GLOBALS['TSFE'];
118
    }
119
120
    protected function getTranslatedPageRecord(int $pageId, int $languageId, ServerRequestInterface $request): array
121
    {
122
        $site = $request->getAttribute('site');
123
        if (!$site instanceof SiteInterface) {
124
            return $this->getTypoScriptFrontendController()->page;
125
        }
126
127
        $targetSiteLanguage = $site->getLanguageById($languageId);
128
        $languageAspect = LanguageAspectFactory::createFromSiteLanguage($targetSiteLanguage);
129
130
        $context = clone GeneralUtility::makeInstance(Context::class);
131
        $context->setAspect('language', $languageAspect);
132
133
        $pageRepository = GeneralUtility::makeInstance(PageRepository::class, $context);
134
        if ($languageId > 0) {
135
            return $pageRepository->getPageOverlay($pageId, $languageId);
136
        }
137
        return $pageRepository->getPage($pageId);
138
    }
139
}
140