‪TYPO3CMS  ‪main
BackendConfigurationManager.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ServerRequestInterface;
47 
73 {
77  protected array ‪$configuration = [];
78 
82  protected ?string ‪$extensionName = null;
83 
87  protected ?string ‪$pluginName = null;
88 
92  protected ?int ‪$currentPageId = null;
93 
98  private ?ServerRequestInterface ‪$request = null;
99 
100  public function ‪__construct(
101  private readonly ‪TypoScriptService $typoScriptService,
102  private readonly ‪PhpFrontend $typoScriptCache,
103  private readonly ‪FrontendInterface $runtimeCache,
104  private readonly ‪SysTemplateRepository $sysTemplateRepository,
105  private readonly ‪SysTemplateTreeBuilder $treeBuilder,
106  private readonly ‪LossyTokenizer $lossyTokenizer,
107  private readonly ‪ConditionVerdictAwareIncludeTreeTraverser $includeTreeTraverserConditionVerdictAware,
108  private readonly ‪SiteFinder $siteFinder,
109  ) {}
110 
111  public function ‪setRequest(ServerRequestInterface ‪$request): void
112  {
113  $this->request = ‪$request;
114  }
115 
122  public function ‪setConfiguration(array ‪$configuration = []): void
123  {
124  $this->extensionName = ‪$configuration['extensionName'] ?? null;
125  $this->pluginName = ‪$configuration['pluginName'] ?? null;
126  $this->configuration = $this->typoScriptService->convertTypoScriptArrayToPlainArray(‪$configuration);
127  }
128 
139  public function ‪getConfiguration(?string ‪$extensionName = null, ?string ‪$pluginName = null): array
140  {
141  $frameworkConfiguration = $this->‪getExtbaseConfiguration();
142  if (!isset($frameworkConfiguration['persistence']['storagePid'])) {
143  $frameworkConfiguration['persistence']['storagePid'] = $this->‪getCurrentPageId();
144  }
145  // only merge $this->configuration and override controller configuration when retrieving configuration of the current plugin
146  if ($extensionName === null || ‪$extensionName === $this->extensionName && ‪$pluginName === $this->pluginName) {
147  $pluginConfiguration = $this->‪getPluginConfiguration((string)$this->extensionName, (string)$this->pluginName);
148  ArrayUtility::mergeRecursiveWithOverrule($pluginConfiguration, $this->configuration);
149  $pluginConfiguration['controllerConfiguration'] = [];
150  } else {
151  $pluginConfiguration = $this->‪getPluginConfiguration((string)$extensionName, (string)‪$pluginName);
152  $pluginConfiguration['controllerConfiguration'] = [];
153  }
154  ArrayUtility::mergeRecursiveWithOverrule($frameworkConfiguration, $pluginConfiguration);
155 
156  if (!empty($frameworkConfiguration['persistence']['storagePid'])) {
157  if (is_array($frameworkConfiguration['persistence']['storagePid'])) {
158  // We simulate the frontend to enable the use of cObjects in
159  // stdWrap. We then convert the configuration to normal TypoScript
160  // and apply the stdWrap to the storagePid
161  // Use makeInstance here since extbase Bootstrap always setContentObject(null) in Backend, no need to call getContentObject().
162  ‪FrontendSimulatorUtility::simulateFrontendEnvironment(GeneralUtility::makeInstance(ContentObjectRenderer::class));
163  $conf = $this->typoScriptService->convertPlainArrayToTypoScriptArray($frameworkConfiguration['persistence']);
164  $frameworkConfiguration['persistence']['storagePid'] = ‪$GLOBALS['TSFE']->cObj->stdWrapValue('storagePid', $conf);
166  }
167 
168  if (!empty($frameworkConfiguration['persistence']['recursive'])) {
169  $storagePids = $this->‪getRecursiveStoragePids(
170  ‪GeneralUtility::intExplode(',', (string)($frameworkConfiguration['persistence']['storagePid'] ?? '')),
171  (int)$frameworkConfiguration['persistence']['recursive']
172  );
173  $frameworkConfiguration['persistence']['storagePid'] = implode(',', $storagePids);
174  }
175  }
176  return $frameworkConfiguration;
177  }
178 
184  public function ‪getTypoScriptSetup(): array
185  {
186  $pageId = $this->‪getCurrentPageId();
187 
188  $cacheIdentifier = 'extbase-backend-typoscript-pageId-' . $pageId;
189  $setupArray = $this->runtimeCache->get($cacheIdentifier);
190  if (is_array($setupArray)) {
191  return $setupArray;
192  }
193 
194  $site = $this->request?->getAttribute('site');
195  if (($site === null || $site instanceof ‪NullSite) && $pageId > 0) {
196  // Due to the weird magic of getting the pid of the first root template when
197  // not having a pageId (extbase BE modules without page tree / no page selected),
198  // we also have no proper site in this case.
199  // So we try to get the site for this pageId. This way, site settings for this
200  // first TS page are turned into constants and can be used in setup and setup
201  // conditions.
202  try {
203  $site = $this->siteFinder->getSiteByPageId($pageId);
204  } catch (‪SiteNotFoundException) {
205  // Keep null / NullSite when no site could be determined for whatever reason.
206  }
207  }
208 
209  $rootLine = [];
210  $sysTemplateFakeRow = [
211  'uid' => 0,
212  'pid' => 0,
213  'title' => 'Fake sys_template row to force extension statics loading',
214  'root' => 1,
215  'clear' => 3,
216  'include_static_file' => '',
217  'basedOn' => '',
218  'includeStaticAfterBasedOn' => 0,
219  'static_file_mode' => false,
220  'constants' => '',
221  'config' => '',
222  'deleted' => 0,
223  'hidden' => 0,
224  'starttime' => 0,
225  'endtime' => 0,
226  'sorting' => 0,
227  ];
228  if ($pageId > 0) {
229  $rootLine = GeneralUtility::makeInstance(RootlineUtility::class, $pageId)->get();
230  $sysTemplateRows = $this->sysTemplateRepository->getSysTemplateRowsByRootline($rootLine, $this->request);
231  ksort($rootLine);
232  }
233  if (empty($sysTemplateRows)) {
234  // If there is no page (pid 0 only), or if the first 'is_siteroot' site has no sys_template record,
235  // then we "fake" a sys_template row: This triggers inclusion of 'global' and 'extension static' TypoScript.
236  $sysTemplateRows[] = $sysTemplateFakeRow;
237  }
238 
239  // We do cache tree and tokens, but don't cache full ast in this backend context for now:
240  // That's a possible improvement to further speed up extbase backend modules, but a bit of
241  // hassle. See the Frontend TypoScript calculation on how to do this.
242  $constantIncludeTree = $this->treeBuilder->getTreeBySysTemplateRowsAndSite('constants', $sysTemplateRows, $this->lossyTokenizer, $site, $this->typoScriptCache);
243  $expressionMatcherVariables = [
244  'request' => ‪$this->request,
245  'pageId' => $pageId,
246  'page' => !empty($rootLine) ? $rootLine[array_key_first($rootLine)] : [],
247  'fullRootLine' => $rootLine,
248  'site' => $site,
249  ];
250  $conditionMatcherVisitor = GeneralUtility::makeInstance(IncludeTreeConditionMatcherVisitor::class);
251  $conditionMatcherVisitor->initializeExpressionMatcherWithVariables($expressionMatcherVariables);
252  $includeTreeTraverserConditionVerdictAwareVisitors = [];
253  $includeTreeTraverserConditionVerdictAwareVisitors[] = $conditionMatcherVisitor;
254  $constantAstBuilderVisitor = GeneralUtility::makeInstance(IncludeTreeAstBuilderVisitor::class);
255  $includeTreeTraverserConditionVerdictAwareVisitors[] = $constantAstBuilderVisitor;
256  $this->includeTreeTraverserConditionVerdictAware->traverse($constantIncludeTree, $includeTreeTraverserConditionVerdictAwareVisitors);
257  $constantsAst = $constantAstBuilderVisitor->getAst();
258  $flatConstants = $constantsAst->flatten();
259 
260  $setupIncludeTree = $this->treeBuilder->getTreeBySysTemplateRowsAndSite('setup', $sysTemplateRows, $this->lossyTokenizer, $site, $this->typoScriptCache);
261  $includeTreeTraverserConditionVerdictAwareVisitors = [];
262  $setupConditionConstantSubstitutionVisitor = new ‪IncludeTreeSetupConditionConstantSubstitutionVisitor();
263  $setupConditionConstantSubstitutionVisitor->setFlattenedConstants($flatConstants);
264  $includeTreeTraverserConditionVerdictAwareVisitors[] = $setupConditionConstantSubstitutionVisitor;
265  $setupMatcherVisitor = GeneralUtility::makeInstance(IncludeTreeConditionMatcherVisitor::class);
266  $setupMatcherVisitor->initializeExpressionMatcherWithVariables($expressionMatcherVariables);
267  $includeTreeTraverserConditionVerdictAwareVisitors[] = $setupMatcherVisitor;
268  $setupAstBuilderVisitor = GeneralUtility::makeInstance(IncludeTreeAstBuilderVisitor::class);
269  $setupAstBuilderVisitor->setFlatConstants($flatConstants);
270  $includeTreeTraverserConditionVerdictAwareVisitors[] = $setupAstBuilderVisitor;
271  $this->includeTreeTraverserConditionVerdictAware->traverse($setupIncludeTree, $includeTreeTraverserConditionVerdictAwareVisitors);
272  $setupAst = $setupAstBuilderVisitor->getAst();
273 
274  $setupArray = $setupAst->toArray();
275 
276  $this->runtimeCache->set($cacheIdentifier, $setupArray);
277 
278  return $setupArray;
279  }
280 
284  protected function ‪getExtbaseConfiguration(): array
285  {
286  $setup = $this->‪getTypoScriptSetup();
287  $extbaseConfiguration = [];
288  if (isset($setup['config.']['tx_extbase.'])) {
289  $extbaseConfiguration = $this->typoScriptService->convertTypoScriptArrayToPlainArray($setup['config.']['tx_extbase.']);
290  }
291  return $extbaseConfiguration;
292  }
293 
300  protected function ‪getPluginConfiguration(string ‪$extensionName, string ‪$pluginName = null): array
301  {
302  $setup = $this->‪getTypoScriptSetup();
303  $pluginConfiguration = [];
304  if (is_array($setup['module.']['tx_' . strtolower(‪$extensionName) . '.'] ?? false)) {
305  $pluginConfiguration = $this->typoScriptService->convertTypoScriptArrayToPlainArray($setup['module.']['tx_' . strtolower(‪$extensionName) . '.']);
306  }
307  if (‪$pluginName !== null) {
308  $pluginSignature = strtolower(‪$extensionName . '_' . ‪$pluginName);
309  if (is_array($setup['module.']['tx_' . $pluginSignature . '.'] ?? false)) {
310  $overruleConfiguration = $this->typoScriptService->convertTypoScriptArrayToPlainArray($setup['module.']['tx_' . $pluginSignature . '.']);
311  ArrayUtility::mergeRecursiveWithOverrule($pluginConfiguration, $overruleConfiguration);
312  }
313  }
314  return $pluginConfiguration;
315  }
316 
326  protected function ‪getCurrentPageId(): int
327  {
328  if ($this->currentPageId !== null) {
330  }
331  $this->currentPageId = $this->‪getCurrentPageIdFromRequest();
332  $this->currentPageId = $this->currentPageId ?: $this->‪getCurrentPageIdFromCurrentSiteRoot();
333  $this->currentPageId = $this->currentPageId ?: $this->‪getCurrentPageIdFromRootTemplate();
334  $this->currentPageId = $this->currentPageId ?: 0;
336  }
337 
343  protected function ‪getCurrentPageIdFromRequest(): int
344  {
345  return (int)($this->request?->getParsedBody()['id'] ?? $this->request?->getQueryParams()['id'] ?? 0);
346  }
347 
353  protected function ‪getCurrentPageIdFromCurrentSiteRoot(): int
354  {
355  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
356  $queryBuilder->getRestrictions()->removeAll()
357  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
358  ->add(GeneralUtility::makeInstance(HiddenRestriction::class));
359  $rootPage = $queryBuilder
360  ->select('uid')
361  ->from('pages')
362  ->where(
363  $queryBuilder->expr()->eq('is_siteroot', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT)),
364  $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
365  // Only consider live root page IDs, never return a versioned root page ID
366  $queryBuilder->expr()->eq('t3ver_oid', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
367  $queryBuilder->expr()->eq('t3ver_wsid', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT))
368  )
369  ->orderBy('sorting')
370  ->setMaxResults(1)
371  ->executeQuery()
372  ->fetchAssociative();
373  if (empty($rootPage)) {
374  return 0;
375  }
376  return (int)$rootPage['uid'];
377  }
378 
384  protected function ‪getCurrentPageIdFromRootTemplate(): int
385  {
386  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_template');
387  $queryBuilder->getRestrictions()->removeAll()
388  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
389  ->add(GeneralUtility::makeInstance(HiddenRestriction::class));
390  $rootTemplate = $queryBuilder
391  ->select('pid')
392  ->from('sys_template')
393  ->where(
394  $queryBuilder->expr()->eq('root', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
395  )
396  ->orderBy('crdate')
397  ->setMaxResults(1)
398  ->executeQuery()
399  ->fetchAssociative();
400  if (empty($rootTemplate)) {
401  return 0;
402  }
403  return (int)$rootTemplate['pid'];
404  }
405 
413  protected function ‪getRecursiveStoragePids(array $storagePids, int $recursionDepth = 0): array
414  {
415  if ($recursionDepth <= 0) {
416  return $storagePids;
417  }
419  $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW)
420  );
421  $recursiveStoragePids = [];
422  foreach ($storagePids as $startPid) {
423  $startPid = abs($startPid);
424  $recursiveStoragePids = array_merge(
425  $recursiveStoragePids,
426  [ $startPid ],
427  $this->‪getPageChildrenRecursive($startPid, $recursionDepth, 0, $permsClause)
428  );
429  }
430  return array_unique($recursiveStoragePids);
431  }
432 
439  protected function ‪getPageChildrenRecursive(int $pid, int $depth, int $begin, string $permsClause): array
440  {
441  $children = [];
442  if ($pid && $depth > 0) {
443  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
444  $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
445  $statement = $queryBuilder->select('uid')
446  ->from('pages')
447  ->where(
448  $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pid, ‪Connection::PARAM_INT)),
449  $queryBuilder->expr()->eq('sys_language_uid', 0),
450  $permsClause
451  )
452  ->orderBy('uid')
453  ->executeQuery();
454  while ($row = $statement->fetchAssociative()) {
455  if ($begin <= 0) {
456  $children[] = (int)$row['uid'];
457  }
458  if ($depth > 1) {
459  $theSubList = $this->‪getPageChildrenRecursive((int)$row['uid'], $depth - 1, $begin - 1, $permsClause);
460  $children = array_merge($children, $theSubList);
461  }
462  }
463  }
464  return $children;
465  }
466 
468  {
469  return ‪$GLOBALS['BE_USER'];
470  }
471 }
‪TYPO3\CMS\Extbase\Utility\FrontendSimulatorUtility
Definition: FrontendSimulatorUtility.php:30
‪TYPO3\CMS\Extbase\Utility\FrontendSimulatorUtility\simulateFrontendEnvironment
‪static simulateFrontendEnvironment(ContentObjectRenderer $cObj=null)
Definition: FrontendSimulatorUtility.php:40
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\$request
‪ServerRequestInterface $request
Definition: BackendConfigurationManager.php:98
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateRepository
Definition: SysTemplateRepository.php:39
‪TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction
Definition: HiddenRestriction.php:27
‪TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeSetupConditionConstantSubstitutionVisitor
Definition: IncludeTreeSetupConditionConstantSubstitutionVisitor.php:36
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getConfiguration
‪array getConfiguration(?string $extensionName=null, ?string $pluginName=null)
Definition: BackendConfigurationManager.php:139
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager
Definition: BackendConfigurationManager.php:73
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getCurrentPageId
‪int getCurrentPageId()
Definition: BackendConfigurationManager.php:326
‪TYPO3\CMS\Core\Cache\Frontend\PhpFrontend
Definition: PhpFrontend.php:25
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getPluginConfiguration
‪getPluginConfiguration(string $extensionName, string $pluginName=null)
Definition: BackendConfigurationManager.php:300
‪TYPO3\CMS\Core\Utility\RootlineUtility
Definition: RootlineUtility.php:40
‪TYPO3\CMS\Core\Site\Entity\NullSite
Definition: NullSite.php:32
‪TYPO3\CMS\Core\Exception\SiteNotFoundException
Definition: SiteNotFoundException.php:25
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getCurrentPageIdFromRootTemplate
‪int getCurrentPageIdFromRootTemplate()
Definition: BackendConfigurationManager.php:384
‪TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeAstBuilderVisitor
Definition: IncludeTreeAstBuilderVisitor.php:39
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\$currentPageId
‪int $currentPageId
Definition: BackendConfigurationManager.php:92
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getPageChildrenRecursive
‪int[] getPageChildrenRecursive(int $pid, int $depth, int $begin, string $permsClause)
Definition: BackendConfigurationManager.php:439
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\$configuration
‪array $configuration
Definition: BackendConfigurationManager.php:77
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\setRequest
‪setRequest(ServerRequestInterface $request)
Definition: BackendConfigurationManager.php:111
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getTypoScriptSetup
‪array getTypoScriptSetup()
Definition: BackendConfigurationManager.php:184
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getRecursiveStoragePids
‪int[] getRecursiveStoragePids(array $storagePids, int $recursionDepth=0)
Definition: BackendConfigurationManager.php:413
‪TYPO3\CMS\Core\Database\Query\QueryHelper
Definition: QueryHelper.php:32
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getCurrentPageIdFromCurrentSiteRoot
‪int getCurrentPageIdFromCurrentSiteRoot()
Definition: BackendConfigurationManager.php:353
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getBackendUser
‪getBackendUser()
Definition: BackendConfigurationManager.php:467
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\__construct
‪__construct(private readonly TypoScriptService $typoScriptService, private readonly PhpFrontend $typoScriptCache, private readonly FrontendInterface $runtimeCache, private readonly SysTemplateRepository $sysTemplateRepository, private readonly SysTemplateTreeBuilder $treeBuilder, private readonly LossyTokenizer $lossyTokenizer, private readonly ConditionVerdictAwareIncludeTreeTraverser $includeTreeTraverserConditionVerdictAware, private readonly SiteFinder $siteFinder,)
Definition: BackendConfigurationManager.php:100
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:61
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\$pluginName
‪string $pluginName
Definition: BackendConfigurationManager.php:87
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\$extensionName
‪string $extensionName
Definition: BackendConfigurationManager.php:82
‪TYPO3\CMS\Extbase\Utility\FrontendSimulatorUtility\resetFrontendEnvironment
‪static resetFrontendEnvironment()
Definition: FrontendSimulatorUtility.php:52
‪TYPO3\CMS\Core\TypoScript\TypoScriptService
Definition: TypoScriptService.php:27
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
Definition: FrontendInterface.php:22
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getExtbaseConfiguration
‪getExtbaseConfiguration()
Definition: BackendConfigurationManager.php:284
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\getCurrentPageIdFromRequest
‪int getCurrentPageIdFromRequest()
Definition: BackendConfigurationManager.php:343
‪TYPO3\CMS\Core\Database\Query\QueryHelper\stripLogicalOperatorPrefix
‪static string stripLogicalOperatorPrefix(string $constraint)
Definition: QueryHelper.php:171
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:26
‪TYPO3\CMS\Core\SingletonInterface
Definition: SingletonInterface.php:22
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager\setConfiguration
‪setConfiguration(array $configuration=[])
Definition: BackendConfigurationManager.php:122
‪TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
Definition: ContentObjectRenderer.php:102
‪TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser\ConditionVerdictAwareIncludeTreeTraverser
Definition: ConditionVerdictAwareIncludeTreeTraverser.php:38
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Extbase\Configuration
Definition: BackendConfigurationManager.php:18
‪TYPO3\CMS\Core\Utility\GeneralUtility\intExplode
‪static list< int > intExplode(string $delimiter, string $string, bool $removeEmptyValues=false)
Definition: GeneralUtility.php:751
‪TYPO3\CMS\Core\TypoScript\Tokenizer\LossyTokenizer
Definition: LossyTokenizer.php:57
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder
Definition: SysTemplateTreeBuilder.php:72
‪TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeConditionMatcherVisitor
Definition: IncludeTreeConditionMatcherVisitor.php:44