Passed
Push — master ( db41d3...ded2ba )
by Timo
03:59
created

Util::getLanguageUid()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 5
ccs 0
cts 0
cp 0
rs 10
cc 1
nc 1
nop 0
crap 2
1
<?php
2
namespace ApacheSolrForTypo3\Solr;
3
4
/***************************************************************
5
 *  Copyright notice
6
 *
7
 *  (c) 2009-2015 Ingo Renner <[email protected]>
8
 *  All rights reserved
9
 *
10
 *  This script is part of the TYPO3 project. The TYPO3 project is
11
 *  free software; you can redistribute it and/or modify
12
 *  it under the terms of the GNU General Public License as published by
13
 *  the Free Software Foundation; either version 3 of the License, or
14
 *  (at your option) any later version.
15
 *
16
 *  The GNU General Public License can be found at
17
 *  http://www.gnu.org/copyleft/gpl.html.
18
 *
19
 *  This script is distributed in the hope that it will be useful,
20
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
 *  GNU General Public License for more details.
23
 *
24
 *  This copyright notice MUST APPEAR in all copies of the script!
25
 ***************************************************************/
26
27
use ApacheSolrForTypo3\Solr\Domain\Site\SiteRepository;
28
use ApacheSolrForTypo3\Solr\System\Cache\TwoLevelCache;
29
use ApacheSolrForTypo3\Solr\System\Configuration\ConfigurationManager;
30
use ApacheSolrForTypo3\Solr\System\Configuration\ConfigurationPageResolver;
31
use ApacheSolrForTypo3\Solr\System\Configuration\ExtensionConfiguration;
32
use ApacheSolrForTypo3\Solr\System\Configuration\TypoScriptConfiguration;
33
use TYPO3\CMS\Core\Context\Context;
34
use TYPO3\CMS\Core\Context\LanguageAspect;
35
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
36
use ApacheSolrForTypo3\Solr\System\Mvc\Frontend\Controller\OverriddenTypoScriptFrontendController;
37
use TYPO3\CMS\Backend\Utility\BackendUtility;
38
use TYPO3\CMS\Core\TimeTracker\TimeTracker;
39
use TYPO3\CMS\Core\TypoScript\ExtendedTemplateService;
40
use TYPO3\CMS\Core\Utility\GeneralUtility;
41
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
42
use TYPO3\CMS\Frontend\Page\PageRepository;
43
44
/**
45
 * Utility class for tx_solr
46
 *
47
 * @author Ingo Renner <[email protected]>
48
 */
