• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FluidTYPO3 / vhs / 28027762973

23 Jun 2026 12:54PM UTC coverage: 71.233%. First build
28027762973

push

github

NamelessCoder
[TASK] Clean up class imports

0 of 2 new or added lines in 1 file covered. (0.0%)

4903 of 6883 relevant lines covered (71.23%)

14.63 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

34.43
/Classes/ViewHelpers/Page/Header/AlternateViewHelper.php
1
<?php
2
namespace FluidTYPO3\Vhs\ViewHelpers\Page\Header;
3

4
/*
5
 * This file is part of the FluidTYPO3/Vhs project under GPLv2 or later.
6
 *
7
 * For the full copyright and license information, please read the
8
 * LICENSE.md file that was distributed with this source code.
9
 */
10

11
use FluidTYPO3\Vhs\Core\ViewHelper\AbstractViewHelper;
12
use FluidTYPO3\Vhs\Service\PageService;
13
use FluidTYPO3\Vhs\Traits\PageRendererTrait;
14
use FluidTYPO3\Vhs\Utility\ContextUtility;
15
use FluidTYPO3\Vhs\Utility\RequestResolver;
16
use TYPO3\CMS\Core\Page\PageRenderer;
17
use TYPO3\CMS\Core\Utility\GeneralUtility;
18
use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
19
use TYPO3Fluid\Fluid\Core\ViewHelper\TagBuilder;
20

21
/**
22
 * Returns the all alternate urls.
23
 */
24
class AlternateViewHelper extends AbstractViewHelper
25
{
26
    use PageRendererTrait;
27

28
    /**
29
     * @var PageService
30
     */
31
    protected $pageService;
32

33
    /**
34
     * @var TagBuilder
35
     */
36
    protected $tagBuilder;
37

38
    public function injectPageService(PageService $pageService): void
39
    {
40
        $this->pageService = $pageService;
×
41
    }
42

43
    public function __construct()
44
    {
45
        /** @var TagBuilder $tagBuilder */
46
        $tagBuilder = GeneralUtility::makeInstance(TagBuilder::class);
×
47
        $this->tagBuilder = $tagBuilder;
×
48
    }
49

50
    public function initializeArguments(): void
51
    {
52
        $this->registerArgument(
7✔
53
            'languages',
7✔
54
            'mixed',
7✔
55
            'The languages (either CSV, array or implementing Traversable)',
7✔
56
            true
7✔
57
        );
7✔
58
        $this->registerArgument('pageUid', 'integer', 'The page uid to check', false, 0);
7✔
59
        $this->registerArgument(
7✔
60
            'normalWhenNoLanguage',
7✔
61
            'boolean',
7✔
62
            'If TRUE, a missing page overlay should be ignored',
7✔
63
            false,
7✔
64
            false
7✔
65
        );
7✔
66
        $this->registerArgument(
7✔
67
            'addQueryString',
7✔
68
            'boolean',
7✔
69
            'If TRUE, the current query parameters will be kept in the URI',
7✔
70
            false,
7✔
71
            false
7✔
72
        );
7✔
73
    }
74

75
    /**
76
     * @return string
77
     */
78
    public function render(): mixed
79
    {
80
        if (ContextUtility::isBackend()) {
×
81
            return '';
×
82
        }
83

84
        /** @var array<int, string>|string $languages */
85
        $languages = $this->arguments['languages'];
×
86
        if ($languages instanceof \Traversable) {
×
87
            $languages = iterator_to_array($languages);
×
88
        } elseif (is_string($languages)) {
×
89
            $languages = GeneralUtility::trimExplode(',', $languages, true);
×
90
        } else {
91
            $languages = (array) $languages;
×
92
        }
93

94
        /** @var int $pageUid */
NEW
95
        $pageUid = (int) ($this->arguments['pageUid'] ?: RequestResolver::getPageInformation()->getId());
×
96

97
        /** @var bool $normalWhenNoLanguage */
98
        $normalWhenNoLanguage = $this->arguments['normalWhenNoLanguage'];
×
99
        $addQueryString = (bool) $this->arguments['addQueryString'];
×
100

101
        /** @var UriBuilder $uriBuilder */
102
        $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
×
103
        $uriBuilder->setRequest(RequestResolver::resolveRequestFromRenderingContext($this->renderingContext));
×
104

105
        $uriBuilder = $uriBuilder->reset()
×
106
            ->setTargetPageUid($pageUid)
×
107
            ->setCreateAbsoluteUri(true)
×
108
            ->setAddQueryString($addQueryString);
×
109

110
        $this->tagBuilder->reset();
×
111
        $this->tagBuilder->setTagName('link');
×
112
        $this->tagBuilder->addAttribute('rel', 'alternate');
×
113

114
        /** @var PageRenderer $pageRenderer */
115
        $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
×
NEW
116
        $usePageRenderer = (1 !== (int) (RequestResolver::getFrontendTypoScriptConfig()['disableAllHeaderCode'] ?? 0));
×
117
        $output = '';
×
118

119
        foreach ($languages as $languageUid => $languageName) {
×
120
            if (!$this->pageService->hidePageForLanguageUid($pageUid, $languageUid, $normalWhenNoLanguage)) {
×
121
                $uri = $uriBuilder->setArguments(['L' => $languageUid])->build();
×
122
                $this->tagBuilder->addAttribute('href', $uri);
×
123
                $this->tagBuilder->addAttribute('hreflang', $languageName);
×
124

125
                $renderedTag = $this->tagBuilder->render();
×
126
                if ($usePageRenderer) {
×
127
                    if (method_exists($pageRenderer, 'addMetaTag')) {
×
128
                        $pageRenderer->addMetaTag($renderedTag);
×
129
                    } else {
130
                        $pageRenderer->addHeaderData($renderedTag);
×
131
                    }
132
                } else {
133
                    $output .= $renderedTag . LF;
×
134
                }
135
            }
136
        }
137

138
        if (!$usePageRenderer) {
×
139
            return trim($output);
×
140
        }
141

142
        return '';
×
143
    }
144
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc