Completed
Pull Request — master (#976)
by
unknown
32:13
created

Util::getRootPageId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 7
ccs 3
cts 3
cp 1
rs 9.4285
cc 1
eloc 4
nc 1
nop 2
crap 1
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 2 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\Index\Queue\RecordMonitor\Helper\RootPageResolver;
28
use ApacheSolrForTypo3\Solr\Domain\Site\SiteHashService;
29
use ApacheSolrForTypo3\Solr\System\Cache\TwoLevelCache;
30
use ApacheSolrForTypo3\Solr\System\Configuration\ConfigurationManager;
31
use ApacheSolrForTypo3\Solr\System\Configuration\TypoScriptConfiguration;
32
use TYPO3\CMS\Backend\Utility\BackendUtility;
33
use TYPO3\CMS\Core\TimeTracker\NullTimeTracker;
34
use TYPO3\CMS\Core\TypoScript\ExtendedTemplateService;
35
use TYPO3\CMS\Core\Utility\GeneralUtility;
36
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
37
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
38
use TYPO3\CMS\Frontend\Page\PageRepository;
39
40
/**
41
 * Utility class for tx_solr
42
 *
43
 * @author Ingo Renner <[email protected]>
44
 */
45
class Util
46
{
47
    const SOLR_ISO_DATETIME_FORMAT = 'Y-m-d\TH:i:s\Z';
48
49
    /**
50
     * Generates a document id for documents representing page records.
51
     *
52
     * @param int $uid The page's uid
53
     * @param int $typeNum The page's typeNum
54
     * @param int $language the language id, defaults to 0
55
     * @param string $accessGroups comma separated list of uids of groups that have access to that page
56
     * @param string $mountPointParameter The mount point parameter that is used to access the page.
57
     * @return string The document id for that page
58
     */
59 42
    public static function getPageDocumentId(
60
        $uid,
61
        $typeNum = 0,
62
        $language = 0,
63
        $accessGroups = '0,-1',
64
        $mountPointParameter = ''
65
    ) {
66 42
        $additionalParameters = $typeNum . '/' . $language . '/' . $accessGroups;
67
68 42
        if ((string)$mountPointParameter !== '') {
69
            $additionalParameters = $mountPointParameter . '/' . $additionalParameters;
70
        }
71
72 42
        $documentId = self::getDocumentId(
73 42
            'pages',
74
            $uid,
75
            $uid,
76
            $additionalParameters
77
        );
78
79 42
        return $documentId;
80
    }
81
82
    /**
83
     * Generates a document id in the form $siteHash/$type/$uid.
84
     *
85
     * @param string $table The records table name
86
     * @param int $pid The record's pid
87
     * @param int $uid The record's uid
88
     * @param string $additionalIdParameters Additional ID parameters
89
     * @return string A document id
90
     */
91 53
    public static function getDocumentId(
92
        $table,
93
        $pid,
94
        $uid,
95
        $additionalIdParameters = ''
96
    ) {
97 53
        $siteHash = Site::getSiteByPageId($pid)->getSiteHash();
98
99 53
        $documentId = $siteHash . '/' . $table . '/' . $uid;
100 53
        if (!empty($additionalIdParameters)) {
101 42
            $documentId .= '/' . $additionalIdParameters;
102
        }
103
104 53
        return $documentId;
105
    }
106
107
    /**
108
     * Converts a date from unix timestamp to ISO 8601 format.
109
     *
110
     * @param int $timestamp unix timestamp
111
     * @return string the date in ISO 8601 format
112
     */
113 56
    public static function timestampToIso($timestamp)
114
    {
115 56
        return date(self::SOLR_ISO_DATETIME_FORMAT, $timestamp);
116
    }
117
118
    /**
119
     * Converts a date from ISO 8601 format to unix timestamp.
120
     *
121
     * @param string $isoTime date in ISO 8601 format
122
     * @return int unix timestamp
123
     */
124 18
    public static function isoToTimestamp($isoTime)
125
    {
126 18
        $dateTime = \DateTime::createFromFormat(self::SOLR_ISO_DATETIME_FORMAT,
127
            $isoTime);
128 18
        return $dateTime ? (int)$dateTime->format('U') : 0;
129
    }
130
131
    /**
132
     * Converts a date from unix timestamp to ISO 8601 format in UTC timezone.
133
     *
134
     * @param int $timestamp unix timestamp
135
     * @return string the date in ISO 8601 format
136
     */
137
    public static function timestampToUtcIso($timestamp)
138
    {
139
        return gmdate(self::SOLR_ISO_DATETIME_FORMAT, $timestamp);
140
    }
141
142
    /**
143
     * Converts a date from ISO 8601 format in UTC timezone to unix timestamp.
144
     *
145
     * @param string $isoTime date in ISO 8601 format
146
     * @return int unix timestamp
147
     */
148
    public static function utcIsoToTimestamp($isoTime)
149
    {
150
        $utcTimeZone = new \DateTimeZone('UTC');
151
        $dateTime = \DateTime::createFromFormat(self::SOLR_ISO_DATETIME_FORMAT,
152
            $isoTime, $utcTimeZone);
153
        return $dateTime ? (int)$dateTime->format('U') : 0;
154
    }
155
156
    /**
157
     * Returns given word as CamelCased.
158
     *
159
     * Converts a word like "send_email" to "SendEmail". It
160
     * will remove non alphanumeric characters from the word, so
161
     * "who's online" will be converted to "WhoSOnline"
162
     *
163
     * @param string $word Word to convert to camel case
164
     * @return string UpperCamelCasedWord
165
     */
166
    public static function camelize($word)
167
    {
168
        return str_replace(' ', '',
169
            ucwords(preg_replace('![^A-Z^a-z^0-9]+!', ' ', $word)));
170
    }
171
172
    /**
173
     * Returns a given CamelCasedString as an lowercase string with underscores.
174
     * Example: Converts BlogExample to blog_example, and minimalValue to minimal_value
175
     *
176
     * @param string $string String to be converted to lowercase underscore
177
     * @return string     lowercase_and_underscored_string
178
     */
179
    public static function camelCaseToLowerCaseUnderscored($string)
180
    {
181
        return strtolower(preg_replace('/(?<=\w)([A-Z])/', '_\\1', $string));
182
    }
183
184
    /**
185
     * Returns a given string with underscores as UpperCamelCase.
186
     * Example: Converts blog_example to BlogExample
187
     *
188
     * @param string $string String to be converted to camel case
189
     * @return string     UpperCamelCasedWord
190
     */
191 26
    public static function underscoredToUpperCamelCase($string)
192
    {
193 26
        return str_replace(' ', '',
194 26
            ucwords(str_replace('_', ' ', strtolower($string))));
195
    }
196
197
    /**
198
     * Shortcut to retrieve the TypoScript configuration for EXT:solr
199
     * (plugin.tx_solr) from TSFE.
200
     *
201
     * @return TypoScriptConfiguration
202
     */
203 148
    public static function getSolrConfiguration()
204
    {
205 148
        $configurationManager = self::getConfigurationManager();
206
207 148
        return $configurationManager->getTypoScriptConfiguration();
208
    }
209
210
    /**
211
     * @return ConfigurationManager
212
     */
213 184
    private static function getConfigurationManager()
214
    {
215
        /** @var ConfigurationManager $configurationManager */
216 184
        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
217 184
        return $configurationManager;
218
    }
219
220
    /**
221
     * Gets the Solr configuration for a specific root page id.
222
     * To be used from the backend.
223
     *
224
     * @param int $pageId Id of the (root) page to get the Solr configuration from.
225
     * @param bool $initializeTsfe Optionally initializes a full TSFE to get the configuration, defaults to FALSE
226
     * @param int $language System language uid, optional, defaults to 0
227
     * @return TypoScriptConfiguration The Solr configuration for the requested tree.
228
     */
229 59
    public static function getSolrConfigurationFromPageId(
230
        $pageId,
231
        $initializeTsfe = false,
232
        $language = 0
233
    ) {
234 59
        $rootPath = '';
235 59
        return self::getConfigurationFromPageId($pageId, $rootPath, $initializeTsfe, $language);
236
    }
237
238
    /**
239
     * Loads the TypoScript configuration for a given page id and language.
240
     * Language usage may be disabled to get the default TypoScript
241
     * configuration.
242
     *
243
     * @param int $pageId Id of the (root) page to get the Solr configuration from.
244
     * @param string $path The TypoScript configuration path to retrieve.
245
     * @param bool $initializeTsfe Optionally initializes a full TSFE to get the configuration, defaults to FALSE
246
     * @param int|bool $language System language uid or FALSE to disable language usage, optional, defaults to 0
247
     * @param bool $useTwoLevelCache Flag to enable the two level cache for the typoscript configuration array
248
     * @return TypoScriptConfiguration The Solr configuration for the requested tree.
249
     */
250 61
    public static function getConfigurationFromPageId(
251
        $pageId,
252
        $path,
253
        $initializeTsfe = false,
254
        $language = 0,
255
        $useTwoLevelCache = true
256
    ) {
257 61
        static $configurationObjectCache = [];
258 61
        $cacheId = md5($pageId . '|' . $path . '|' . $language);
259 61
        if (isset($configurationObjectCache[$cacheId])) {
260 53
            return $configurationObjectCache[$cacheId];
261
        }
262
263
        // If we're on UID 0, we cannot retrieve a configuration currently.
264
        // getRootline() below throws an exception (since #typo3-60 )
265
        // as UID 0 cannot have any parent rootline by design.
266 61
        if ($pageId == 0) {
267 2
            return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray([], $pageId, $language, $path);
268
        }
269
270 60
        if ($useTwoLevelCache) {
271
            /** @var $cache TwoLevelCache */
272 60
            $cache = GeneralUtility::makeInstance(TwoLevelCache::class, 'tx_solr_configuration');
273 60
            $configurationArray = $cache->get($cacheId);
274
        }
275
276 60
        if (!empty($configurationArray)) {
277
            // we have a cache hit and can return it.
278
            return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray($configurationArray, $pageId, $language, $path);
279
        }
280
281
        // we have nothing in the cache. We need to build the configurationToUse
282 60
        $configurationArray = self::buildConfigurationArray($pageId, $path, $initializeTsfe, $language);
283
284 60
        if ($useTwoLevelCache && isset($cache)) {
285 60
            $cache->set($cacheId, $configurationArray);
286
        }
287
288 60
        return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray($configurationArray, $pageId, $language, $path);
289
    }
290
291
292
    /**
293
     * Initializes a TSFE, if required and builds an configuration array, containing the solr configuration.
294
     *
295
     * @param integer $pageId
296
     * @param string $path
297
     * @param boolean $initializeTsfe
298
     * @param integer $language
299
     * @return array
300
     */
301 60
    protected static function buildConfigurationArray($pageId, $path, $initializeTsfe, $language)
302
    {
303 60
        if ($initializeTsfe) {
304 2
            self::initializeTsfe($pageId, $language);
305 2
            $configurationToUse = self::getConfigurationFromInitializedTSFE($path);
306
        } else {
307 60
            $configurationToUse = self::getConfigurationFromExistingTSFE($pageId, $path, $language);
308
        }
309
310 60
        return is_array($configurationToUse) ? $configurationToUse : [];
311
    }
312
313
    /**
314
     * Builds the configuration object from a config array and returns it.
315
     *
316
     * @param array $configurationToUse
317
     * @param int $pageId
318
     * @param int $languageId
319
     * @param string $typoScriptPath
320
     * @return TypoScriptConfiguration
321
     */
322 61
    protected static function buildTypoScriptConfigurationFromArray(array $configurationToUse, $pageId, $languageId, $typoScriptPath)
323
    {
324 61
        $configurationManager = self::getConfigurationManager();
325 61
        return $configurationManager->getTypoScriptConfiguration($configurationToUse, $pageId, $languageId, $typoScriptPath);
326
    }
327
328
    /**
329
     * This function is used to retrieve the configuration from a previous initialized TSFE
330
     * (see: getConfigurationFromPageId)
331
     *
332
     * @param string $path
333
     * @return mixed
334
     */
335 2
    private static function getConfigurationFromInitializedTSFE($path)
336
    {
337
        /** @var $tmpl ExtendedTemplateService */
338 2
        $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class);
339 2
        $configuration = $tmpl->ext_getSetup($GLOBALS['TSFE']->tmpl->setup, $path);
340 2
        $configurationToUse = $configuration[0];
341 2
        return $configurationToUse;
342
    }
343
344
    /**
345
     * This function is used to retrieve the configuration from an existing TSFE instance
346
     * @param $pageId
347
     * @param $path
348
     * @param $language
349
     * @return mixed
350
     */
351 60
    private static function getConfigurationFromExistingTSFE($pageId, $path, $language)
352
    {
353 60
        if (is_int($language)) {
354 59
            GeneralUtility::_GETset($language, 'L');
355
        }
356
357
            /** @var $pageSelect PageRepository */
358 60
        $pageSelect = GeneralUtility::makeInstance(PageRepository::class);
359 60
        $rootLine = $pageSelect->getRootLine($pageId);
360
361 60
        $initializedTsfe = false;
362 60
        $initializedPageSelect = false;
363 60
        if (empty($GLOBALS['TSFE']->sys_page)) {
364 51
            if (empty($GLOBALS['TSFE'])) {
365 51
                $GLOBALS['TSFE'] = new \stdClass();
366 51
                $GLOBALS['TSFE']->tmpl = new \stdClass();
367 51
                $GLOBALS['TSFE']->tmpl->rootLine = $rootLine;
368 51
                $GLOBALS['TSFE']->sys_page = $pageSelect;
369 51
                $GLOBALS['TSFE']->id = $pageId;
370 51
                $GLOBALS['TSFE']->tx_solr_initTsfe = 1;
371 51
                $initializedTsfe = true;
372
            }
373
374 51
            $GLOBALS['TSFE']->sys_page = $pageSelect;
375 51
            $initializedPageSelect = true;
376
        }
377
            /** @var $tmpl ExtendedTemplateService */
378 60
        $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class);
379 60
        $tmpl->tt_track = false; // Do not log time-performance information
380 60
        $tmpl->init();
381 60
        $tmpl->runThroughTemplates($rootLine); // This generates the constants/config + hierarchy info for the template.
382 60
        $tmpl->generateConfig();
383
384 60
        $getConfigurationFromInitializedTSFEAndWriteToCache = $tmpl->ext_getSetup($tmpl->setup, $path);
385 60
        $configurationToUse = $getConfigurationFromInitializedTSFEAndWriteToCache[0];
386
387 60
        if ($initializedPageSelect) {
388 51
            $GLOBALS['TSFE']->sys_page = null;
389
        }
390 60
        if ($initializedTsfe) {
391 51
            unset($GLOBALS['TSFE']);
392
        }
393 60
        return $configurationToUse;
394
    }
395
396
    /**
397
     * Initializes the TSFE for a given page ID and language.
398
     *
399
     * @param int $pageId The page id to initialize the TSFE for
400
     * @param int $language System language uid, optional, defaults to 0
401
     * @param bool $useCache Use cache to reuse TSFE
402
     * @return void
403
     */
404 15
    public static function initializeTsfe(
405
        $pageId,
406
        $language = 0,
407
        $useCache = true
408
    ) {
409 15
        static $tsfeCache = [];
410
411
        // resetting, a TSFE instance with data from a different page Id could be set already
412 15
        unset($GLOBALS['TSFE']);
413
414 15
        $cacheId = $pageId . '|' . $language;
415
416 15
        if (!is_object($GLOBALS['TT'])) {
417 15
            $GLOBALS['TT'] = GeneralUtility::makeInstance(NullTimeTracker::class);
418
        }
419
420 15
        if (!isset($tsfeCache[$cacheId]) || !$useCache) {
421 15
            GeneralUtility::_GETset($language, 'L');
422
423 15
            $GLOBALS['TSFE'] = GeneralUtility::makeInstance(TypoScriptFrontendController::class,
424 15
                $GLOBALS['TYPO3_CONF_VARS'], $pageId, 0);
425
426
            // for certain situations we need to trick TSFE into granting us
427
            // access to the page in any case to make getPageAndRootline() work
428
            // see http://forge.typo3.org/issues/42122
429 15
            $pageRecord = BackendUtility::getRecord('pages', $pageId, 'fe_group');
430 15
            $groupListBackup = $GLOBALS['TSFE']->gr_list;
431 15
            $GLOBALS['TSFE']->gr_list = $pageRecord['fe_group'];
432
433 15
            $GLOBALS['TSFE']->sys_page = GeneralUtility::makeInstance(PageRepository::class);
434 15
            $GLOBALS['TSFE']->getPageAndRootline();
435
436
            // restore gr_list
437 15
            $GLOBALS['TSFE']->gr_list = $groupListBackup;
438
439 15
            $GLOBALS['TSFE']->initTemplate();
440 15
            $GLOBALS['TSFE']->forceTemplateParsing = true;
441 15
            $GLOBALS['TSFE']->initFEuser();
442 15
            $GLOBALS['TSFE']->initUserGroups();
443
            //  $GLOBALS['TSFE']->getCompressedTCarray(); // seems to cause conflicts sometimes
444
445 15
            $GLOBALS['TSFE']->no_cache = true;
446 15
            $GLOBALS['TSFE']->tmpl->start($GLOBALS['TSFE']->rootLine);
447 15
            $GLOBALS['TSFE']->no_cache = false;
448 15
            $GLOBALS['TSFE']->getConfigArray();
449
450 15
            $GLOBALS['TSFE']->settingLanguage();
451 15
            if (!$useCache) {
452
                $GLOBALS['TSFE']->settingLocale();
453
            }
454
455 15
            $GLOBALS['TSFE']->newCObj();
456 15
            $GLOBALS['TSFE']->absRefPrefix = self::getAbsRefPrefixFromTSFE($GLOBALS['TSFE']);
457 15
            $GLOBALS['TSFE']->calculateLinkVars();
458
459 15
            if ($useCache) {
460 15
                $tsfeCache[$cacheId] = $GLOBALS['TSFE'];
461
            }
462
        }
463
464 15
        if ($useCache) {
465 15
            $GLOBALS['TSFE'] = $tsfeCache[$cacheId];
466 15
            $GLOBALS['TSFE']->settingLocale();
467
        }
468 15
    }