49
class Util
50
{
51
52
    /**
53
     * Generates a document id for documents representing page records.
54
     *
55
     * @param int $uid The page's uid
56
     * @param int $typeNum The page's typeNum
57
     * @param int $language the language id, defaults to 0
58
     * @param string $accessGroups comma separated list of uids of groups that have access to that page
59
     * @param string $mountPointParameter The mount point parameter that is used to access the page.
60
     * @return string The document id for that page
61 68
     */
62
    public static function getPageDocumentId($uid, $typeNum = 0, $language = 0, $accessGroups = '0,-1', $mountPointParameter = '')
63 68
    {
64
        $additionalParameters = $typeNum . '/' . $language . '/' . $accessGroups;
65 68
66 2
        if ((string)$mountPointParameter !== '') {
67
            $additionalParameters = $mountPointParameter . '/' . $additionalParameters;
68
        }
69 68
70
        $documentId = self::getDocumentId('pages', $uid, $uid, $additionalParameters);
71 68
72
        return $documentId;
73
    }
74
75
    /**
76
     * Generates a document id in the form $siteHash/$type/$uid.
77
     *
78
     * @param string $table The records table name
79
     * @param int $rootPageId The record's site root id
80
     * @param int $uid The record's uid
81
     * @param string $additionalIdParameters Additional ID parameters
82
     * @return string A document id
83 89
     */
84
    public static function getDocumentId($table, $rootPageId, $uid, $additionalIdParameters = '')
85 89
    {
86 89
        $siteRepository = GeneralUtility::makeInstance(SiteRepository::class);
87 89
        $site = $siteRepository->getSiteByPageId($rootPageId);
88
        $siteHash = $site->getSiteHash();
89 89
90 89
        $documentId = $siteHash . '/' . $table . '/' . $uid;
91 68
        if (!empty($additionalIdParameters)) {
92
            $documentId .= '/' . $additionalIdParameters;
93
        }
94 89
95
        return $documentId;
96
    }
97
98
    /**
99
     * Shortcut to retrieve the TypoScript configuration for EXT:solr
100
     * (plugin.tx_solr) from TSFE.
101
     *
102
     * @return TypoScriptConfiguration
103 197
     */
104
    public static function getSolrConfiguration()
105 197
    {
106 197
        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
107
        return $configurationManager->getTypoScriptConfiguration();
108
    }
109
110
    /**
111
     * Gets the Solr configuration for a specific root page id.
112
     * To be used from the backend.
113
     *
114
     * @param int $pageId Id of the (root) page to get the Solr configuration from.
115
     * @param bool $initializeTsfe Optionally initializes a full TSFE to get the configuration, defaults to FALSE
116
     * @param int $language System language uid, optional, defaults to 0
117
     * @return TypoScriptConfiguration The Solr configuration for the requested tree.
118 171
     */
119
    public static function getSolrConfigurationFromPageId($pageId, $initializeTsfe = false, $language = 0)
120 171
    {
121 171
        $rootPath = '';
122
        return self::getConfigurationFromPageId($pageId, $rootPath, $initializeTsfe, $language);
123
    }
124
125
    /**
126
     * Loads the TypoScript configuration for a given page id and language.
127
     * Language usage may be disabled to get the default TypoScript
128
     * configuration.
129
     *
130
     * @param int $pageId Id of the (root) page to get the Solr configuration from.
131
     * @param string $path The TypoScript configuration path to retrieve.
132
     * @param bool $initializeTsfe Optionally initializes a full TSFE to get the configuration, defaults to FALSE
133
     * @param int $language System language uid, optional, defaults to 0
134
     * @param bool $useTwoLevelCache Flag to enable the two level cache for the typoscript configuration array
135
     * @return TypoScriptConfiguration The Solr configuration for the requested tree.
136 175
     */
137
    public static function getConfigurationFromPageId($pageId, $path, $initializeTsfe = false, $language = 0, $useTwoLevelCache = true)
138 175
    {
139
        $pageId = self::getConfigurationPageIdToUse($pageId);
140 175
141 175
        static $configurationObjectCache = [];
142 175
        $cacheId = md5($pageId . '|' . $path . '|' . $language . '|' . ($initializeTsfe ? '1' : '0'));
143 77
        if (isset($configurationObjectCache[$cacheId])) {
144 5
            if ($initializeTsfe) {
145
                self::initializeTsfe($pageId, $language);
146 77
            }
147
            return $configurationObjectCache[$cacheId];
148
        }
149
150
        // If we're on UID 0, we cannot retrieve a configuration currently.
151
        // getRootline() below throws an exception (since #typo3-60 )
152 175
        // as UID 0 cannot have any parent rootline by design.
153 3
        if ($pageId == 0) {
154
            return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray([], $pageId, $language, $path);
155
        }
156 173
157
        if ($useTwoLevelCache) {
158 173
            /** @var $cache TwoLevelCache */
159 173
            $cache = GeneralUtility::makeInstance(TwoLevelCache::class, /** @scrutinizer ignore-type */ 'tx_solr_configuration');
160
            $configurationArray = $cache->get($cacheId);
161
        }
162 173
163
        if (!empty($configurationArray)) {
164
            // we have a cache hit and can return it.
165
            if ($initializeTsfe) {
166
                self::initializeTsfe($pageId, $language);
167
            }
168
            return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray($configurationArray, $pageId, $language, $path);
169
        }
170
171 173
        // we have nothing in the cache. We need to build the configurationToUse
172
        $configurationArray = self::buildConfigurationArray($pageId, $path, $initializeTsfe, $language);
173 173
174 173
        if ($useTwoLevelCache && isset($cache)) {
175
            $cache->set($cacheId, $configurationArray);
176
        }
177 173
178
        return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray($configurationArray, $pageId, $language, $path);
179
    }
180
181
    /**
182
     * This method retrieves the closest pageId where a configuration is located, when this
183
     * feature is enabled.
184
     *
185
     * @param int $pageId
186
     * @return int
187 175
     */
188
    protected static function getConfigurationPageIdToUse($pageId)
189 175
    {
190 175
        $extensionConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class);
191
        if ($extensionConfiguration->getIsUseConfigurationFromClosestTemplateEnabled()) {
192
            /** @var $configurationPageResolve ConfigurationPageResolver */
193
            $configurationPageResolver = GeneralUtility::makeInstance(ConfigurationPageResolver::class);
194
            $pageId = $configurationPageResolver->getClosestPageIdWithActiveTemplate($pageId);
195
            return $pageId;
196 175
        }
197
        return $pageId;
198
    }
