Passed
Push — master ( 111b47...548996 )
by
unknown
16:09
created

HrefLangGenerator::__invoke()   B

Complexity

Conditions 7
Paths 7

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 14
c 1
b 0
f 0
dl 0
loc 24
rs 8.8333
cc 7
nc 7
nop 1
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 TYPO3\CMS\Core\Http\Uri;
21
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
22
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
23
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
24
use TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor;
25
use TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent;
26
27
/**
28
 * Class to add the hreflang tags to the page
29
 *
30
 * @internal
31
 */
32
class HrefLangGenerator
33
{
34
    /**
35
     * The content object renderer
36
     *
37
     * @var ContentObjectRenderer
38
     */
39
    public $cObj;
40
41
    /**
42
     * @var LanguageMenuProcessor
43
     */
44
    protected $languageMenuProcessor;
45
46
    public function __construct(ContentObjectRenderer $cObj, LanguageMenuProcessor $languageMenuProcessor)
47
    {
48
        $this->cObj = $cObj;
49
        $this->languageMenuProcessor = $languageMenuProcessor;
50
    }
51
52
    public function __invoke(ModifyHrefLangTagsEvent $event): void
53
    {
54
        $hrefLangs = $event->getHrefLangs();
55
        if ((int)$this->getTypoScriptFrontendController()->page['no_index'] === 1) {
56
            return;
57
        }
58
59
        $this->cObj->setRequest($event->getRequest());
60
        $languages = $this->languageMenuProcessor->process($this->cObj, [], [], []);
61
        /** @var SiteLanguage $siteLanguage */
62
        $siteLanguage = $event->getRequest()->getAttribute('language');
63
        foreach ($languages['languagemenu'] as $language) {
64
            if ($language['available'] === 1 && !empty($language['link']) && $language['hreflang']) {
65
                $href = $this->getAbsoluteUrl($language['link'], $siteLanguage);
66
                $hrefLangs[$language['hreflang']] = $href;
67
            }
68
        }
69
70
        if (count($hrefLangs) > 1) {
71
            $href = $this->getAbsoluteUrl($languages['languagemenu'][0]['link'], $siteLanguage);
72
            $hrefLangs['x-default'] = $href;
73
        }
74
75
        $event->setHrefLangs($hrefLangs);
76
    }
77
78
    /**
79
     * @param string $url
80
     * @param SiteLanguage $siteLanguage
81
     * @return string
82
     */
83
    protected function getAbsoluteUrl(string $url, SiteLanguage $siteLanguage): string
84
    {
85
        $uri = new Uri($url);
86
        if (empty($uri->getHost())) {
87
            $url = $siteLanguage->getBase()->withPath($uri->getPath());
88
89
            if ($uri->getQuery()) {
90
                $url = $url->withQuery($uri->getQuery());
91
            }
92
        }
93
94
        return (string)$url;
95
    }
96
97
    /**
98
     * @return TypoScriptFrontendController
99
     */
100
    protected function getTypoScriptFrontendController(): TypoScriptFrontendController
101
    {
102
        return $GLOBALS['TSFE'];
103
    }
104
}
105