‪TYPO3CMS  ‪main
CodeCompletionController.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\ResponseInterface;
21 use Psr\Http\Message\ServerRequestInterface;
34 
40 #[AsController]
42 {
43  public function ‪__construct(
44  private readonly ‪SysTemplateRepository $sysTemplateRepository,
45  private readonly ‪SysTemplateTreeBuilder $treeBuilder,
46  private readonly ‪LossyTokenizer $lossyTokenizer,
47  private readonly ‪IncludeTreeTraverser $treeTraverser,
48  ) {}
49 
54  public function ‪loadCompletions(ServerRequestInterface $request): ResponseInterface
55  {
56  // Check whether access is granted (only admin have access to sys_template records):
57  if (!‪$GLOBALS['BE_USER']->isAdmin()) {
58  return new ‪HtmlResponse($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_codeeditor.xlf:noPermission'), 500);
59  }
60  $pageId = (int)($request->getParsedBody()['pageId'] ?? $request->getQueryParams()['pageId']);
61  // Check whether there is a pageId given:
62  if (!$pageId) {
63  return new ‪HtmlResponse($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_codeeditor.xlf:pageIDInteger'), 500);
64  }
65  // Fetch the templates
66  return new ‪JsonResponse($this->‪getMergedTemplates($pageId, $request));
67  }
68 
76  protected function ‪getMergedTemplates(int $pageId, ServerRequestInterface $request): array
77  {
78  $rootLine = GeneralUtility::makeInstance(RootlineUtility::class, $pageId)->get();
79  $sysTemplateRows = $this->sysTemplateRepository->getSysTemplateRowsByRootline($rootLine, $request);
81  $site = $request->getAttribute('site');
82  $setupIncludeTree = $this->treeBuilder->getTreeBySysTemplateRowsAndSite('setup', $sysTemplateRows, $this->lossyTokenizer, $site);
83  $setupAstBuilderVisitor = GeneralUtility::makeInstance(IncludeTreeAstBuilderVisitor::class);
84  $this->treeTraverser->traverse($setupIncludeTree, [$setupAstBuilderVisitor]);
85  $setupAst = $setupAstBuilderVisitor->getAst();
86  return $this->‪treeWalkCleanup($setupAst->toArray());
87  }
88 
92  private function ‪treeWalkCleanup(array $treeBranch): array
93  {
94  $cleanedTreeBranch = [];
95  foreach ($treeBranch as $key => $value) {
96  $key = is_int($key) ? (string)$key : $key;
97  //type definition or value-assignment
98  if (substr($key, -1) !== '.') {
99  if ($value != '') {
100  if (mb_strlen($value) > 20) {
101  $value = mb_substr($value, 0, 20);
102  }
103  if (!isset($cleanedTreeBranch[$key])) {
104  $cleanedTreeBranch[$key] = [];
105  }
106  $cleanedTreeBranch[$key]['v'] = $value;
107  }
108  } else {
109  // subtree (definition of properties)
110  $subBranch = $this->‪treeWalkCleanup($value);
111  if ($subBranch) {
112  if (substr($key, -1) === '.') {
113  $key = rtrim($key, '.');
114  }
115  if (!isset($cleanedTreeBranch[$key])) {
116  $cleanedTreeBranch[$key] = [];
117  }
118  $cleanedTreeBranch[$key]['c'] = $subBranch;
119  }
120  }
121  }
122  return $cleanedTreeBranch;
123  }
124 
126  {
127  return ‪$GLOBALS['LANG'];
128  }
129 }
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateRepository
Definition: SysTemplateRepository.php:38
‪TYPO3\CMS\Core\Site\Entity\SiteInterface
Definition: SiteInterface.php:26
‪TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController\loadCompletions
‪loadCompletions(ServerRequestInterface $request)
Definition: CodeCompletionController.php:54
‪TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser\IncludeTreeTraverser
Definition: IncludeTreeTraverser.php:30
‪TYPO3\CMS\Core\Utility\RootlineUtility
Definition: RootlineUtility.php:40
‪TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeAstBuilderVisitor
Definition: IncludeTreeAstBuilderVisitor.php:39
‪TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController\__construct
‪__construct(private readonly SysTemplateRepository $sysTemplateRepository, private readonly SysTemplateTreeBuilder $treeBuilder, private readonly LossyTokenizer $lossyTokenizer, private readonly IncludeTreeTraverser $treeTraverser,)
Definition: CodeCompletionController.php:43
‪TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController
Definition: CodeCompletionController.php:42
‪TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController\treeWalkCleanup
‪treeWalkCleanup(array $treeBranch)
Definition: CodeCompletionController.php:92
‪TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController\getMergedTemplates
‪array getMergedTemplates(int $pageId, ServerRequestInterface $request)
Definition: CodeCompletionController.php:76
‪TYPO3\CMS\Backend\Controller\CodeEditor
Definition: CodeCompletionController.php:18
‪TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController\getLanguageService
‪getLanguageService()
Definition: CodeCompletionController.php:125
‪TYPO3\CMS\Core\Http\JsonResponse
Definition: JsonResponse.php:28
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Backend\Attribute\AsController
Definition: AsController.php:25
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\TypoScript\Tokenizer\LossyTokenizer
Definition: LossyTokenizer.php:57
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateTreeBuilder
Definition: SysTemplateTreeBuilder.php:74
‪TYPO3\CMS\Core\Http\HtmlResponse
Definition: HtmlResponse.php:28