469
470
    /**
471
     * Determines the rootpage ID for a given page.
472
     *
473
     * @param int $pageId A page ID somewhere in a tree.
474
     * @param bool $forceFallback Force the explicit detection and do not use the current frontend root line
475
     * @return int The page's tree branch's root page ID
476
     * @deprecated since 6.1 will be removed in 7.0
477 90
     */
478
    public function getRootPageId($pageId = 0, $forceFallback = false)
479
    {
480 90
        GeneralUtility::logDeprecatedFunction();
481 90
        $rootPageResolver = GeneralUtility::makeInstance(RootPageResolver::class);
482
483
        return $rootPageResolver->getRootPageId($pageId, $forceFallback);
484 90
    }
485 54
486
    /**
487
     * Takes a page Id and checks whether the page is marked as root page.
488
     *
489 90
     * @param int $pageId Page ID
490 47
     * @return bool TRUE if the page is marked as root page, FALSE otherwise
491 47
     * @deprecated since 6.1 will be removed in 7.0
492 47
     */
493
    public static function isRootPage($pageId)
494
    {
495 90
        GeneralUtility::logDeprecatedFunction();
496 90
        $rootPageResolver = GeneralUtility::makeInstance(RootPageResolver::class);
497
498
        return $rootPageResolver->getIsRootPageId($pageId);
499
    }