199
200
    /**
201
     * Initializes a TSFE, if required and builds an configuration array, containing the solr configuration.
202
     *
203
     * @param integer $pageId
204
     * @param string $path
205
     * @param boolean $initializeTsfe
206
     * @param integer $language
207
     * @return array
208 173
     */
209
    protected static function buildConfigurationArray($pageId, $path, $initializeTsfe, $language)
210 173
    {
211 22
        if ($initializeTsfe) {
212 22
            self::initializeTsfe($pageId, $language);
213
            $configurationToUse = self::getConfigurationFromInitializedTSFE($path);
214 171
        } else {
215
            $configurationToUse = self::getConfigurationFromExistingTSFE($pageId, $path, $language);
216
        }
217 173
218
        return is_array($configurationToUse) ? $configurationToUse : [];
219
    }
220
221
    /**
222
     * Builds the configuration object from a config array and returns it.
223
     *
224
     * @param array $configurationToUse
225
     * @param int $pageId
226
     * @param int $languageId
227
     * @param string $typoScriptPath
228
     * @return TypoScriptConfiguration
229 175
     */
230
    protected static function buildTypoScriptConfigurationFromArray(array $configurationToUse, $pageId, $languageId, $typoScriptPath)
231 175
    {
232 175
        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
233
        return $configurationManager->getTypoScriptConfiguration($configurationToUse, $pageId, $languageId, $typoScriptPath);
234
    }
235
236
    /**
237
     * This function is used to retrieve the configuration from a previous initialized TSFE
238
     * (see: getConfigurationFromPageId)
239
     *
240
     * @param string $path
241
     * @return mixed
242 22
     */
243
    private static function getConfigurationFromInitializedTSFE($path)
244
    {
245 22
        /** @var $tmpl ExtendedTemplateService */
246 22
        $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class);
247 22
        $configuration = $tmpl->ext_getSetup($GLOBALS['TSFE']->tmpl->setup, $path);
248 22
        $configurationToUse = $configuration[0];
249
        return $configurationToUse;
250
    }
251
252
    /**
253
     * This function is used to retrieve the configuration from an existing TSFE instance
254
     *
255
     * @param $pageId
256
     * @param $path
257
     * @param $language
258
     * @return mixed
259 171
     */
260
    private static function getConfigurationFromExistingTSFE($pageId, $path, $language)
