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

FluidTYPO3 / vhs / 28371118611

29 Jun 2026 12:11PM UTC coverage: 69.786%. Remained the same
28371118611

push

github

NamelessCoder
[TASK] Get rid of LF constant usage

9 of 15 new or added lines in 10 files covered. (60.0%)

4795 of 6871 relevant lines covered (69.79%)

4.03 hits per line

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

32.81
/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 array<int, string>|string $languages */
82
        $languages = $this->arguments['languages'];
×
83
        if ($languages instanceof \Traversable) {
×
84
            $languages = iterator_to_array($languages);
×
85
        } elseif (is_string($languages)) {
×
86
            $languages = GeneralUtility::trimExplode(',', $languages, true);
×
87
        } else {
88
            $languages = (array) $languages;
×
89
        }
90

91
        /** @var int $pageUid */
92
        $pageUid = $this->arguments['pageUid'];
×
93
        $pageUid = (int) $pageUid;
×
94
        if (0 === $pageUid) {
×
95
            $pageUid = $GLOBALS['TSFE']->id;
×
96
        }
97

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

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

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

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

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

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

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

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

143
        return '';
×
144
    }
145
}
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