‪TYPO3CMS  ‪main
SysTemplateTreeBuilder.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 
26 use TYPO3\CMS\Core\Package\PackageManager;
43 
72 {
79  private array ‪$includedSysTemplateUids = [];
80 
82  private string ‪$type;
83 
85  private ?‪PhpFrontend ‪$cache = null;
86 
87  public function ‪__construct(
88  private readonly ‪ConnectionPool $connectionPool,
89  private readonly PackageManager $packageManager,
90  private readonly ‪Context $context,
91  private readonly ‪TreeFromLineStreamBuilder $treeFromTokenStreamBuilder,
92  ) {
93  }
94 
99  string ‪$type,
100  array $sysTemplateRows,
102  ?‪SiteInterface $site = null,
104  ): ‪RootInclude {
105  if (!in_array(‪$type, ['constants', 'setup'], true)) {
106  throw new \RuntimeException('type must be either constants or setup', 1653737656);
107  }
108  $this->tokenizer = ‪$tokenizer;
109  $this->cache = ‪$cache;
110  $this->type = ‪$type;
111  $this->includedSysTemplateUids = [];
112 
113  $rootNode = new ‪RootInclude();
114  if (empty($sysTemplateRows)) {
115  return $rootNode;
116  }
117 
118  // Convenience code: Usually, at least one sys_template records needs to have 'clear' set. This resets
119  // the AST and triggers inclusion of "globals" TypoScript. When integrators missed to set the clear flags,
120  // important globals TypoScript is not loaded, leading to pretty hard to find issues in Frontend
121  // rendering. Since the details of the 'clear' flags are rather complex anyway, this code scans the given
122  // sys_template records if the flag is set somewhere and if not, actively sets it dynamically for the
123  // first templates. As a result, integrators do not need to think about the 'clear' flags at all for
124  // simple instances, it 'just works'.
125  $atLeastOneSysTemplateRowHasClearFlag = false;
126  foreach ($sysTemplateRows as $sysTemplateRow) {
127  if (($this->type === 'constants' && $sysTemplateRow['clear'] & 1) || ($this->type === 'setup' && $sysTemplateRow['clear'] & 2)) {
128  $atLeastOneSysTemplateRowHasClearFlag = true;
129  }
130  }
131  if (!$atLeastOneSysTemplateRowHasClearFlag) {
132  $firstRow = reset($sysTemplateRows);
133  $firstRow['clear'] = $this->type === 'constants' ? 1 : 2;
134  $sysTemplateRows[array_key_first($sysTemplateRows)] = $firstRow;
135  }
136 
137  foreach ($sysTemplateRows as $sysTemplateRow) {
138  $cacheIdentifier = 'sys-template-' . $this->type . '-' . $this->‪getSysTemplateRowIdentifier($sysTemplateRow, $site);
139  if ($this->cache) {
140  // Get from cache if possible
141  $includeNode = $this->cache->require($cacheIdentifier);
142  if ($includeNode) {
143  $rootNode->addChild($includeNode);
144  continue;
145  }
146  }
147  $includeNode = new ‪SysTemplateInclude();
148  $name = '[sys_template:' . $sysTemplateRow['uid'] . '] ' . $sysTemplateRow['title'];
149  $includeNode->setName($name);
150  $includeNode->setPid((int)$sysTemplateRow['pid']);
151  if ($this->type === 'constants') {
152  $includeNode->setLineStream($this->tokenizer->tokenize($sysTemplateRow['constants'] ?? ''));
153  } else {
154  $includeNode->setLineStream($this->tokenizer->tokenize($sysTemplateRow['config'] ?? ''));
155  }
156  if ($sysTemplateRow['root']) {
157  $includeNode->setRoot(true);
158  }
159  $clear = $sysTemplateRow['clear'];
160  if (($this->type === 'constants' && $clear & 1) || ($this->type === 'setup' && $clear & 2)) {
161  $includeNode->setClear(true);
162  }
163  $this->‪handleSysTemplateRecordInclude($includeNode, $sysTemplateRow, $site);
164  $this->treeFromTokenStreamBuilder->buildTree($includeNode, $this->type, $this->tokenizer);
165  $this->cache?->set($cacheIdentifier, $this->‪prepareNodeForCache($includeNode));
166  $rootNode->addChild($includeNode);
167  }
168 
169  return $rootNode;
170  }
171 
175  private function ‪handleSysTemplateRecordInclude(‪IncludeInterface $parentNode, array $row, ?‪SiteInterface $site): void
176  {
177  $this->includedSysTemplateUids[] = (int)$row['uid'];
178 
179  $isRoot = (bool)$row['root'];
180  $clearConstants = (int)$row['clear'] & 1;
181  $clearSetup = (int)$row['clear'] & 2;
182  $staticFileMode = (int)($row['static_file_mode']);
183  $includeStaticAfterBasedOn = (bool)$row['includeStaticAfterBasedOn'];
184 
185  if ($this->type === 'constants' && $clearConstants) {
186  $this->‪addDefaultTypoScriptFromGlobals($parentNode);
187  $this->‪addDefaultTypoScriptConstantsFromSite($parentNode, $site);
188  }
189  if ($this->type === 'setup' && $clearSetup) {
190  $this->‪addDefaultTypoScriptFromGlobals($parentNode);
191  }
192  if ($staticFileMode === 3 && $isRoot) {
193  $this->‪addExtensionStatics($parentNode);
194  }
195  if (!$includeStaticAfterBasedOn) {
196  $this->‪handleIncludeStaticFileArray($parentNode, (string)$row['include_static_file']);
197  }
198  if (!empty($row['basedOn'])) {
199  $this->‪handleIncludeBasedOnTemplates($parentNode, (string)$row['basedOn'], $site);
200  }
201  if ($includeStaticAfterBasedOn) {
202  $this->‪handleIncludeStaticFileArray($parentNode, (string)$row['include_static_file']);
203  }
204  if ($staticFileMode === 1 || ($staticFileMode === 0 && $isRoot)) {
205  $this->‪addExtensionStatics($parentNode);
206  }
207  }
208 
222  private function ‪handleIncludeStaticFileArray(‪IncludeInterface $parentNode, string $includeStaticFileString): void
223  {
224  $includeStaticFileIncludeArray = GeneralUtility::trimExplode(',', $includeStaticFileString, true);
225  foreach ($includeStaticFileIncludeArray as $includeStaticFile) {
226  $cacheIdentifier = preg_replace('/[^[:alnum:]]/u', '-', mb_strtolower($includeStaticFile)) . '-' . ‪$this->type;
227  if ($this->cache) {
228  $node = $this->cache->require($cacheIdentifier);
229  if ($node) {
230  $parentNode->‪addChild($node);
231  continue;
232  }
233  }
235  $node->setName($includeStaticFile);
236  $this->‪handleSingleIncludeStaticFile($node, $includeStaticFile);
237  $this->cache?->set($cacheIdentifier, $this->‪prepareNodeForCache($node));
238  $parentNode->‪addChild($node);
239  }
240  }
241 
247  private function ‪handleIncludeBasedOnTemplates(‪IncludeInterface $parentNode, string $basedOnList, ?‪SiteInterface $site): void
248  {
249  $basedOnTemplateUids = GeneralUtility::intExplode(',', $basedOnList, true);
250  // Filter uids that have been handled already.
251  $basedOnTemplateUids = array_diff($basedOnTemplateUids, $this->includedSysTemplateUids);
252  if (empty($basedOnTemplateUids)) {
253  return;
254  }
255 
256  $basedOnTemplateRows = $this->‪getBasedOnSysTemplateRowsFromDatabase($basedOnTemplateUids);
257 
258  foreach ($basedOnTemplateUids as $basedOnTemplateUid) {
259  if (is_array($basedOnTemplateRows[$basedOnTemplateUid] ?? false)) {
260  $sysTemplateRow = $basedOnTemplateRows[$basedOnTemplateUid];
261  $this->includedSysTemplateUids[] = (int)$sysTemplateRow['uid'];
262  $includeNode = new ‪SysTemplateInclude();
263  $name = '[sys_template:' . $sysTemplateRow['uid'] . '] ' . $sysTemplateRow['title'];
264  $includeNode->setName($name);
265  $includeNode->setPid((int)$sysTemplateRow['pid']);
266  if ($this->type === 'constants') {
267  $includeNode->setLineStream($this->tokenizer->tokenize($sysTemplateRow['constants'] ?? ''));
268  } else {
269  $includeNode->setLineStream($this->tokenizer->tokenize($sysTemplateRow['config'] ?? ''));
270  }
271  $this->treeFromTokenStreamBuilder->buildTree($includeNode, $this->type, $this->tokenizer);
272  if ($sysTemplateRow['root']) {
273  $includeNode->setRoot(true);
274  }
275  $clear = $sysTemplateRow['clear'];
276  if (($this->type === 'constants' && $clear & 1)
277  || ($this->type === 'setup' && $clear & 2)
278  ) {
279  $includeNode->setClear(true);
280  }
281  $parentNode->‪addChild($includeNode);
282  $this->‪handleSysTemplateRecordInclude($includeNode, $sysTemplateRow, $site);
283  }
284  }
285  }
286 
295  private function ‪handleSingleIncludeStaticFile(‪IncludeInterface $parentNode, $includeStaticFileString): void
296  {
297  if (!‪PathUtility::isExtensionPath($includeStaticFileString)) {
298  // Must start with 'EXT:'
299  throw new \RuntimeException(
300  'Single include_static_file does not start with "EXT:": ' . $includeStaticFileString,
301  1651137904
302  );
303  }
304 
305  // Cut off 'EXT:'
306  $includeStaticFileWithoutExt = substr($includeStaticFileString, 4);
307  $includeStaticFileExtKeyAndPath = GeneralUtility::trimExplode('/', $includeStaticFileWithoutExt, true, 2);
308  if (empty($includeStaticFileExtKeyAndPath[0]) || empty($includeStaticFileExtKeyAndPath[1])) {
309  throw new \RuntimeException(
310  'Syntax of static includes is "EXT:extension_key/Path". Usually enforced as such by ExtensionManagementUtility::addStaticFile',
311  1651138603
312  );
313  }
314  $extensionKey = $includeStaticFileExtKeyAndPath[0];
315  if (!‪ExtensionManagementUtility::isLoaded($extensionKey)) {
316  return;
317  }
318  // example: '/.../my_extension/Configuration/TypoScript/MyStaticInclude/'
319  $pathSegmentWithAppendedSlash = rtrim($includeStaticFileExtKeyAndPath[1]) . '/';
320  $path = ‪ExtensionManagementUtility::extPath($extensionKey, $pathSegmentWithAppendedSlash);
321 
322  // '/.../my_extension/Configuration/TypoScript/MyStaticInclude/include_static_file.txt'
323  $includeStaticFileFileIncludePath = $path . 'include_static_file.txt';
324  if (file_exists($path . 'include_static_file.txt')) {
325  $includeStaticFileFileInclude = new ‪IncludeStaticFileFileInclude();
326  $name = 'EXT:' . $extensionKey . '/' . $pathSegmentWithAppendedSlash . 'include_static_file.txt';
327  $includeStaticFileFileInclude->setName($name);
328  $includeStaticFileFileInclude->setPath($includeStaticFileString);
329  $parentNode->‪addChild($includeStaticFileFileInclude);
330  $includeStaticFileFileIncludeContent = (string)file_get_contents($includeStaticFileFileIncludePath);
331  // @todo: There is no array_unique() for DB based include_static_file content?!
332  $includeStaticFileFileIncludeArray = array_unique(GeneralUtility::trimExplode(',', $includeStaticFileFileIncludeContent));
333  foreach ($includeStaticFileFileIncludeArray as $includeStaticFileFileIncludeString) {
334  $this->‪handleSingleIncludeStaticFile($includeStaticFileFileInclude, $includeStaticFileFileIncludeString);
335  }
336  }
337 
338  $extensions = ['.typoscript', '.ts', '.txt'];
339  foreach ($extensions as $extension) {
340  // '/.../my_extension/Configuration/TypoScript/MyStaticInclude/[constants|setup]' plus one of the allowed extensions like '.typoscript'
341  $fileName = $path . $this->type . $extension;
342  if (file_exists($fileName)) {
343  $fileContent = file_get_contents($fileName);
344  $fileNode = new ‪FileInclude();
345  $name = 'EXT:' . $extensionKey . '/' . $pathSegmentWithAppendedSlash . $this->type . $extension;
346  $fileNode->setName($name);
347  $fileNode->setPath($name);
348  $fileNode->setLineStream($this->tokenizer->tokenize($fileContent));
349  $this->treeFromTokenStreamBuilder->buildTree($fileNode, $this->type, $this->tokenizer);
350  $parentNode->‪addChild($fileNode);
351  }
352  }
353 
354  $extensionKeyWithoutUnderscores = str_replace('_', '', $extensionKey);
355  $this->‪addStaticMagicFromGlobals($parentNode, $extensionKeyWithoutUnderscores . '/' . $pathSegmentWithAppendedSlash);
356  }
357 
362  private function ‪addExtensionStatics(‪IncludeInterface $parentNode): void
363  {
364  foreach ($this->packageManager->getActivePackages() as $package) {
365  $extensionKey = $package->getPackageKey();
366  $extensionKeyWithoutUnderscores = str_replace('_', '', $extensionKey);
367  $file = $package->getPackagePath() . 'ext_typoscript_' . $this->type . '.typoscript';
368  if (file_exists($file)) {
369  ‪$identifier = preg_replace('/[^[:alnum:]]/u', '-', 'ext-' . $extensionKey . '-ext-typoscript-' . $this->type . '-typoscript');
370  if ($this->cache) {
371  $node = $this->cache->require(‪$identifier);
372  if ($node) {
373  $parentNode->‪addChild($node);
374  continue;
375  }
376  }
377  $fileContent = file_get_contents($file);
378  $this->‪addStaticMagicFromGlobals($parentNode, $extensionKeyWithoutUnderscores);
379  $node = new ‪ExtensionStaticInclude();
380  $node->setName('EXT:' . $extensionKey . '/ext_typoscript_' . $this->type . '.typoscript');
381  $node->setPath('EXT:' . $extensionKey . '/ext_typoscript_' . $this->type . '.typoscript');
382  $node->setLineStream($this->tokenizer->tokenize($fileContent));
383  $this->treeFromTokenStreamBuilder->buildTree($node, $this->type, $this->tokenizer);
384  $this->cache?->set(‪$identifier, $this->‪prepareNodeForCache($node));
385  $parentNode->‪addChild($node);
386  }
387  }
388  }
389 
394  private function ‪addDefaultTypoScriptFromGlobals(‪IncludeInterface $parentConstantNode): void
395  {
396  $defaultTypoScriptConstants = ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . ‪$this->type] ?? '';
397  if (!empty($defaultTypoScriptConstants)) {
398  $cacheIdentifier = 'globals-defaulttyposcript-' . $this->type . '-' . hash('xxh3', $defaultTypoScriptConstants);
399  if ($this->cache) {
400  $node = $this->cache->require($cacheIdentifier);
401  if ($node) {
402  $parentConstantNode->‪addChild($node);
403  return;
404  }
405  }
406  $node = new ‪DefaultTypoScriptInclude();
407  $node->setName('TYPO3_CONF_VARS[\'FE\'][\'defaultTypoScript_' . $this->type . '\']');
408  $node->setLineStream($this->tokenizer->tokenize($defaultTypoScriptConstants));
409  $this->treeFromTokenStreamBuilder->buildTree($node, $this->type, $this->tokenizer);
410  $this->cache?->set($cacheIdentifier, $this->prepareNodeForCache($node));
411  $parentConstantNode->addChild($node);
412  }
413  }
414 
418  private function addDefaultTypoScriptConstantsFromSite(IncludeInterface $parentConstantNode, ?SiteInterface $site): void
419  {
420  if (!$site instanceof Site) {
421  return;
422  }
423  $siteConstants = '';
424  $siteSettings = $site->getSettings();
425  if ($siteSettings->isEmpty()) {
426  return;
427  }
428  $cacheIdentifier = 'site-constants-' . hash('xxh3', json_encode($siteSettings, JSON_THROW_ON_ERROR));
429  if ($this->cache) {
430  $node = $this->cache->require($cacheIdentifier);
431  if ($node) {
432  $parentConstantNode->addChild($node);
433  return;
434  }
435  }
436  $siteSettings = $siteSettings->getAllFlat();
437  foreach ($siteSettings as $nodeIdentifier => $value) {
438  $siteConstants .= $nodeIdentifier . ' = ' . $value . LF;
439  }
440  $node = new SiteInclude();
441  $node->setName('‪Site constants settings of site "' . $site->getIdentifier() . '"');
442  $node->setLineStream($this->tokenizer->tokenize($siteConstants));
443  $this->cache?->set($cacheIdentifier, $this->prepareNodeForCache($node));
444  $parentConstantNode->addChild($node);
445  }
446 
451  private function addStaticMagicFromGlobals(IncludeInterface $parentNode, string $identifier): void
452  {
453  // defaultTypoScript_constants.' or defaultTypoScript_setup.'
454  $source = $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . $this->type . '.'][$identifier] ?? null;
455  if (!empty($source)) {
456  $node = new DefaultTypoScriptMagicKeyInclude();
457  $node->setName('TYPO3_CONF_VARS globals_defaultTypoScript_' . $this->type . '.' . $identifier);
458  $node->setLineStream($this->tokenizer->tokenize($source));
459  $this->treeFromTokenStreamBuilder->buildTree($node, $this->type, $this->tokenizer);
460  $parentNode->addChild($node);
461  }
462  // If this is a template of type "default content rendering", see if other extensions have added their TypoScript that should be included.
463  if (in_array($identifier, $GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'], true)) {
464  $source = $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . $this->type . '.']['defaultContentRendering'] ?? null;
465  if (!empty($source)) {
466  $node = new DefaultTypoScriptMagicKeyInclude();
467  $node->setName('TYPO3_CONF_VARS defaultContentRendering ' . $this->type . ' for ' . $identifier);
468  $node->setLineStream($this->tokenizer->tokenize($source));
469  $this->treeFromTokenStreamBuilder->buildTree($node, $this->type, $this->tokenizer);
470  $parentNode->addChild($node);
471  }
472  }
473  }
474 
481  private function getBasedOnSysTemplateRowsFromDatabase(array $basedOnTemplateUids): array
482  {
483  $queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_template');
484  $queryBuilder->setRestrictions($this->getSysTemplateQueryRestrictionContainer());
485  $basedOnTemplateRows = $queryBuilder
486  ->select('*')
487  ->from('sys_template')
488  ->where(
489  $queryBuilder->expr()->in(
490  'uid',
491  $queryBuilder->createNamedParameter($basedOnTemplateUids, Connection::PARAM_INT_ARRAY)
492  )
493  )
494  ->executeQuery()
495  ->fetchAllAssociative();
496  return array_combine(array_column($basedOnTemplateRows, 'uid'), $basedOnTemplateRows);
497  }
498 
513  private function getSysTemplateRowIdentifier(array $sysTemplateRow, ?SiteInterface $site): string
514  {
515  $siteIdentifier = 'dummy';
516  if ($this->type === 'constants' && ((int)$sysTemplateRow['clear'] & 1) && $site !== null) {
517  $siteIdentifier = $site->getIdentifier();
518  }
519  $cacheRelevantSysTemplateRowValues = [
520  'root' => (int)$sysTemplateRow['root'],
521  'clear' => (int)$sysTemplateRow['clear'],
522  'include_static_file' => (string)$sysTemplateRow['include_static_file'],
523  'constants' => (string)$sysTemplateRow['constants'],
524  'config' => (string)$sysTemplateRow['config'],
525  'basedOn' => (string)$sysTemplateRow['basedOn'],
526  'includeStaticAfterBasedOn' => (int)$sysTemplateRow['includeStaticAfterBasedOn'],
527  'static_file_mode' => (int)$sysTemplateRow['static_file_mode'],
528  'siteIdentifier' => $siteIdentifier,
529  ];
530  return hash('xxh3', json_encode($cacheRelevantSysTemplateRowValues, JSON_THROW_ON_ERROR));
531  }
532 
533  private function prepareNodeForCache(IncludeInterface $node): string
534  {
535  return 'return unserialize(\'' . addcslashes(serialize($node), '\'\\') . '\');';
536  }
537 
543  {
544  $restrictionContainer = GeneralUtility::makeInstance(DefaultRestrictionContainer::class);
545  if ($this->context->getPropertyFromAspect('visibility', 'includeHiddenContent', false)) {
546  $restrictionContainer->removeByType(HiddenRestriction::class);
547  }
548  return $restrictionContainer;
549  }
550 }
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeStaticFileFileInclude
Definition: IncludeStaticFileFileInclude.php:27
‪TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction
Definition: HiddenRestriction.php:27
‪TYPO3\CMS\Core\Site\Entity\SiteInterface
Definition: SiteInterface.php:26
‪TYPO3\CMS\Core\Utility\PathUtility\isExtensionPath
‪static isExtensionPath(string $path)
Definition: PathUtility.php:117
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:27
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\$cache
‪PhpFrontend $cache
Definition: SysTemplateTreeBuilder.php:85
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\$type
‪string $type
Definition: SysTemplateTreeBuilder.php:82
‪TYPO3\CMS\Core\TypoScript\IncludeTree
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\__construct
‪__construct(private readonly ConnectionPool $connectionPool, private readonly PackageManager $packageManager, private readonly Context $context, private readonly TreeFromLineStreamBuilder $treeFromTokenStreamBuilder,)
Definition: SysTemplateTreeBuilder.php:87
‪TYPO3\CMS\Core\Cache\Frontend\PhpFrontend
Definition: PhpFrontend.php:25
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ExtensionStaticInclude
Definition: ExtensionStaticInclude.php:27
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeInterface\addChild
‪addChild(IncludeInterface $node)
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\addExtensionStatics
‪addExtensionStatics(IncludeInterface $parentNode)
Definition: SysTemplateTreeBuilder.php:362
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\prepareNodeForCache
‪prepareNodeForCache(IncludeInterface $node)
Definition: SysTemplateTreeBuilder.php:533
‪TYPO3\CMS\Core\TypoScript\IncludeTree\TreeFromLineStreamBuilder
Definition: TreeFromLineStreamBuilder.php:58
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:55
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\handleSysTemplateRecordInclude
‪handleSysTemplateRecordInclude(IncludeInterface $parentNode, array $row, ?SiteInterface $site)
Definition: SysTemplateTreeBuilder.php:175
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\addDefaultTypoScriptFromGlobals
‪addDefaultTypoScriptFromGlobals(IncludeInterface $parentConstantNode)
Definition: SysTemplateTreeBuilder.php:394
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\isLoaded
‪static isLoaded(string $key)
Definition: ExtensionManagementUtility.php:93
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\handleIncludeBasedOnTemplates
‪handleIncludeBasedOnTemplates(IncludeInterface $parentNode, string $basedOnList, ?SiteInterface $site)
Definition: SysTemplateTreeBuilder.php:247
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:40
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\extPath
‪static extPath(string $key, string $script='')
Definition: ExtensionManagementUtility.php:120
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\SiteInclude
Definition: SiteInclude.php:26
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeInterface
Definition: IncludeInterface.php:39
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\handleIncludeStaticFileArray
‪handleIncludeStaticFileArray(IncludeInterface $parentNode, string $includeStaticFileString)
Definition: SysTemplateTreeBuilder.php:222
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\FileInclude
Definition: FileInclude.php:29
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\handleSingleIncludeStaticFile
‪handleSingleIncludeStaticFile(IncludeInterface $parentNode, $includeStaticFileString)
Definition: SysTemplateTreeBuilder.php:295
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\getTreeBySysTemplateRowsAndSite
‪getTreeBySysTemplateRowsAndSite(string $type, array $sysTemplateRows, TokenizerInterface $tokenizer, ?SiteInterface $site=null, PhpFrontend $cache=null)
Definition: SysTemplateTreeBuilder.php:98
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeStaticFileDatabaseInclude
Definition: IncludeStaticFileDatabaseInclude.php:28
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\getSysTemplateRowIdentifier
‪getSysTemplateRowIdentifier(array $sysTemplateRow, ?SiteInterface $site)
Definition: SysTemplateTreeBuilder.php:513
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\$tokenizer
‪TokenizerInterface $tokenizer
Definition: SysTemplateTreeBuilder.php:84
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\DefaultTypoScriptMagicKeyInclude
Definition: DefaultTypoScriptMagicKeyInclude.php:27
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\addDefaultTypoScriptConstantsFromSite
‪addDefaultTypoScriptConstantsFromSite(IncludeInterface $parentConstantNode, ?SiteInterface $site)
Definition: SysTemplateTreeBuilder.php:418
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:35
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\$includedSysTemplateUids
‪array $includedSysTemplateUids
Definition: SysTemplateTreeBuilder.php:79
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\getBasedOnSysTemplateRowsFromDatabase
‪getBasedOnSysTemplateRowsFromDatabase(array $basedOnTemplateUids)
Definition: SysTemplateTreeBuilder.php:481
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\DefaultTypoScriptInclude
Definition: DefaultTypoScriptInclude.php:27
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude
Definition: RootInclude.php:27
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:51
‪TYPO3\CMS\Core\TypoScript\Tokenizer\TokenizerInterface
Definition: TokenizerInterface.php:40
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\getSysTemplateQueryRestrictionContainer
‪getSysTemplateQueryRestrictionContainer()
Definition: SysTemplateTreeBuilder.php:542
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\SysTemplateInclude
Definition: SysTemplateInclude.php:26
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder
Definition: SysTemplateTreeBuilder.php:72
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder\addStaticMagicFromGlobals
‪addStaticMagicFromGlobals(IncludeInterface $parentNode, string $identifier)
Definition: SysTemplateTreeBuilder.php:451
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37
‪TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer
Definition: DefaultRestrictionContainer.php:24