261 171
    {
262 171
        if (is_int($language)) {
263
            GeneralUtility::_GETset($language, 'L');
0 ignored issues
show
Deprecated Code introduced by
The function TYPO3\CMS\Core\Utility\GeneralUtility::_GETset() has been deprecated: since TYPO3 v9 LTS, will be removed in TYPO3 v10.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

263
            /** @scrutinizer ignore-deprecated */ GeneralUtility::_GETset($language, 'L');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
264
        }
265
266 171
            /** @var $pageSelect PageRepository */
267 171
        $pageSelect = GeneralUtility::makeInstance(PageRepository::class);
268
        $rootLine = $pageSelect->getRootLine($pageId);
0 ignored issues
show
Deprecated Code introduced by
The function TYPO3\CMS\Frontend\Page\...pository::getRootLine() has been deprecated: since TYPO3 v9, will be removed in TYPO3 v10.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

268
        $rootLine = /** @scrutinizer ignore-deprecated */ $pageSelect->getRootLine($pageId);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
269 171
270 171
        $initializedTsfe = false;
271 171
        $initializedPageSelect = false;
272 92
        if (empty($GLOBALS['TSFE']->sys_page)) {
273 92
            if (empty($GLOBALS['TSFE'])) {
274 92
                $GLOBALS['TSFE'] = new \stdClass();
275 92
                $GLOBALS['TSFE']->tmpl = new \stdClass();
276 92
                $GLOBALS['TSFE']->tmpl->rootLine = $rootLine;
277 92
                $GLOBALS['TSFE']->sys_page = $pageSelect;
278 92
                $GLOBALS['TSFE']->id = $pageId;
279 92
                $GLOBALS['TSFE']->tx_solr_initTsfe = 1;
280
                $initializedTsfe = true;
281
            }
282 92
283 92
            $GLOBALS['TSFE']->sys_page = $pageSelect;
284
            $initializedPageSelect = true;
285
        }
286 171
            /** @var $tmpl ExtendedTemplateService */
287 171
        $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class);
288 171
        $tmpl->tt_track = false; // Do not log time-performance information
289 171
        $tmpl->init();
0 ignored issues
show
Deprecated Code introduced by
The function TYPO3\CMS\Core\TypoScript\TemplateService::init() has been deprecated: since TYPO3 v9, will be removed in TYPO3 v10.0 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

289
        /** @scrutinizer ignore-deprecated */ $tmpl->init();

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
290 171
        $tmpl->runThroughTemplates($rootLine); // This generates the constants/config + hierarchy info for the template.
291
        $tmpl->generateConfig();
292 171
293 171
        $getConfigurationFromInitializedTSFEAndWriteToCache = $tmpl->ext_getSetup($tmpl->setup, $path);
294
        $configurationToUse = $getConfigurationFromInitializedTSFEAndWriteToCache[0];
295 171
296 92
        if ($initializedPageSelect) {
297
            $GLOBALS['TSFE']->sys_page = null;
298 171
        }
299 92
        if ($initializedTsfe) {
300
            unset($GLOBALS['TSFE']);
301 171
        }
302
        return $configurationToUse;
303
    }
304
305
    /**
306
     * Initializes the TSFE for a given page ID and language.
307
     *
308
     * @param int $pageId The page id to initialize the TSFE for
309
     * @param int $language System language uid, optional, defaults to 0
310
     * @param bool $useCache Use cache to reuse TSFE
311
     * @todo When we drop TYPO3 8 support we should use a middleware stack to initialize a TSFE for our needs
312
     * @return void
313 27
     */
314
    public static function initializeTsfe($pageId, $language = 0, $useCache = true)
