‪TYPO3CMS  ‪main
ConfigurationController.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;
29 
35 #[AsController]
37 {
38  public function ‪__construct(
39  private readonly ‪ProviderRegistry $configurationProviderRegistry,
40  private readonly ‪UriBuilder $uriBuilder,
41  private readonly ‪ModuleTemplateFactory $moduleTemplateFactory
42  ) {}
43 
44  public function ‪indexAction(ServerRequestInterface $request): ResponseInterface
45  {
46  $languageService = $this->‪getLanguageService();
47 
48  $moduleData = $request->getAttribute('moduleData');
49  $providers = $this->configurationProviderRegistry->getProviders();
50  // Validate requested "tree"
51  $moduleData->clean('tree', array_keys($providers));
52  $selectedProviderIdentifier = $moduleData->get('tree');
53  $selectedProvider = $this->configurationProviderRegistry->getProvider($selectedProviderIdentifier);
54  $selectedProviderLabel = $selectedProvider->getLabel();
55  $selectedProviderLabelHash = hash('xxh3', $selectedProviderLabel);
56  $configurationArray = $selectedProvider->getConfiguration();
57 
58  $view = $this->moduleTemplateFactory->create($request);
59  $view->setTitle($languageService->sL('LLL:EXT:lowlevel/Resources/Private/Language/locallang:module.configuration.title'), $selectedProviderLabel);
60  $this->‪addProviderDropDownToDocHeader($view, $providers, $selectedProvider);
61  $this->‪addShortcutButtonToDocHeader($view, $selectedProvider, $selectedProviderIdentifier);
62  $view->assignMultiple([
63  'tree' => $this->‪renderTree($configurationArray, $selectedProviderLabelHash),
64  'treeName' => $selectedProviderLabel,
65  'treeLabelHash' => $selectedProviderLabelHash,
66  ]);
67 
68  return $view->renderResponse('Configuration');
69  }
70 
76  private function ‪renderTree(array|\ArrayObject $tree, string $labelHash, string $incomingIdentifier = ''): string
77  {
78  $html = '';
79  if (!empty($incomingIdentifier)) {
80  $html .= '<div' .
81  ' class="treelist-collapse collapse"' .
82  ' data-persist-collapse-state="true"' .
83  ' data-persist-collapse-state-suffix="lowlevel-configuration-' . $labelHash . '"' .
84  ' data-persist-collapse-state-if-state="shown"' .
85  ' data-persist-collapse-state-not-if-search="true"' .
86  ' id="collapse-list-' . $incomingIdentifier . '">';
87  }
88 
89  $html .= '<ul class="treelist">';
90 
91  foreach ($tree as $key => $value) {
92  if ($value instanceof \BackedEnum) {
93  $value = $value->value;
94  } elseif ($value instanceof \UnitEnum) {
95  $value = $value->name;
96  } elseif (is_object($value) && !$value instanceof \Traversable) {
97  $value = (array)$value;
98  }
99  $isValueIterable = is_iterable($value);
100 
101  $html .= '<li>';
102  $newIdentifier = '';
103  if ($isValueIterable && !empty($value)) {
104  $newIdentifier = hash('xxh3', $incomingIdentifier . $key);
105  $html .= '
106  <typo3-backend-tree-node-toggle
107  class="treelist-control collapsed"
108  data-bs-toggle="collapse"
109  data-bs-target="#collapse-list-' . $newIdentifier . '"
110  aria-expanded="false">
111  </typo3-backend-tree-node-toggle>';
112  }
113  $html .= '<span class="treelist-group treelist-group-monospace">';
114  $html .= '<span class="treelist-label">' . htmlspecialchars((string)$key) . '</span>';
115  if (!$isValueIterable) {
116  $html .= ' <span class="treelist-operator">=</span> <span class="treelist-value">' . htmlspecialchars((string)$value) . '</span>';
117  }
118  if ($isValueIterable && empty($value)) {
119  $html .= ' <span class="treelist-operator">=</span>';
120  }
121  $html .= '</span>';
122  if ($isValueIterable && !empty($value)) {
123  $html .= $this->‪renderTree($value, $labelHash, $newIdentifier);
124  }
125  $html .= '</li>';
126  }
127 
128  $html .= '</ul>';
129 
130  if (!empty($incomingIdentifier)) {
131  $html .= '</div>';
132  }
133 
134  return $html;
135  }
136 
140  private function ‪addProviderDropDownToDocHeader(‪ModuleTemplate $view, array $providers, ‪ProviderInterface $selectedProvider): void
141  {
142  $menu = $view->‪getDocHeaderComponent()->getMenuRegistry()->makeMenu();
143  $menu->setIdentifier('tree');
144  $menu->setLabel(
145  $this->‪getLanguageService()->sL(
146  'LLL:EXT:lowlevel/Resources/Private/Language/locallang.xlf:moduleMenu.dropdown.label'
147  )
148  );
149  foreach ($providers as $provider) {
150  $menuItem = $menu->makeMenuItem()
151  ->setHref((string)$this->uriBuilder->buildUriFromRoute('system_config', ['tree' => $provider->getIdentifier()]))
152  ->setTitle($provider->getLabel());
153  if ($provider === $selectedProvider) {
154  $menuItem->setActive(true);
155  }
156  $menu->addMenuItem($menuItem);
157  }
158  $view->‪getDocHeaderComponent()->getMenuRegistry()->addMenu($menu);
159  }
160 
161  private function ‪addShortcutButtonToDocHeader(‪ModuleTemplate $view, ‪ProviderInterface $provider, string $providerIdentifier): void
162  {
163  $shortcutButton = $view->‪getDocHeaderComponent()->getButtonBar()->makeShortcutButton();
164  $shortcutButton
165  ->setRouteIdentifier('system_config')
166  ->setDisplayName($provider->‪getLabel())
167  ->setArguments(['tree' => $providerIdentifier]);
168  $view->‪getDocHeaderComponent()->getButtonBar()->addButton($shortcutButton);
169  }
170 
172  {
173  return ‪$GLOBALS['LANG'];
174  }
175 }
‪TYPO3\CMS\Lowlevel\Controller\ConfigurationController\indexAction
‪indexAction(ServerRequestInterface $request)
Definition: ConfigurationController.php:44
‪TYPO3\CMS\Lowlevel\Controller\ConfigurationController\getLanguageService
‪getLanguageService()
Definition: ConfigurationController.php:171
‪TYPO3\CMS\Backend\Template\ModuleTemplateFactory
Definition: ModuleTemplateFactory.php:33
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:46
‪TYPO3\CMS\Lowlevel\ConfigurationModuleProvider\ProviderInterface\getLabel
‪getLabel()
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:44
‪TYPO3\CMS\Lowlevel\ConfigurationModuleProvider\ProviderRegistry
Definition: ProviderRegistry.php:24
‪TYPO3\CMS\Lowlevel\Controller\ConfigurationController\renderTree
‪renderTree(array|\ArrayObject $tree, string $labelHash, string $incomingIdentifier='')
Definition: ConfigurationController.php:76
‪TYPO3\CMS\Lowlevel\Controller
Definition: ConfigurationController.php:18
‪TYPO3\CMS\Lowlevel\ConfigurationModuleProvider\ProviderInterface
Definition: ProviderInterface.php:24
‪TYPO3\CMS\Lowlevel\Controller\ConfigurationController\addProviderDropDownToDocHeader
‪addProviderDropDownToDocHeader(ModuleTemplate $view, array $providers, ProviderInterface $selectedProvider)
Definition: ConfigurationController.php:140
‪TYPO3\CMS\Lowlevel\Controller\ConfigurationController\addShortcutButtonToDocHeader
‪addShortcutButtonToDocHeader(ModuleTemplate $view, ProviderInterface $provider, string $providerIdentifier)
Definition: ConfigurationController.php:161
‪TYPO3\CMS\Backend\Template\ModuleTemplate\getDocHeaderComponent
‪getDocHeaderComponent()
Definition: ModuleTemplate.php:181
‪$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\Lowlevel\Controller\ConfigurationController\__construct
‪__construct(private readonly ProviderRegistry $configurationProviderRegistry, private readonly UriBuilder $uriBuilder, private readonly ModuleTemplateFactory $moduleTemplateFactory)
Definition: ConfigurationController.php:38
‪TYPO3\CMS\Lowlevel\Controller\ConfigurationController
Definition: ConfigurationController.php:37