500
501
    /**
502
     * Gets the site hash for a domain
503
     *
504
     * @deprecated since 6.1 will be removed in 7.0. use SiteHashService->getSiteHashForDomain now.
505 51
     * @param string $domain Domain to calculate the site hash for.
506
     * @return string site hash for $domain
507 51
     */
508 51
    public static function getSiteHashForDomain($domain)
509
    {
510 51
        GeneralUtility::logDeprecatedFunction();
511 51
            /** @var $siteHashService SiteHashService */
512 26
        $siteHashService = GeneralUtility::makeInstance(SiteHashService::class);
513
        return $siteHashService->getSiteHashForDomain($domain);
514
    }
515 51
516
    /**
517 51
     * Resolves magic keywords in allowed sites configuration.
518 1
     * Supported keywords:
519 1
     *   __solr_current_site - The domain of the site the query has been started from
520 1
     *   __current_site - Same as __solr_current_site
521 1
     *   __all - Adds all domains as allowed sites
522
     *   * - Means all sites are allowed, same as no siteHash
523
     *
524
     * @deprecated since 6.1 will be removed in 7.0. use SiteHashService->getAllowedSitesForPageIdAndAllowedSitesConfiguration now.
525 50
     * @param int $pageId A page ID that is then resolved to the site it belongs to
526 50
     * @param string $allowedSitesConfiguration TypoScript setting for allowed sites
527
     * @return string List of allowed sites/domains, magic keywords resolved
528 50
     */