315 27
    {
316
        static $tsfeCache = [];
317
318 27
        // resetting, a TSFE instance with data from a different page Id could be set already
319
        unset($GLOBALS['TSFE']);
320 27
321
        $cacheId = $pageId . '|' . $language;
322 27
323 26
        if (!is_object($GLOBALS['TT'])) {
324
            $GLOBALS['TT'] = GeneralUtility::makeInstance(TimeTracker::class, false);
325
        }
326 27
327 27
328
        /** @var Context $context */
329
        $context = GeneralUtility::makeInstance(Context::class);
330 27
        $context->setAspect('language', GeneralUtility::makeInstance(LanguageAspect::class, $language));
331
332
        // needs to be set regardless if $GLOBALS['TSFE'] is loaded from cache
333
        // otherwise it is not guaranteed that the correct language id is used everywhere for this index cycle (e.g. Typo3QuerySettings)
334
        GeneralUtility::_GETset($language, 'L');
0 ignored issues
show
Deprecated Code introduced by
The function TYPO3\CMS\Core\Utility\GeneralUtility::_GETset() has been deprecated: since TYPO3 v9 LTS, will be removed in TYPO3 v10.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

334
        /** @scrutinizer ignore-deprecated */ GeneralUtility::_GETset($language, 'L');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
335 27
336 27
        if (!isset($tsfeCache[$cacheId]) || !$useCache) {
337 27
338
            $GLOBALS['TSFE'] = GeneralUtility::makeInstance(OverriddenTypoScriptFrontendController::class, $GLOBALS['TYPO3_CONF_VARS'], $pageId, 0);
339 27
340 27
            // for certain situations we need to trick TSFE into granting us
341
            // access to the page in any case to make getPageAndRootline() work
342
            // see http://forge.typo3.org/issues/42122
343 26
            $pageRecord = BackendUtility::getRecord('pages', $pageId, 'fe_group');
344
            $groupListBackup = $GLOBALS['TSFE']->gr_list;
345 26
            $GLOBALS['TSFE']->gr_list = $pageRecord['fe_group'];
346 26
347 26
            $GLOBALS['TSFE']->sys_page = GeneralUtility::makeInstance(PageRepository::class);
348 26
            self::getPageAndRootlineOfTSFE($pageId);
0 ignored issues
show
Deprecated Code introduced by
The function ApacheSolrForTypo3\Solr\...PageAndRootlineOfTSFE() has been deprecated: This is only implemented to provide compatibility for TYPO3 8 and 9 when we drop TYPO3 8 support this should changed to use a middleware stack ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

348
            /** @scrutinizer ignore-deprecated */ self::getPageAndRootlineOfTSFE($pageId);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
349
350
            // restore gr_list
351 26
            $GLOBALS['TSFE']->gr_list = $groupListBackup;
352 26
353 26
            $GLOBALS['TSFE']->initTemplate();
354 26
            $GLOBALS['TSFE']->forceTemplateParsing = true;
355 26
            $GLOBALS['TSFE']->initFEuser();
356 26
            $GLOBALS['TSFE']->initUserGroups();
357
            //  $GLOBALS['TSFE']->getCompressedTCarray(); // seems to cause conflicts sometimes
358
359
            $GLOBALS['TSFE']->no_cache = true;
360 26
            $GLOBALS['TSFE']->tmpl->start($GLOBALS['TSFE']->rootLine);
361 26
            $GLOBALS['TSFE']->no_cache = false;
362 26
            $GLOBALS['TSFE']->getConfigArray();
363
            $GLOBALS['TSFE']->settingLanguage();
364 26
            if (!$useCache) {
365 26
                $GLOBALS['TSFE']->settingLocale();
366
            }
367
368
            $GLOBALS['TSFE']->newCObj();
369 26
            $GLOBALS['TSFE']->absRefPrefix = self::getAbsRefPrefixFromTSFE($GLOBALS['TSFE']);
370 26
            $GLOBALS['TSFE']->calculateLinkVars();
371 26
372
            // fixes wrong language uid in global context when tsfe is taken from cache
373 26
            $GLOBALS['TSFE']->__set('sys_language_uid', $language);
374
375
376
            if ($useCache) {
377
                $tsfeCache[$cacheId] = $GLOBALS['TSFE'];
378
            }
379
        }
380 27
381
        if ($useCache) {
382
            $GLOBALS['TSFE'] = $tsfeCache[$cacheId];
383
            $GLOBALS['TSFE']->settingLocale();
384 27
        }
385 27
    }
386 27
387 26
    /**
388
     * @deprecated This is only implemented to provide compatibility for TYPO3 8 and 9 when we drop TYPO3 8 support this
389
     * should changed to use a middleware stack
390
     * @param integer $pageId
391
     */
392
    private static function getPageAndRootlineOfTSFE($pageId)
393
    {
394
        //@todo When we drop the support of TYPO3 8 we should use the frontend middleware stack instead of initializing this on our own
395
        /** @var $siteRepository SiteRepository */
396 42
        $siteRepository = GeneralUtility::makeInstance(SiteRepository::class);
397
        $site = $siteRepository->getSiteByPageId($pageId);
398 42
        $GLOBALS['TSFE']->getPageAndRootlineWithDomain($site->getRootPageId());
399
    }
400 42
401
    /**
402
     * Check if record ($table, $uid) is a workspace record
403
     *
404
     * @param string $table The table the record belongs to
405
     * @param int $uid The record's uid
406
     * @return bool TRUE if the record is in a draft workspace, FALSE if it's a LIVE record
407
     */
