Completed
Push — master ( f7f494...fc247d )
by Timo
26:16 queued 25:29
created

Util::isRootPage()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 25
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 10
cts 10
cp 1
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 15
nc 3
nop 1
crap 3
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\Site\SiteHashService;
28
use ApacheSolrForTypo3\Solr\System\Cache\TwoLevelCache;
29
use ApacheSolrForTypo3\Solr\System\Configuration\ConfigurationManager;
30
use ApacheSolrForTypo3\Solr\System\Configuration\TypoScriptConfiguration;
31
use ApacheSolrForTypo3\Solr\System\Page\Rootline;
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 185
    private static function getConfigurationManager()
214
    {
215
        /** @var ConfigurationManager $configurationManager */
216 185
        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
217 185
        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 60
    public static function getSolrConfigurationFromPageId(
230
        $pageId,
231
        $initializeTsfe = false,
232
        $language = 0
233
    ) {
234 60
        $rootPath = '';
235 60
        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 62
    public static function getConfigurationFromPageId(
251
        $pageId,
252
        $path,
253
        $initializeTsfe = false,
254
        $language = 0,
255
        $useTwoLevelCache = true
256
    ) {
257 62
        static $configurationObjectCache = [];
258 62
        $cacheId = md5($pageId . '|' . $path . '|' . $language);
259 62
        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 62
        if ($pageId == 0) {
267 2
            return $configurationObjectCache[$cacheId] = self::buildTypoScriptConfigurationFromArray([], $pageId, $language, $path);
268
        }
269
270 61
        if ($useTwoLevelCache) {
271
            /** @var $cache TwoLevelCache */
272 61
            $cache = GeneralUtility::makeInstance(TwoLevelCache::class, 'tx_solr_configuration');
273 61
            $configurationArray = $cache->get($cacheId);
274
        }
275
276 61
        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 61
        $configurationArray = self::buildConfigurationArray($pageId, $path, $initializeTsfe, $language);
283
284 61
        if ($useTwoLevelCache && isset($cache)) {
285 61
            $cache->set($cacheId, $configurationArray);
286
        }
287
288 61
        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 61
    protected static function buildConfigurationArray($pageId, $path, $initializeTsfe, $language)
302
    {
303 61
        if ($initializeTsfe) {
304 2
            self::initializeTsfe($pageId, $language);
305 2
            $configurationToUse = self::getConfigurationFromInitializedTSFE($path);
306
        } else {
307 61
            $configurationToUse = self::getConfigurationFromExistingTSFE($pageId, $path, $language);
308
        }
309
310 61
        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 62
    protected static function buildTypoScriptConfigurationFromArray(array $configurationToUse, $pageId, $languageId, $typoScriptPath)
323
    {
324 62
        $configurationManager = self::getConfigurationManager();
325 62
        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 61
    private static function getConfigurationFromExistingTSFE($pageId, $path, $language)
352
    {
353 61
        if (is_int($language)) {
354 60
            GeneralUtility::_GETset($language, 'L');
355
        }
356
357
            /** @var $pageSelect PageRepository */
358 61
        $pageSelect = GeneralUtility::makeInstance(PageRepository::class);
359 61
        $rootLine = $pageSelect->getRootLine($pageId);
360
361 61
        $initializedTsfe = false;
362 61
        $initializedPageSelect = false;
363 61
        if (empty($GLOBALS['TSFE']->sys_page)) {
364 52
            if (empty($GLOBALS['TSFE'])) {
365 52
                $GLOBALS['TSFE'] = new \stdClass();
366 52
                $GLOBALS['TSFE']->tmpl = new \stdClass();
367 52
                $GLOBALS['TSFE']->tmpl->rootLine = $rootLine;
368 52
                $GLOBALS['TSFE']->sys_page = $pageSelect;
369 52
                $GLOBALS['TSFE']->id = $pageId;
370 52
                $GLOBALS['TSFE']->tx_solr_initTsfe = 1;
371 52
                $initializedTsfe = true;
372
            }
373
374 52
            $GLOBALS['TSFE']->sys_page = $pageSelect;
375 52
            $initializedPageSelect = true;
376
        }
377
            /** @var $tmpl ExtendedTemplateService */
378 61
        $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class);
379 61
        $tmpl->tt_track = false; // Do not log time-performance information
380 61
        $tmpl->init();
381 61
        $tmpl->runThroughTemplates($rootLine); // This generates the constants/config + hierarchy info for the template.
382 61
        $tmpl->generateConfig();
383
384 61
        $getConfigurationFromInitializedTSFEAndWriteToCache = $tmpl->ext_getSetup($tmpl->setup, $path);
385 61
        $configurationToUse = $getConfigurationFromInitializedTSFEAndWriteToCache[0];
386
387 61
        if ($initializedPageSelect) {
388 52
            $GLOBALS['TSFE']->sys_page = null;
389
        }
390 61
        if ($initializedTsfe) {
391 52
            unset($GLOBALS['TSFE']);
392
        }
393 61
        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
     */
477 90
    public static function getRootPageId($pageId = 0, $forceFallback = false)
478
    {
479
        /** @var Rootline $rootLine */
480 90
        $rootLine = GeneralUtility::makeInstance(Rootline::class);
481 90
        $rootPageId = intval($pageId) ? intval($pageId) : $GLOBALS['TSFE']->id;
482
483
        // frontend
484 90
        if (!empty($GLOBALS['TSFE']->rootLine)) {
485 54
            $rootLine->setRootLineArray($GLOBALS['TSFE']->rootLine);
486
        }
487
488
        // fallback, backend
489 90
        if ($pageId != 0 && ($forceFallback || !$rootLine->getHasRootPage())) {
490 47
            $pageSelect = GeneralUtility::makeInstance(PageRepository::class);
491 47
            $rootLineArray = $pageSelect->getRootLine($pageId, '', true);
492 47
            $rootLine->setRootLineArray($rootLineArray);
493
        }
494
495 90
        $rootPageFromRootLine = $rootLine->getRootPageId();
496 90
        return $rootPageFromRootLine === 0 ? $rootPageId : $rootPageFromRootLine;
497
    }
498
499
    /**
500
     * Takes a page Id and checks whether the page is marked as root page.
501
     *
502
     * @param int $pageId Page ID
503
     * @return bool TRUE if the page is marked as root page, FALSE otherwise
504
     */
505 51
    public static function isRootPage($pageId)
506
    {
507 51
        $cache = GeneralUtility::makeInstance(TwoLevelCache::class, 'cache_runtime');
508 51
        $cacheId = 'Util' . '_' . 'isRootPage' . '_' . $pageId;
509
510 51
        $isSiteRoot = $cache->get($cacheId);
511 51
        if (!empty($isSiteRoot)) {
512 26
            return $isSiteRoot;
513
        }
514
515 51
        $page = (array)BackendUtility::getRecord('pages', $pageId, 'is_siteroot');
516 51
517
        if (empty($page)) {
518 51
            throw new \InvalidArgumentException(
519
                'The page for the given page ID \'' . $pageId
520 51
                . '\' could not be found in the database and can therefore not be used as site root page.',
521
                1487171426
522
            );
523
        }
524
525
        $isSiteRoot = Site::isRootPage($page);
526
        $cache->set($cacheId, $isSiteRoot);
527
528
        return $isSiteRoot;
529
    }
530
531
    /**
532
     * Gets the site hash for a domain
533
     *
534
     * @deprecated since 6.1 will be removed in 7.0. use SiteHashService->getSiteHashForDomain now.
535
     * @param string $domain Domain to calculate the site hash for.
536
     * @return string site hash for $domain
537
     */
538
    public static function getSiteHashForDomain($domain)
539
    {
540
        GeneralUtility::logDeprecatedFunction();
541
            /** @var $siteHashService SiteHashService */
542
        $siteHashService = GeneralUtility::makeInstance(SiteHashService::class);
543
        return $siteHashService->getSiteHashForDomain($domain);
544
    }
545
546
    /**
547
     * Resolves magic keywords in allowed sites configuration.
548
     * Supported keywords:
549
     *   __solr_current_site - The domain of the site the query has been started from
550
     *   __current_site - Same as __solr_current_site
551
     *   __all - Adds all domains as allowed sites
552
     *   * - Means all sites are allowed, same as no siteHash
553
     *
554
     * @deprecated since 6.1 will be removed in 7.0. use SiteHashService->getAllowedSitesForPageIdAndAllowedSitesConfiguration now.
555
     * @param int $pageId A page ID that is then resolved to the site it belongs to
556
     * @param string $allowedSitesConfiguration TypoScript setting for allowed sites
557
     * @return string List of allowed sites/domains, magic keywords resolved
558
     */
559
    public static function resolveSiteHashAllowedSites($pageId, $allowedSitesConfiguration)
560
    {
561
        /** @var $siteHashService SiteHashService */
562
        GeneralUtility::logDeprecatedFunction();
563
        $siteHashService = GeneralUtility::makeInstance(SiteHashService::class);
564
        return $siteHashService->getAllowedSitesForPageIdAndAllowedSitesConfiguration($pageId, $allowedSitesConfiguration);
565
    }
566 35
567
    /**
568 35
     * Check if record ($table, $uid) is a workspace record
569
     *
570 35
     * @param string $table The table the record belongs to
571
     * @param int $uid The record's uid
572
     * @return bool TRUE if the record is in a draft workspace, FALSE if it's a LIVE record
573
     */
574
    public static function isDraftRecord($table, $uid)
575
    {
576
        $isWorkspaceRecord = false;
577
578 35
        if ((ExtensionManagementUtility::isLoaded('workspaces')) && (BackendUtility::isTableWorkspaceEnabled($table))) {
579
            $record = BackendUtility::getRecord($table, $uid, 'pid, t3ver_state');
580
581
            if ($record['pid'] == '-1' || $record['t3ver_state'] > 0) {
582
                $isWorkspaceRecord = true;
583
            }
584
        }
585
586
        return $isWorkspaceRecord;
587
    }
588 28
589
    /**
590 28
     * Checks whether a record is a localization overlay.
591
     *
592 28
     * @param string $tableName The record's table name
593 6
     * @param array $record The record to check
594
     * @return bool TRUE if the record is a language overlay, FALSE otherwise
595 6
     */
596 3
    public static function isLocalizedRecord($tableName, array $record)
597
    {
598
        $isLocalizedRecord = false;
599
600 28
        if (isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])) {
601
            $translationOriginalPointerField = $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'];
602
603
            if ($record[$translationOriginalPointerField] > 0) {
604
                $isLocalizedRecord = true;
605
            }
606
        }
607
608
        return $isLocalizedRecord;
609
    }
610
611 27
    /**
612
     * Check if the page type of a page record is allowed
613 27
     *
614 27
     * @param array $pageRecord The pages database row
615 27
     * @param string $configurationName The name of the configuration to use.
616
     *
617 27
     * @return bool TRUE if the page type is allowed, otherwise FALSE
618 26
     */
619
    public static function isAllowedPageType(array $pageRecord, $configurationName = 'pages')
620
    {
621 27
        $isAllowedPageType = false;
622
        $configurationName = is_null($configurationName) ? 'pages' : $configurationName;
623
        $allowedPageTypes = self::getAllowedPageTypes($pageRecord['uid'], $configurationName);
624
625
        if (in_array($pageRecord['doktype'], $allowedPageTypes)) {
626
            $isAllowedPageType = true;
627
        }
628
629
        return $isAllowedPageType;
630
    }
631
632 27
    /**
633
     * Get allowed page types
634 27
     *
635 27
     * @param int $pageId Page ID
636 27
     * @param string $configurationName The name of the configuration to use.
637
     *
638
     * @return array Allowed page types to compare to a doktype of a page record
639
     */
640
    public static function getAllowedPageTypes($pageId, $configurationName = 'pages')
641
    {
642
        $rootPath = '';
643
        $configuration = self::getConfigurationFromPageId($pageId, $rootPath);
644
        return $configuration->getIndexQueueAllowedPageTypesArrayByConfigurationName($configurationName);
645
    }
646
647
    /**
648
     * Method to check if a page exists.
649
     *
650
     * @param int $pageId
651
     * @return bool
652
     */
653
    public static function pageExists($pageId)
654
    {
655
        $page = BackendUtility::getRecord('pages', (int)$pageId, 'uid');
656
657
        if (!is_array($page) || $page['uid'] != $pageId) {
658
            return false;
659
        }
660
661
        return true;
662
    }
663 15
664
    /**
665 15
     * Resolves the configured absRefPrefix to a valid value and resolved if absRefPrefix
666 15
     * is set to "auto".
667 12
     *
668
     * @param TypoScriptFrontendController $TSFE
669
     * @return string
670 3
     */
671 3
    public static function getAbsRefPrefixFromTSFE(TypoScriptFrontendController $TSFE)
672 1
    {
673
        $absRefPrefix = '';
674
        if (empty($TSFE->config['config']['absRefPrefix'])) {
675 3
            return $absRefPrefix;
676
        }
677
678
        $absRefPrefix = trim($TSFE->config['config']['absRefPrefix']);
679
        if ($absRefPrefix === 'auto') {
680
            $absRefPrefix = GeneralUtility::getIndpEnv('TYPO3_SITE_PATH');
681
        }
682
683
        return $absRefPrefix;
684
    }
685
686
    /**
687
     * This function can be used to check if one of the strings in needles is
688
     * contained in the haystack.
689
     *
690
     *
691
     * Example:
692
     *
693
     * haystack: the brown fox
694
     * needles: ['hello', 'world']
695
     * result: false
696
     *
697 33
     * haystack: the brown fox
698
     * needles: ['is', 'fox']
699 33
     * result: true
700 33
     *
701 33
     * @param string $haystack
702 33
     * @param array $needles
703
     * @return bool
704
     */
705
    public static function containsOneOfTheStrings($haystack, array $needles)
706 30
    {
707
        foreach ($needles as $needle) {
708
            $position = strpos($haystack, $needle);
709
            if ($position !== false) {
710
                return true;
711
            }
712
        }
713
714
        return false;
715
    }
716
}
717