529
    public static function resolveSiteHashAllowedSites($pageId, $allowedSitesConfiguration)
530
    {
531
        /** @var $siteHashService SiteHashService */
532
        GeneralUtility::logDeprecatedFunction();
533
        $siteHashService = GeneralUtility::makeInstance(SiteHashService::class);
534
        return $siteHashService->getAllowedSitesForPageIdAndAllowedSitesConfiguration($pageId, $allowedSitesConfiguration);
535
    }
536
537
    /**
538
     * Check if record ($table, $uid) is a workspace record
539
     *
540
     * @param string $table The table the record belongs to
541
     * @param int $uid The record's uid
542
     * @return bool TRUE if the record is in a draft workspace, FALSE if it's a LIVE record
543
     */
544
    public static function isDraftRecord($table, $uid)
545
    {
546
        $isWorkspaceRecord = false;
547
548
        if ((ExtensionManagementUtility::isLoaded('workspaces')) && (BackendUtility::isTableWorkspaceEnabled($table))) {
549
            $record = BackendUtility::getRecord($table, $uid, 'pid, t3ver_state');
550
551
            if ($record['pid'] == '-1' || $record['t3ver_state'] > 0) {
552
                $isWorkspaceRecord = true;
553
            }
554
        }
555
556
        return $isWorkspaceRecord;
557
    }