408 42
    public static function isDraftRecord($table, $uid)
409
    {
410
        $isWorkspaceRecord = false;
411
412
        if ((ExtensionManagementUtility::isLoaded('workspaces')) && (BackendUtility::isTableWorkspaceEnabled($table))) {
413
            $record = BackendUtility::getRecord($table, $uid, 'pid, t3ver_state');
414
415
            if ($record['pid'] == '-1' || $record['t3ver_state'] > 0) {
416
                $isWorkspaceRecord = true;
417
            }
418
        }
419 31
420
        return $isWorkspaceRecord;
421 31
    }
422 31
423 31
    /**
424
     * Check if the page type of a page record is allowed
425 31
     *
426 30
     * @param array $pageRecord The pages database row
427
     * @param string $configurationName The name of the configuration to use.
428
     *
429 31
     * @return bool TRUE if the page type is allowed, otherwise FALSE
430
     */
431
    public static function isAllowedPageType(array $pageRecord, $configurationName = 'pages')
432
    {
433
        $isAllowedPageType = false;
434
        $configurationName = $configurationName ?? 'pages';
435
        $allowedPageTypes = self::getAllowedPageTypes($pageRecord['uid'], $configurationName);
436
437
        if (in_array($pageRecord['doktype'], $allowedPageTypes)) {
438
            $isAllowedPageType = true;
439
        }
440 31
441
        return $isAllowedPageType;
442 31
    }
443 31
444 31
    /**
445
     * Get allowed page types
446
     *
447
     * @param int $pageId Page ID
448
     * @param string $configurationName The name of the configuration to use.
449
     *
450
     * @return array Allowed page types to compare to a doktype of a page record
451
     */
452
    public static function getAllowedPageTypes($pageId, $configurationName = 'pages')
453
    {
454 26
        $rootPath = '';
455
        $configuration = self::getConfigurationFromPageId($pageId, $rootPath);
456 26
        return $configuration->getIndexQueueAllowedPageTypesArrayByConfigurationName($configurationName);
457 26
    }
458 23
459
    /**
460
     * Resolves the configured absRefPrefix to a valid value and resolved if absRefPrefix
461 3
     * is set to "auto".
462 3
     *
463 1
     * @param TypoScriptFrontendController $TSFE
464
     * @return string
465
     */
466 3
    public static function getAbsRefPrefixFromTSFE(TypoScriptFrontendController $TSFE)
467
    {
468
        $absRefPrefix = '';
469
        if (empty($TSFE->config['config']['absRefPrefix'])) {
470
            return $absRefPrefix;
471
        }
472
473
        $absRefPrefix = trim($TSFE->config['config']['absRefPrefix']);
474
        if ($absRefPrefix === 'auto') {
475
            $absRefPrefix = GeneralUtility::getIndpEnv('TYPO3_SITE_PATH');
476
        }
477
478
        return $absRefPrefix;
479
    }
480
481
482
    /**
483
     * This function can be used to check if one of the strings in needles is
484
     * contained in the haystack.
485
     *
486
     *
487
     * Example:
488
     *
489 55
     * haystack: the brown fox
490
     * needles: ['hello', 'world']
491 55
     * result: false
492 55
     *
493 55
     * haystack: the brown fox
494 3
     * needles: ['is', 'fox']
495
     * result: true
496
     *
497
     * @param string $haystack
498 52
     * @param array $needles
499
     * @return bool
500
     */
501
    public static function containsOneOfTheStrings($haystack, array $needles)
502
    {
503
        foreach ($needles as $needle) {
504
            $position = strpos($haystack, $needle);
505
            if ($position !== false) {
506
                return true;
507
            }
508
        }
509
510
        return false;
511
    }
512
513
    /**
514
     * Returns the current sys_language_uid from the active context.
515
     * For Typo3 versions before 9.5 $GLOBALS['TSFE']->sys_language_uid is returned instead.
516
     *
517
     * @return int
518
     */
519
    public static function getLanguageUid()
520
    {
521
        /** @var Context $context */
522
        $context = GeneralUtility::makeInstance(Context::class);
523
        return $context->getPropertyFromAspect('language', 'id');
524
    }
525
}
526