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

FluidTYPO3 / vhs / 28588802516

02 Jul 2026 12:08PM UTC coverage: 70.321% (+0.4%) from 69.971%
28588802516

push

github

NamelessCoder
[TASK] Remove most of the remaining TSFE usages

21 of 32 new or added lines in 7 files covered. (65.63%)

4836 of 6877 relevant lines covered (70.32%)

4.41 hits per line

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

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

75
    public function render(): string
76
    {
77
        if (ContextUtility::isBackend()) {
×
78
            return '';
×
79
        }
80

81
        /** @var int|null|string $pageUid */
NEW
82
        $pageUid = $this->arguments['pageUid'];
×
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

NEW
94
        $pageUid = (int) ($pageUid ?: RequestResolver::getPageUid());
×
95

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

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

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

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

113
        /** @var PageRenderer $pageRenderer */
114
        $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
×
115
        $usePageRenderer = (1 !== (int) ($GLOBALS['TSFE']->config['config']['disableAllHeaderCode'] ?? 0));
×
116
        $output = '';
×
117

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

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

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

141
        return '';
×
142
    }
143
}
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