558
559
    /**
560
     * Checks whether a record is a localization overlay.
561
     *
562
     * @param string $tableName The record's table name
563
     * @param array $record The record to check
564
     * @return bool TRUE if the record is a language overlay, FALSE otherwise
565
     */
566
    public static function isLocalizedRecord($tableName, array $record)
567
    {
568
        $isLocalizedRecord = false;
569
570
        if (isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])) {
571
            $translationOriginalPointerField = $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'];
572
573
            if ($record[$translationOriginalPointerField] > 0) {
574 35
                $isLocalizedRecord = true;
575
            }
576 35
        }
577
578 35
        return $isLocalizedRecord;
579
    }
580
581
    /**
582
     * Check if the page type of a page record is allowed
583
     *
584
     * @param array $pageRecord The pages database row
585
     * @param string $configurationName The name of the configuration to use.
586 35
     *
587
     * @return bool TRUE if the page type is allowed, otherwise FALSE
588
     */
589
    public static function isAllowedPageType(array $pageRecord, $configurationName = 'pages')
590
    {
591
        $isAllowedPageType = false;
592
        $configurationName = is_null($configurationName) ? 'pages' : $configurationName;
593
        $allowedPageTypes = self::getAllowedPageTypes($pageRecord['uid'], $configurationName);
594
595
        if (in_array($pageRecord['doktype'], $allowedPageTypes)) {
596 28
            $isAllowedPageType = true;
597
        }
598 28
599
        return $isAllowedPageType;
600 28
    }
