‪TYPO3CMS  ‪main
SettingsController.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;
22 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
35 use TYPO3\CMS\Core\Package\PackageManager;
47 
53 {
54  public function ‪__construct(
55  private readonly PackageManager $packageManager,
56  private readonly ‪LanguageServiceFactory $languageServiceFactory,
57  private readonly ‪CommentAwareAstBuilder $astBuilder,
58  private readonly ‪LosslessTokenizer $losslessTokenizer,
59  private readonly ‪AstTraverser $astTraverser,
60  private readonly ‪FormProtectionFactory $formProtectionFactory,
61  private readonly ConfigurationManager $configurationManager,
62  ) {}
63 
67  public function ‪cardsAction(ServerRequestInterface $request): ResponseInterface
68  {
69  $view = $this->‪initializeView($request);
70  $view->assign('isWritable', $this->configurationManager->canWriteConfiguration());
71  return new ‪JsonResponse([
72  'success' => true,
73  'html' => $view->render('Settings/Cards'),
74  ]);
75  }
76 
80  public function ‪changeInstallToolPasswordGetDataAction(ServerRequestInterface $request): ResponseInterface
81  {
82  $view = $this->‪initializeView($request);
83  $formProtection = $this->formProtectionFactory->createFromRequest($request);
84  $isWritable = $this->configurationManager->canWriteConfiguration();
85  $view->assignMultiple([
86  'isWritable' => $isWritable,
87  'changeInstallToolPasswordToken' => $formProtection->generateToken('installTool', 'changeInstallToolPassword'),
88  ]);
89  $buttons = [];
90  if ($isWritable) {
91  $buttons[] = [
92  'btnClass' => 'btn-default t3js-changeInstallToolPassword-change',
93  'text' => 'Set new password',
94  ];
95  }
96  return new ‪JsonResponse([
97  'success' => true,
98  'html' => $view->render('Settings/ChangeInstallToolPassword'),
99  'buttons' => $buttons,
100  ]);
101  }
102 
106  public function ‪changeInstallToolPasswordAction(ServerRequestInterface $request): ResponseInterface
107  {
108  $messageQueue = new ‪FlashMessageQueue('install');
109  if (!$this->configurationManager->canWriteConfiguration()) {
110  $messageQueue->enqueue(new ‪FlashMessage(
111  'The configuration file is not writable.',
112  'Configuration not writable',
113  ContextualFeedbackSeverity::ERROR
114  ));
115  } else {
116  $password = $request->getParsedBody()['install']['password'] ?? '';
117  $passwordCheck = $request->getParsedBody()['install']['passwordCheck'];
118 
119  if ($password !== $passwordCheck) {
120  $messageQueue->enqueue(new ‪FlashMessage(
121  'Given passwords do not match.',
122  'Install tool password not changed',
123  ContextualFeedbackSeverity::ERROR
124  ));
125  } elseif (strlen($password) < 8) {
126  $messageQueue->enqueue(new ‪FlashMessage(
127  'Given password must be at least eight characters long.',
128  'Install tool password not changed',
129  ContextualFeedbackSeverity::ERROR
130  ));
131  } else {
132  $hashInstance = GeneralUtility::makeInstance(PasswordHashFactory::class)->getDefaultHashInstance('BE');
133  $this->configurationManager->setLocalConfigurationValueByPath(
134  'BE/installToolPassword',
135  $hashInstance->getHashedPassword($password)
136  );
137  $messageQueue->enqueue(new ‪FlashMessage(
138  'The Install tool password has been changed successfully.',
139  'Install tool password changed'
140  ));
141  }
142  }
143  return new ‪JsonResponse([
144  'success' => true,
145  'status' => $messageQueue,
146  ]);
147  }
148 
152  public function ‪systemMaintainerGetListAction(ServerRequestInterface $request): ResponseInterface
153  {
154  $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
155 
156  // We have to respect the enable fields here by our own because no TCA is loaded
157  $queryBuilder = $connectionPool->getQueryBuilderForTable('be_users');
158  $queryBuilder->getRestrictions()->removeAll();
159  $users = $queryBuilder
160  ->select('uid', 'username', 'disable', 'starttime', 'endtime')
161  ->from('be_users')
162  ->where(
163  $queryBuilder->expr()->and(
164  $queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
165  $queryBuilder->expr()->eq('admin', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT)),
166  $queryBuilder->expr()->neq('username', $queryBuilder->createNamedParameter('_cli_'))
167  )
168  )
169  ->orderBy('uid')
170  ->executeQuery()
171  ->fetchAllAssociative();
172 
173  $systemMaintainerList = ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['systemMaintainers'] ?? [];
174  $systemMaintainerList = array_map('intval', $systemMaintainerList);
175  $currentTime = time();
176  foreach ($users as &$user) {
177  $user['disable'] = $user['disable'] ||
178  ((int)$user['starttime'] !== 0 && $user['starttime'] > $currentTime) ||
179  ((int)$user['endtime'] !== 0 && $user['endtime'] < $currentTime);
180  $user['isSystemMaintainer'] = in_array((int)$user['uid'], $systemMaintainerList, true);
181  }
182  $view = $this->‪initializeView($request);
183  $formProtection = $this->formProtectionFactory->createFromRequest($request);
184  $isWritable = $this->configurationManager->canWriteConfiguration();
185  $view->assignMultiple([
186  'isWritable' => $isWritable,
187  'users' => $users,
188  'systemMaintainerWriteToken' => $formProtection->generateToken('installTool', 'systemMaintainerWrite'),
189  'systemMaintainerIsDevelopmentContext' => ‪Environment::getContext()->isDevelopment(),
190  ]);
191  $buttons = [];
192  if ($isWritable) {
193  $buttons[] = [
194  'btnClass' => 'btn-default t3js-systemMaintainer-write',
195  'text' => 'Save system maintainer list',
196  ];
197  }
198 
199  return new ‪JsonResponse([
200  'success' => true,
201  'users' => $users,
202  'html' => $view->render('Settings/SystemMaintainer'),
203  'buttons' => $buttons,
204  ]);
205  }
206 
210  public function ‪systemMaintainerWriteAction(ServerRequestInterface $request): ResponseInterface
211  {
212  $messages = [];
213 
214  if (!$this->configurationManager->canWriteConfiguration()) {
215  $messages[] = new ‪FlashMessage(
216  'The configuration file is not writable.',
217  'Configuration not writable',
218  ContextualFeedbackSeverity::ERROR
219  );
220  }
221  // Sanitize given user list and write out
222  $newUserList = [];
223  $users = $request->getParsedBody()['install']['users'] ?? [];
224  if (is_array($users)) {
225  foreach ($users as ‪$uid) {
227  $newUserList[] = (int)‪$uid;
228  }
229  }
230  }
231 
232  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users');
233  $queryBuilder->getRestrictions()->removeAll();
234 
235  $validatedUserList = $queryBuilder
236  ->select('uid')
237  ->from('be_users')
238  ->where(
239  $queryBuilder->expr()->and(
240  $queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
241  $queryBuilder->expr()->eq('admin', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT)),
242  $queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter($newUserList, ‪Connection::PARAM_INT_ARRAY))
243  )
244  )->executeQuery()->fetchAllAssociative();
245 
246  $validatedUserList = array_column($validatedUserList, 'uid');
247  $validatedUserList = array_map('intval', $validatedUserList);
248 
249  $this->configurationManager->setLocalConfigurationValuesByPathValuePairs(
250  ['SYS/systemMaintainers' => $validatedUserList]
251  );
252 
253  if (empty($validatedUserList)) {
254  $messages[] = new ‪FlashMessage(
255  'The system has no maintainers enabled anymore. Please use the standalone Admin Tools from now on.',
256  'Cleared system maintainer list',
257  ContextualFeedbackSeverity::INFO
258  );
259  } else {
260  $messages[] = new ‪FlashMessage(
261  'New system maintainer uid list: ' . implode(', ', $validatedUserList),
262  'Updated system maintainers',
263  ContextualFeedbackSeverity::INFO
264  );
265  }
266  return new ‪JsonResponse([
267  'success' => true,
268  'status' => $messages,
269  ]);
270  }
271 
275  public function ‪localConfigurationGetContentAction(ServerRequestInterface $request): ResponseInterface
276  {
277  $localConfigurationValueService = new ‪LocalConfigurationValueService();
278  $formProtection = $this->formProtectionFactory->createFromRequest($request);
279  $isWritable = $this->configurationManager->canWriteConfiguration();
280  $view = $this->‪initializeView($request);
281  $view->assignMultiple([
282  'isWritable' => $isWritable,
283  'localConfigurationWriteToken' => $formProtection->generateToken('installTool', 'localConfigurationWrite'),
284  'localConfigurationData' => $localConfigurationValueService->getCurrentConfigurationData(),
285  ]);
286 
287  $buttons = [
288  [
289  'btnClass' => 'btn-default t3js-localConfiguration-toggleAll',
290  'text' => 'Toggle All',
291  ],
292  ];
293 
294  if ($isWritable) {
295  $buttons[] = [
296  'btnClass' => 'btn-default t3js-localConfiguration-write',
297  'text' => 'Write configuration',
298  ];
299  }
300 
301  return new ‪JsonResponse([
302  'success' => true,
303  'html' => $view->render('Settings/LocalConfigurationGetContent'),
304  'buttons' => $buttons,
305  ]);
306  }
307 
313  public function ‪localConfigurationWriteAction(ServerRequestInterface $request): ResponseInterface
314  {
315  if (!$this->configurationManager->canWriteConfiguration()) {
316  $messageQueue = new ‪FlashMessageQueue('install');
317  $messageQueue->enqueue(new ‪FlashMessage(
318  'The configuration file is not writable.',
319  'Configuration not writable',
320  ContextualFeedbackSeverity::ERROR
321  ));
322  } else {
323  $settings = $request->getParsedBody()['install']['configurationValues'];
324  if (!is_array($settings) || empty($settings)) {
325  throw new \RuntimeException(
326  'Expected value array not found',
327  1502282283
328  );
329  }
330  $localConfigurationValueService = new ‪LocalConfigurationValueService();
331  $messageQueue = $localConfigurationValueService->updateLocalConfigurationValues($settings);
332  if ($messageQueue->count() === 0) {
333  $messageQueue->enqueue(new ‪FlashMessage(
334  'No configuration changes have been detected in the submitted form.',
335  'Configuration not updated',
336  ContextualFeedbackSeverity::WARNING
337  ));
338  }
339  }
340  return new ‪JsonResponse([
341  'success' => true,
342  'status' => $messageQueue,
343  ]);
344  }
345 
349  public function ‪presetsGetContentAction(ServerRequestInterface $request): ResponseInterface
350  {
351  $view = $this->‪initializeView($request);
352  $isWritable = $this->configurationManager->canWriteConfiguration();
353  $presetFeatures = GeneralUtility::makeInstance(FeatureManager::class);
354  $presetFeatures = $presetFeatures->getInitializedFeatures($request->getParsedBody()['install']['values'] ?? []);
355  $formProtection = $this->formProtectionFactory->createFromRequest($request);
356  $view->assignMultiple([
357  'isWritable' => $isWritable,
358  'presetsActivateToken' => $formProtection->generateToken('installTool', 'presetsActivate'),
359  // This action is called again from within the card itself if a custom image path is supplied
360  'presetsGetContentToken' => $formProtection->generateToken('installTool', 'presetsGetContent'),
361  'presetFeatures' => $presetFeatures,
362  ]);
363  $buttons = [];
364  if ($isWritable) {
365  $buttons[] = [
366  'btnClass' => 'btn-default t3js-presets-activate',
367  'text' => 'Activate preset',
368  ];
369  }
370  return new ‪JsonResponse([
371  'success' => true,
372  'html' => $view->render('Settings/PresetsGetContent'),
373  'buttons' => $buttons,
374  ]);
375  }
376 
380  public function ‪presetsActivateAction(ServerRequestInterface $request): ResponseInterface
381  {
382  $messages = new ‪FlashMessageQueue('install');
383  if (!$this->configurationManager->canWriteConfiguration()) {
384  $messages->enqueue(new ‪FlashMessage(
385  'The configuration file is not writable.',
386  'Configuration not writable',
387  ContextualFeedbackSeverity::ERROR
388  ));
389  } else {
390  $featureManager = new ‪FeatureManager();
391  $configurationValues = $featureManager->getConfigurationForSelectedFeaturePresets($request->getParsedBody()['install']['values'] ?? []);
392  if (!empty($configurationValues)) {
393  $this->configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationValues);
394  $messageBody = [];
395  foreach ($configurationValues as $configurationKey => $configurationValue) {
396  if (is_array($configurationValue)) {
397  $configurationValue = json_encode($configurationValue);
398  }
399  $messageBody[] = '\'' . $configurationKey . '\' => \'' . $configurationValue . '\'';
400  }
401  $messages->enqueue(new ‪FlashMessage(
402  implode(', ', $messageBody),
403  'Configuration written'
404  ));
405  } else {
406  $messages->enqueue(new ‪FlashMessage(
407  '',
408  'No configuration change selected',
409  ContextualFeedbackSeverity::INFO
410  ));
411  }
412  }
413  return new ‪JsonResponse([
414  'success' => true,
415  'status' => $messages,
416  ]);
417  }
418 
422  public function ‪extensionConfigurationGetContentAction(ServerRequestInterface $request): ResponseInterface
423  {
424  // Extension configuration needs initialized $GLOBALS['LANG']
425  ‪$GLOBALS['LANG'] = $this->languageServiceFactory->create('default');
426  $extensionsWithConfigurations = [];
427  $activePackages = $this->packageManager->getActivePackages();
428  $extensionConfiguration = new ‪ExtensionConfiguration();
429  foreach ($activePackages as $extensionKey => $activePackage) {
430  if (@file_exists($activePackage->getPackagePath() . 'ext_conf_template.txt')) {
431  $ast = $this->astBuilder->build(
432  $this->losslessTokenizer->tokenize(file_get_contents($activePackage->getPackagePath() . 'ext_conf_template.txt')),
433  new ‪RootNode()
434  );
435  $astConstantCommentVisitor = new (AstConstantCommentVisitor::class);
436  $this->astTraverser->traverse($ast, [$astConstantCommentVisitor]);
437  $constants = $astConstantCommentVisitor->getConstants();
438  // @todo: It would be better to fetch all LocalConfiguration settings of an extension at once
439  // and feed it as pseudo-TS to the AST builder. This way the full AstConstantCommentVisitor
440  // preparation magic would kick in and the JS-side processing in extension-configuration.ts
441  // could be removed (especially the 'wrap' and 'offset' stuff) by handling it in fluid directly.
442  foreach ($constants as $constantName => &$constantDetails) {
443  try {
444  $valueFromLocalConfiguration = $extensionConfiguration->get($extensionKey, str_replace('.', '/', $constantName));
445  $constantDetails['value'] = $valueFromLocalConfiguration;
447  // Deliberately empty - it can happen at runtime that a written config does not return
448  // back all values (eg. saltedpassword with its userFuncs), which then miss in the written
449  // configuration and are only synced after next install tool run. This edge case is
450  // taken care of here.
451  }
452  }
453  $displayConstants = [];
454  foreach ($constants as $constant) {
455  $displayConstants[$constant['cat']][$constant['subcat_sorting_first']]['label'] = $constant['subcat_label'];
456  $displayConstants[$constant['cat']][$constant['subcat_sorting_first']]['items'][$constant['subcat_sorting_second']] = $constant;
457  }
458  foreach ($displayConstants as &$constantCategory) {
459  ksort($constantCategory);
460  foreach ($constantCategory as &$constantDetailItems) {
461  ksort($constantDetailItems['items']);
462  }
463  }
464  $extensionsWithConfigurations[$extensionKey] = $displayConstants;
465  }
466  }
467  ksort($extensionsWithConfigurations);
468  $formProtection = $this->formProtectionFactory->createFromRequest($request);
469  $isWritable = $this->configurationManager->canWriteConfiguration();
470  $view = $this->‪initializeView($request);
471  $view->assignMultiple([
472  'isWritable' => $isWritable,
473  'extensionsWithConfigurations' => $extensionsWithConfigurations,
474  'extensionConfigurationWriteToken' => $formProtection->generateToken('installTool', 'extensionConfigurationWrite'),
475  ]);
476  return new ‪JsonResponse([
477  'success' => true,
478  'html' => $view->render('Settings/ExtensionConfigurationGetContent'),
479  ]);
480  }
481 
485  public function ‪extensionConfigurationWriteAction(ServerRequestInterface $request): ResponseInterface
486  {
487  $messages = [];
488  if (!$this->configurationManager->canWriteConfiguration()) {
489  $messages[] = new ‪FlashMessage(
490  'The configuration file is not writable.',
491  'Configuration not writable',
492  ContextualFeedbackSeverity::ERROR
493  );
494  } else {
495  $extensionKey = $request->getParsedBody()['install']['extensionKey'];
496  $configuration = $request->getParsedBody()['install']['extensionConfiguration'] ?? [];
497  $nestedConfiguration = [];
498  foreach ($configuration as $configKey => $value) {
499  $nestedConfiguration = ‪ArrayUtility::setValueByPath($nestedConfiguration, $configKey, $value, '.');
500  }
501  (new ‪ExtensionConfiguration())->set($extensionKey, $nestedConfiguration);
502  $messages[] = new ‪FlashMessage(
503  'Successfully saved configuration for extension "' . $extensionKey . '".',
504  'Configuration saved',
505  ContextualFeedbackSeverity::OK
506  );
507  }
508  return new ‪JsonResponse([
509  'success' => true,
510  'status' => $messages,
511  ]);
512  }
513 
517  public function ‪featuresGetContentAction(ServerRequestInterface $request): ResponseInterface
518  {
519  $isWritable = $this->configurationManager->canWriteConfiguration();
520  $configurationDescription = GeneralUtility::makeInstance(YamlFileLoader::class)
521  ->load($this->configurationManager->getDefaultConfigurationDescriptionFileLocation());
522  $allFeatures = ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['features'] ?? [];
523  $features = [];
524  foreach ($allFeatures as $featureName => $featureValue) {
525  // Only features that have a .yml description will be listed. There is currently no
526  // way for extensions to extend this, so feature toggles of non-core extensions are
527  // not listed here.
528  if (isset($configurationDescription['SYS']['items']['features']['items'][$featureName]['description'])) {
529  $default = $this->configurationManager->getDefaultConfigurationValueByPath('SYS/features/' . $featureName);
530  $features[] = [
531  'label' => ucfirst(str_replace(['_', '.'], ' ', strtolower(‪GeneralUtility::camelCaseToLowerCaseUnderscored(preg_replace('/\./', ': ', $featureName, 1))))),
532  'name' => $featureName,
533  'description' => $configurationDescription['SYS']['items']['features']['items'][$featureName]['description'],
534  'default' => $default,
535  'value' => $featureValue,
536  ];
537  }
538  }
539  $formProtection = $this->formProtectionFactory->createFromRequest($request);
540  $view = $this->‪initializeView($request);
541  $view->assignMultiple([
542  'isWritable' => $isWritable,
543  'features' => $features,
544  'featuresSaveToken' => $formProtection->generateToken('installTool', 'featuresSave'),
545  ]);
546  $buttons = [];
547  if ($isWritable) {
548  $buttons[] = [
549  'btnClass' => 'btn-default t3js-features-save',
550  'text' => 'Save',
551  ];
552  }
553  return new ‪JsonResponse([
554  'success' => true,
555  'html' => $view->render('Settings/FeaturesGetContent'),
556  'buttons' => $buttons,
557  ]);
558  }
559 
563  public function ‪featuresSaveAction(ServerRequestInterface $request): ResponseInterface
564  {
565  if (!$this->configurationManager->canWriteConfiguration()) {
566  $message = new ‪FlashMessage(
567  'The configuration file is not writable.',
568  'Configuration not writable',
569  ContextualFeedbackSeverity::ERROR
570  );
571  } else {
572  $enabledFeaturesFromPost = $request->getParsedBody()['install']['values'] ?? [];
573  $allFeatures = array_keys(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['features'] ?? []);
574  $configurationDescription = GeneralUtility::makeInstance(YamlFileLoader::class)
575  ->load($this->configurationManager->getDefaultConfigurationDescriptionFileLocation());
576  $updatedFeatures = [];
577  $configurationPathValuePairs = [];
578  foreach ($allFeatures as $featureName) {
579  // Only features that have a .yml description will be listed. There is currently no
580  // way for extensions to extend this, so feature toggles of non-core extensions are
581  // not considered.
582  if (isset($configurationDescription['SYS']['items']['features']['items'][$featureName]['description'])) {
583  $path = 'SYS/features/' . $featureName;
584  $newValue = isset($enabledFeaturesFromPost[$featureName]);
585  if ($newValue !== $this->configurationManager->getConfigurationValueByPath($path)) {
586  $configurationPathValuePairs[$path] = $newValue;
587  $updatedFeatures[] = $featureName . ' [' . ($newValue ? 'On' : 'Off') . ']';
588  }
589  }
590  }
591  if ($configurationPathValuePairs !== []) {
592  $success = $this->configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationPathValuePairs);
593  if ($success) {
594  $this->configurationManager->exportConfiguration();
595  $message = new ‪FlashMessage(
596  "Successfully updated the following feature toggles:\n" . implode(",\n", $updatedFeatures),
597  'Features updated',
598  ContextualFeedbackSeverity::OK
599  );
600  } else {
601  $message = new ‪FlashMessage(
602  'An error occurred while saving. Some settings may not have been updated.',
603  'Features not updated',
604  ContextualFeedbackSeverity::ERROR
605  );
606  }
607  } else {
608  $message = new ‪FlashMessage(
609  'Nothing to update.',
610  'Features not updated',
611  ContextualFeedbackSeverity::INFO
612  );
613  }
614  }
615  return new ‪JsonResponse([
616  'success' => true,
617  'status' => [$message],
618  ]);
619  }
620 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Install\Controller\SettingsController\localConfigurationWriteAction
‪localConfigurationWriteAction(ServerRequestInterface $request)
Definition: SettingsController.php:313
‪TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory
Definition: PasswordHashFactory.php:27
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Install\Configuration\FeatureManager
Definition: FeatureManager.php:30
‪TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationPathDoesNotExistException
Definition: ExtensionConfigurationPathDoesNotExistException.php:24
‪TYPO3\CMS\Core\TypoScript\Tokenizer\LosslessTokenizer
Definition: LosslessTokenizer.php:61
‪TYPO3\CMS\Core\Configuration\ExtensionConfiguration
Definition: ExtensionConfiguration.php:47
‪TYPO3\CMS\Install\Controller\SettingsController\systemMaintainerGetListAction
‪systemMaintainerGetListAction(ServerRequestInterface $request)
Definition: SettingsController.php:152
‪TYPO3\CMS\Core\Utility\GeneralUtility\camelCaseToLowerCaseUnderscored
‪static string camelCaseToLowerCaseUnderscored($string)
Definition: GeneralUtility.php:683
‪TYPO3\CMS\Install\Controller\SettingsController\presetsGetContentAction
‪presetsGetContentAction(ServerRequestInterface $request)
Definition: SettingsController.php:349
‪TYPO3\CMS\Core\Type\ContextualFeedbackSeverity
‪ContextualFeedbackSeverity
Definition: ContextualFeedbackSeverity.php:25
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger(mixed $var)
Definition: MathUtility.php:69
‪TYPO3\CMS\Install\Controller\SettingsController\__construct
‪__construct(private readonly PackageManager $packageManager, private readonly LanguageServiceFactory $languageServiceFactory, private readonly CommentAwareAstBuilder $astBuilder, private readonly LosslessTokenizer $losslessTokenizer, private readonly AstTraverser $astTraverser, private readonly FormProtectionFactory $formProtectionFactory, private readonly ConfigurationManager $configurationManager,)
Definition: SettingsController.php:54
‪TYPO3\CMS\Install\Controller\SettingsController\cardsAction
‪cardsAction(ServerRequestInterface $request)
Definition: SettingsController.php:67
‪TYPO3\CMS\Install\Controller
Definition: AbstractController.php:18
‪TYPO3\CMS\Install\Controller\SettingsController\presetsActivateAction
‪presetsActivateAction(ServerRequestInterface $request)
Definition: SettingsController.php:380
‪TYPO3\CMS\Install\Controller\SettingsController\systemMaintainerWriteAction
‪systemMaintainerWriteAction(ServerRequestInterface $request)
Definition: SettingsController.php:210
‪TYPO3\CMS\Install\Controller\SettingsController\localConfigurationGetContentAction
‪localConfigurationGetContentAction(ServerRequestInterface $request)
Definition: SettingsController.php:275
‪TYPO3\CMS\Install\Controller\SettingsController\changeInstallToolPasswordGetDataAction
‪changeInstallToolPasswordGetDataAction(ServerRequestInterface $request)
Definition: SettingsController.php:80
‪TYPO3\CMS\Install\Controller\SettingsController\extensionConfigurationGetContentAction
‪extensionConfigurationGetContentAction(ServerRequestInterface $request)
Definition: SettingsController.php:422
‪TYPO3\CMS\Install\Controller\SettingsController\featuresGetContentAction
‪featuresGetContentAction(ServerRequestInterface $request)
Definition: SettingsController.php:517
‪TYPO3\CMS\Install\Controller\AbstractController\initializeView
‪initializeView(ServerRequestInterface $request)
Definition: AbstractController.php:39
‪TYPO3\CMS\Install\Controller\SettingsController\extensionConfigurationWriteAction
‪extensionConfigurationWriteAction(ServerRequestInterface $request)
Definition: SettingsController.php:485
‪TYPO3\CMS\Install\Controller\SettingsController\featuresSaveAction
‪featuresSaveAction(ServerRequestInterface $request)
Definition: SettingsController.php:563
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Core\Configuration\Loader\YamlFileLoader
Definition: YamlFileLoader.php:47
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:27
‪TYPO3\CMS\Core\FormProtection\FormProtectionFactory
Definition: FormProtectionFactory.php:43
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:26
‪TYPO3\CMS\Core\Http\JsonResponse
Definition: JsonResponse.php:28
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\TypoScript\AST\Node\RootNode
Definition: RootNode.php:26
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Utility\ArrayUtility\setValueByPath
‪static array setValueByPath(array $array, string|array|\ArrayAccess $path, mixed $value, string $delimiter='/')
Definition: ArrayUtility.php:261
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪TYPO3\CMS\Install\Controller\AbstractController
Definition: AbstractController.php:35
‪TYPO3\CMS\Install\Controller\SettingsController
Definition: SettingsController.php:53
‪TYPO3\CMS\Install\Service\LocalConfigurationValueService
Definition: LocalConfigurationValueService.php:35
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\TypoScript\AST\CommentAwareAstBuilder
Definition: CommentAwareAstBuilder.php:55
‪TYPO3\CMS\Core\TypoScript\AST\Traverser\AstTraverser
Definition: AstTraverser.php:31
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue
Definition: FlashMessageQueue.php:29
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT_ARRAY
‪const PARAM_INT_ARRAY
Definition: Connection.php:72
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static getContext()
Definition: Environment.php:128
‪TYPO3\CMS\Install\Controller\SettingsController\changeInstallToolPasswordAction
‪changeInstallToolPasswordAction(ServerRequestInterface $request)
Definition: SettingsController.php:106
‪TYPO3\CMS\Core\TypoScript\AST\Visitor\AstConstantCommentVisitor
Definition: AstConstantCommentVisitor.php:35