601 6
602
    /**
603 6
     * Get allowed page types
604 3
     *
605
     * @param int $pageId Page ID
606
     * @param string $configurationName The name of the configuration to use.
607
     *
608 28
     * @return array Allowed page types to compare to a doktype of a page record
609
     */
610
    public static function getAllowedPageTypes($pageId, $configurationName = 'pages')
611
    {
612
        $rootPath = '';
613
        $configuration = self::getConfigurationFromPageId($pageId, $rootPath);
614
        return $configuration->getIndexQueueAllowedPageTypesArrayByConfigurationName($configurationName);
615
    }
616
617
    /**
618
     * Method to check if a page exists.
619 27
     *
620
     * @param int $pageId
621 27
     * @return bool
622 27
     */
623 27
    public static function pageExists($pageId)
624
    {
625 27
        $page = BackendUtility::getRecord('pages', (int)$pageId, 'uid');
626 26
627
        if (!is_array($page) || $page['uid'] != $pageId) {
628
            return false;
629 27
        }
630
631
        return true;
632
    }
633
634
    /**
635
     * Resolves the configured absRefPrefix to a valid value and resolved if absRefPrefix
636
     * is set to "auto".
637
     *
638
     * @param TypoScriptFrontendController $TSFE
639
     * @return string
640 27
     */
641
    public static function getAbsRefPrefixFromTSFE(TypoScriptFrontendController $TSFE)
642 27
    {
643 27
        $absRefPrefix = '';
644 27
        if (empty($TSFE->config['config']['absRefPrefix'])) {
645
            return $absRefPrefix;
646
        }
647
648
        $absRefPrefix = trim($TSFE->config['config']['absRefPrefix']);
649
        if ($absRefPrefix === 'auto') {
650
            $absRefPrefix = GeneralUtility::getIndpEnv('TYPO3_SITE_PATH');
651
        }
652
653
        return $absRefPrefix;
654
    }
655
656
    /**
657
     * This function can be used to check if one of the strings in needles is
658
     * contained in the haystack.
659
     *
660
     *
661
     * Example:
662
     *
663
     * haystack: the brown fox
664
     * needles: ['hello', 'world']
665
     * result: false
666
     *
667
     * haystack: the brown fox
668
     * needles: ['is', 'fox']
669
     * result: true
670
     *
671 15
     * @param string $haystack
672
     * @param array $needles
673 15
     * @return bool
674 15
     */
675 12
    public static function containsOneOfTheStrings($haystack, array $needles)
676
    {
677
        foreach ($needles as $needle) {
678 3
            $position = strpos($haystack, $needle);
679 3
            if ($position !== false) {
680 1
                return true;
681
            }
682
        }
683 3
684
        return false;
685
    }
686
}
687