Files
gutachten_t3/typo3/sysext/tstemplate/Classes/Controller/TypoScriptTemplateObjectBrowserModuleFunctionController.php
T
2026-10-19 08:18:39 +02:00

512 lines
26 KiB
PHP

<?php
namespace TYPO3\CMS\Tstemplate\Controller;
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Compatibility\PublicMethodDeprecationTrait;
use TYPO3\CMS\Core\Compatibility\PublicPropertyDeprecationTrait;
use TYPO3\CMS\Core\DataHandling\DataHandler;
use TYPO3\CMS\Core\Exception;
use TYPO3\CMS\Core\Localization\LanguageService;
use TYPO3\CMS\Core\Messaging\FlashMessage;
use TYPO3\CMS\Core\Messaging\FlashMessageService;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\TypoScript\ExtendedTemplateService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\RootlineUtility;
use TYPO3\CMS\Fluid\View\StandaloneView;
/**
* This class displays the submodule "TypoScript Object Browser" inside the Web > Template module
* @internal This is a specific Backend Controller implementation and is not considered part of the Public TYPO3 API.
*/
class TypoScriptTemplateObjectBrowserModuleFunctionController
{
use PublicPropertyDeprecationTrait;
use PublicMethodDeprecationTrait;
/**
* @var array
*/
private $deprecatedPublicProperties = [
'pObj' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::$pObj is deprecated and will not be possible anymore in TYPO3 v10.0.',
'function_key' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::$function_key is deprecated, property will be removed in TYPO3 v10.0.',
'extClassConf' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::$extClassConf is deprecated, property will be removed in TYPO3 v10.0.',
'localLangFile' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::$localLangFile is deprecated, property will be removed in TYPO3 v10.0.',
];
/**
* @var array
*/
private $deprecatedPublicMethods = [
'initialize_editor' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::initialize_editor() is deprecated and will not be possible anymore in TYPO3 v10.0.',
'modMenu' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::modMenu() is deprecated and will not be possible anymore in TYPO3 v10.0.',
'handleExternalFunctionValue' => 'Using TypoScriptTemplateObjectBrowserModuleFunctionController::handleExternalFunctionValue() is deprecated, method will be removed in TYPO3 v10.0.',
];
/**
* @var string
*/
protected $localLanguageFilePath;
/**
* @var TypoScriptTemplateModuleController
*/
protected $pObj;
/**
* The currently selected sys_template record
* @var array
*/
protected $templateRow;
/**
* @var ExtendedTemplateService
*/
protected $templateService;
/**
* @var int GET/POST var 'id'
*/
protected $id;
/**
* Can be hardcoded to the name of a locallang.xlf file (from the same directory as the class file) to use/load
* and is included / added to $GLOBALS['LOCAL_LANG']
*
* @see init()
* @var string
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0.
*/
protected $localLangFile = '';
/**
* Contains module configuration parts from TBE_MODULES_EXT if found
*
* @see handleExternalFunctionValue()
* @var array
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0.
*/
protected $extClassConf;
/**
* If this value is set it points to a key in the TBE_MODULES_EXT array (not on the top level..) where another classname/filepath/title can be defined for sub-subfunctions.
* This is a little hard to explain, so see it in action; it used in the extension 'func_wizards' in order to provide yet a layer of interfacing with the backend module.
* The extension 'func_wizards' has this description: 'Adds the 'Wizards' item to the function menu in Web>Func. This is just a framework for wizard extensions.' - so as you can see it is designed to allow further connectivity - 'level 2'
*
* @var string
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0.
*/
protected $function_key = '';
/**
* Init, called from parent object
*
* @param TypoScriptTemplateModuleController $pObj
*/
public function init($pObj)
{
$this->pObj = $pObj;
// Local lang:
if (!empty($this->localLangFile)) {
// @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0.
$this->getLanguageService()->includeLLFile($this->localLangFile);
}
// Setting MOD_MENU items as we need them for logging:
$this->pObj->MOD_MENU = array_merge($this->pObj->MOD_MENU, $this->modMenu());
$this->pObj->modMenu_dontValidateList .= ',ts_browser_toplevel_setup,ts_browser_toplevel_const,ts_browser_TLKeys_setup,ts_browser_TLKeys_const';
$this->pObj->modMenu_setDefaultList .= ',ts_browser_fixedLgd,ts_browser_showComments';
$this->localLanguageFilePath = 'EXT:tstemplate/Resources/Private/Language/locallang_objbrowser.xlf';
$this->id = (int)GeneralUtility::_GP('id');
}
/**
* Mod menu
*
* @return array
*/
protected function modMenu()
{
$lang = $this->getLanguageService();
$lang->includeLLFile('EXT:tstemplate/Resources/Private/Language/locallang_objbrowser.xlf');
$modMenu = [
'ts_browser_type' => [
'const' => $lang->getLL('constants'),
'setup' => $lang->getLL('setup')
],
'ts_browser_toplevel_setup' => [
'0' => mb_strtolower($lang->getLL('all'), 'utf-8')
],
'ts_browser_toplevel_const' => [
'0' => mb_strtolower($lang->getLL('all'), 'utf-8')
],
'ts_browser_const' => [
'0' => $lang->getLL('plainSubstitution'),
'subst' => $lang->getLL('substitutedGreen'),
'const' => $lang->getLL('unsubstitutedGreen')
],
'ts_browser_regexsearch' => '1',
'ts_browser_fixedLgd' => '1',
'ts_browser_showComments' => '1',
'ts_browser_alphaSort' => '1'
];
foreach (['setup', 'const'] as $bType) {
$addKey = GeneralUtility::_GET('addKey');
// If any plus-signs were clicked, it's registered.
if (is_array($addKey)) {
reset($addKey);
if (current($addKey)) {
$this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType][key($addKey)] = key($addKey);
} else {
unset($this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType][key($addKey)]);
}
$this->getBackendUserAuthentication()->pushModuleData('web_ts', $this->pObj->MOD_SETTINGS);
}
if (!empty($this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType])) {
$modMenu['ts_browser_toplevel_' . $bType]['-'] = '---';
$modMenu['ts_browser_toplevel_' . $bType] = $modMenu['ts_browser_toplevel_' . $bType] + $this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType];
}
}
return $modMenu;
}
/**
* Initialize editor
*
* Initializes the module. Done in this function because we may need to re-initialize if data is submitted!
*
* @param int $pageId
* @param int $template_uid
* @return bool
*/
protected function initialize_editor($pageId, $template_uid = 0)
{
// Defined global here!
$this->templateService = GeneralUtility::makeInstance(ExtendedTemplateService::class);
// Gets the rootLine
$rootlineUtility = GeneralUtility::makeInstance(RootlineUtility::class, $pageId);
$rootLine = $rootlineUtility->get();
// This generates the constants/config + hierarchy info for the template.
$this->templateService->runThroughTemplates($rootLine, $template_uid);
// Get the row of the first VISIBLE template of the page. whereclause like the frontend.
$this->templateRow = $this->templateService->ext_getFirstTemplate($pageId, $template_uid);
return is_array($this->templateRow);
}
/**
* Main, called from parent object
*
* @return string
*/
public function main()
{
$lang = $this->getLanguageService();
$POST = GeneralUtility::_POST();
// Checking for more than one template an if, set a menu...
$manyTemplatesMenu = $this->pObj->templateMenu();
$template_uid = 0;
if ($manyTemplatesMenu) {
$template_uid = $this->pObj->MOD_SETTINGS['templatesOnPage'];
}
$bType = $this->pObj->MOD_SETTINGS['ts_browser_type'];
$existTemplate = $this->initialize_editor($this->id, $template_uid);
// initialize
$assigns = [];
$assigns['LLPrefix'] = 'LLL:' . $this->localLanguageFilePath . ':';
$assigns['existTemplate'] = $existTemplate;
$assigns['tsBrowserType'] = $this->pObj->MOD_SETTINGS['ts_browser_type'];
if ($existTemplate) {
$assigns['templateRecord'] = $this->templateRow;
$assigns['linkWrapTemplateTitle'] = $this->pObj->linkWrapTemplateTitle($this->templateRow['title'], ($bType === 'setup' ? 'config' : 'constants'));
$assigns['manyTemplatesMenu'] = $manyTemplatesMenu;
if ($POST['add_property'] || $POST['update_value'] || $POST['clear_object']) {
// add property
$line = '';
if (is_array($POST['data'])) {
$name = key($POST['data']);
if ($POST['data'][$name]['name'] !== '') {
// Workaround for this special case: User adds a key and submits by pressing the return key. The form however will use "add_property" which is the name of the first submit button in this form.
unset($POST['update_value']);
$POST['add_property'] = 'Add';
}
if ($POST['add_property']) {
$property = trim($POST['data'][$name]['name']);
if (preg_replace('/[^a-zA-Z0-9_\\.]*/', '', $property) != $property) {
$badPropertyMessage = GeneralUtility::makeInstance(FlashMessage::class, $lang->getLL('noSpaces') . $lang->getLL('nothingUpdated'), $lang->getLL('badProperty'), FlashMessage::ERROR);
$this->addFlashMessage($badPropertyMessage);
} else {
$pline = $name . '.' . $property . ' = ' . trim($POST['data'][$name]['propertyValue']);
$propertyAddedMessage = GeneralUtility::makeInstance(FlashMessage::class, $pline, $lang->getLL('propertyAdded'));
$this->addFlashMessage($propertyAddedMessage);
$line .= LF . $pline;
}
} elseif ($POST['update_value']) {
$pline = $name . ' = ' . trim($POST['data'][$name]['value']);
$updatedMessage = GeneralUtility::makeInstance(FlashMessage::class, $pline, $lang->getLL('valueUpdated'));
$this->addFlashMessage($updatedMessage);
$line .= LF . $pline;
} elseif ($POST['clear_object']) {
if ($POST['data'][$name]['clearValue']) {
$pline = $name . ' >';
$objectClearedMessage = GeneralUtility::makeInstance(FlashMessage::class, $pline, $lang->getLL('objectCleared'));
$this->addFlashMessage($objectClearedMessage);
$line .= LF . $pline;
}
}
}
if ($line) {
$saveId = $this->templateRow['_ORIG_uid'] ?: $this->templateRow['uid'];
// Set the data to be saved
$recData = [];
$field = $bType === 'setup' ? 'config' : 'constants';
$recData['sys_template'][$saveId][$field] = $this->templateRow[$field] . $line;
// Create new tce-object
$tce = GeneralUtility::makeInstance(DataHandler::class);
// Initialize
$tce->start($recData, []);
// Saved the stuff
$tce->process_datamap();
// Clear the cache (note: currently only admin-users can clear the cache in tce_main.php)
$tce->clear_cacheCmd('all');
// re-read the template ...
$this->initialize_editor($this->id, $template_uid);
}
}
}
$tsbr = GeneralUtility::_GET('tsbr');
$update = 0;
if (is_array($tsbr)) {
// If any plus-signs were clicked, it's registred.
$this->pObj->MOD_SETTINGS['tsbrowser_depthKeys_' . $bType] = $this->templateService->ext_depthKeys($tsbr, $this->pObj->MOD_SETTINGS['tsbrowser_depthKeys_' . $bType]);
$update = 1;
}
if ($POST['Submit']) {
// If any POST-vars are send, update the condition array
$this->pObj->MOD_SETTINGS['tsbrowser_conditions'] = $POST['conditions'];
$update = 1;
}
if ($update) {
$this->getBackendUserAuthentication()->pushModuleData('web_ts', $this->pObj->MOD_SETTINGS);
}
$this->templateService->matchAlternative = $this->pObj->MOD_SETTINGS['tsbrowser_conditions'];
$this->templateService->matchAlternative[] = 'dummydummydummydummydummydummydummydummydummydummydummy';
// This is just here to make sure that at least one element is in the array so that the tsparser actually uses this array to match.
$this->templateService->constantMode = $this->pObj->MOD_SETTINGS['ts_browser_const'];
// "sObj" is set by ExtendedTemplateService to edit single keys
$sObj = GeneralUtility::_GP('sObj');
if (!empty($sObj) && $this->templateService->constantMode) {
$this->templateService->constantMode = 'untouched';
}
$this->templateService->regexMode = $this->pObj->MOD_SETTINGS['ts_browser_regexsearch'];
$this->templateService->fixedLgd = $this->pObj->MOD_SETTINGS['ts_browser_fixedLgd'];
$this->templateService->linkObjects = true;
$this->templateService->ext_regLinenumbers = true;
$this->templateService->ext_regComments = $this->pObj->MOD_SETTINGS['ts_browser_showComments'];
$this->templateService->bType = $bType;
if ($this->pObj->MOD_SETTINGS['ts_browser_type'] === 'const') {
$this->templateService->ext_constants_BRP = (int)GeneralUtility::_GP('breakPointLN');
} else {
$this->templateService->ext_config_BRP = (int)GeneralUtility::_GP('breakPointLN');
}
$this->templateService->generateConfig();
if ($bType === 'setup') {
$theSetup = $this->templateService->setup;
} else {
$theSetup = $this->templateService->setup_constants;
}
// EDIT A VALUE:
$assigns['typoScriptPath'] = $sObj;
if (!empty($sObj)) {
list($theSetup, $theSetupValue) = $this->templateService->ext_getSetup($theSetup, $sObj);
$assigns['theSetupValue'] = $theSetupValue;
if ($existTemplate === false) {
$noTemplateMessage = GeneralUtility::makeInstance(FlashMessage::class, $lang->getLL('noCurrentTemplate'), $lang->getLL('edit'), FlashMessage::ERROR);
$this->addFlashMessage($noTemplateMessage);
}
// Links:
$urlParameters = [
'id' => $this->id
];
/** @var \TYPO3\CMS\Backend\Routing\UriBuilder $uriBuilder */
$uriBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Routing\UriBuilder::class);
$aHref = (string)$uriBuilder->buildUriFromRoute('web_ts', $urlParameters);
$assigns['moduleUrl'] = (string)$uriBuilder->buildUriFromRoute('web_ts', $urlParameters);
$assigns['isNotInTopLevelKeyList'] = !isset($this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType][$sObj]);
$assigns['hasProperties'] = !empty($theSetup);
if (!$this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType][$sObj]) {
if (!empty($theSetup)) {
$assigns['moduleUrlObjectListAction'] = $aHref . '&addKey[' . rawurlencode($sObj) . ']=1&SET[ts_browser_toplevel_' . $bType . ']=' . rawurlencode($sObj);
}
} else {
$assigns['moduleUrlObjectListAction'] = $aHref . '&addKey[' . rawurlencode($sObj) . ']=0&SET[ts_browser_toplevel_' . $bType . ']=0';
}
} else {
$this->templateService->tsbrowser_depthKeys = $this->pObj->MOD_SETTINGS['tsbrowser_depthKeys_' . $bType];
if (GeneralUtility::_POST('search') && GeneralUtility::_POST('search_field')) {
// If any POST-vars are send, update the condition array
$searchString = GeneralUtility::_POST('search_field');
try {
$this->templateService->tsbrowser_depthKeys =
$this->templateService->ext_getSearchKeys(
$theSetup,
'',
$searchString,
[]
);
} catch (Exception $e) {
$this->addFlashMessage(
GeneralUtility::makeInstance(FlashMessage::class, sprintf($lang->getLL('error.' . $e->getCode()), $searchString), '', FlashMessage::ERROR)
);
}
}
$assigns['hasTsBrowserTypes'] = is_array($this->pObj->MOD_MENU['ts_browser_type']) && count($this->pObj->MOD_MENU['ts_browser_type']) > 1;
if (is_array($this->pObj->MOD_MENU['ts_browser_type']) && count($this->pObj->MOD_MENU['ts_browser_type']) > 1) {
$assigns['browserTypeDropdownMenu'] = BackendUtility::getDropdownMenu($this->id, 'SET[ts_browser_type]', $bType, $this->pObj->MOD_MENU['ts_browser_type']);
}
$assigns['hasTopLevelInObjectList'] = is_array($this->pObj->MOD_MENU['ts_browser_toplevel_' . $bType]) && count($this->pObj->MOD_MENU['ts_browser_toplevel_' . $bType]) > 1;
if (is_array($this->pObj->MOD_MENU['ts_browser_toplevel_' . $bType]) && count($this->pObj->MOD_MENU['ts_browser_toplevel_' . $bType]) > 1) {
$assigns['objectListDropdownMenu'] = BackendUtility::getDropdownMenu($this->id, 'SET[ts_browser_toplevel_' . $bType . ']', $this->pObj->MOD_SETTINGS['ts_browser_toplevel_' . $bType], $this->pObj->MOD_MENU['ts_browser_toplevel_' . $bType]);
}
$assigns['regexSearchCheckbox'] = BackendUtility::getFuncCheck($this->id, 'SET[ts_browser_regexsearch]', $this->pObj->MOD_SETTINGS['ts_browser_regexsearch'], '', '', 'id="checkTs_browser_regexsearch"');
$assigns['postSearchField'] = $POST['search_field'];
$theKey = $this->pObj->MOD_SETTINGS['ts_browser_toplevel_' . $bType];
if (!$theKey || !str_replace('-', '', $theKey)) {
$theKey = '';
}
list($theSetup, $theSetupValue) = $this->templateService->ext_getSetup($theSetup, $this->pObj->MOD_SETTINGS['ts_browser_toplevel_' . $bType] ? $this->pObj->MOD_SETTINGS['ts_browser_toplevel_' . $bType] : '');
$tree = $this->templateService->ext_getObjTree($theSetup, $theKey, '', '', $theSetupValue, $this->pObj->MOD_SETTINGS['ts_browser_alphaSort']);
$tree = $this->templateService->substituteCMarkers($tree);
$urlParameters = [
'id' => $this->id
];
/** @var \TYPO3\CMS\Backend\Routing\UriBuilder $uriBuilder */
$uriBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Routing\UriBuilder::class);
$aHref = (string)$uriBuilder->buildUriFromRoute('web_ts', $urlParameters);
// Parser Errors:
$pEkey = $bType === 'setup' ? 'config' : 'constants';
$assigns['hasParseErrors'] = !empty($this->templateService->parserErrors[$pEkey]);
if (!empty($this->templateService->parserErrors[$pEkey])) {
$assigns['showErrorDetailsUri'] = $aHref . '&SET[function]=TYPO3\\CMS\\Tstemplate\\Controller\\TemplateAnalyzerModuleFunctionController&template=all&SET[ts_analyzer_checkLinenum]=1#line-';
$assigns['parseErrors'] = $this->templateService->parserErrors[$pEkey];
}
if (isset($this->pObj->MOD_SETTINGS['ts_browser_TLKeys_' . $bType][$theKey])) {
$assigns['moduleUrlRemoveFromObjectList'] = $aHref . '&addKey[' . $theKey . ']=0&SET[ts_browser_toplevel_' . $bType . ']=0';
}
$assigns['hasKeySelected'] = $theKey !== '';
if ($theKey) {
$assigns['treeLabel'] = $theKey;
} else {
$assigns['rootLLKey'] = $bType === 'setup' ? 'setupRoot' : 'constantRoot';
}
$assigns['tsTree'] = $tree;
// second row options
$assigns['isSetupAndCropLinesDisabled'] = $bType === 'setup' && !$this->pObj->MOD_SETTINGS['ts_browser_fixedLgd'];
$assigns['checkBoxShowComments'] = BackendUtility::getFuncCheck($this->id, 'SET[ts_browser_showComments]', $this->pObj->MOD_SETTINGS['ts_browser_showComments'], '', '', 'id="checkTs_browser_showComments"');
$assigns['checkBoxAlphaSort'] = BackendUtility::getFuncCheck($this->id, 'SET[ts_browser_alphaSort]', $this->pObj->MOD_SETTINGS['ts_browser_alphaSort'], '', '', 'id="checkTs_browser_alphaSort"');
$assigns['checkBoxCropLines'] = BackendUtility::getFuncCheck($this->id, 'SET[ts_browser_fixedLgd]', $this->pObj->MOD_SETTINGS['ts_browser_fixedLgd'], '', '', 'id="checkTs_browser_fixedLgd"');
if ($bType === 'setup' && !$this->pObj->MOD_SETTINGS['ts_browser_fixedLgd']) {
$assigns['dropdownDisplayConstants'] = BackendUtility::getDropdownMenu($this->id, 'SET[ts_browser_const]', $this->pObj->MOD_SETTINGS['ts_browser_const'], $this->pObj->MOD_MENU['ts_browser_const']);
}
// Conditions:
$assigns['hasConditions'] = is_array($this->templateService->sections) && !empty($this->templateService->sections);
if (is_array($this->templateService->sections) && !empty($this->templateService->sections)) {
$tsConditions = [];
foreach ($this->templateService->sections as $key => $val) {
$tsConditions[] = [
'key' => $key,
'value' => $val,
'label' => $this->templateService->substituteCMarkers(htmlspecialchars($val)),
'isSet' => $this->pObj->MOD_SETTINGS['tsbrowser_conditions'][$key] ? true : false
];
}
$assigns['tsConditions'] = $tsConditions;
}
// Ending section displayoptions
}
$this->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/Tooltip');
$view = GeneralUtility::makeInstance(StandaloneView::class);
$view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName(
'EXT:tstemplate/Resources/Private/Templates/TemplateObjectBrowserModuleFunction.html'
));
$view->assignMultiple($assigns);
return $view->render();
}
/**
* Add flash message to queue
*
* @param FlashMessage $flashMessage
*/
protected function addFlashMessage(FlashMessage $flashMessage)
{
/** @var FlashMessageService $flashMessageService */
$flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
/** @var \TYPO3\CMS\Core\Messaging\FlashMessageQueue $defaultFlashMessageQueue */
$defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier();
$defaultFlashMessageQueue->enqueue($flashMessage);
}
/**
* If $this->function_key is set (which means there are two levels of object connectivity) then
* $this->extClassConf is loaded with the TBE_MODULES_EXT configuration for that sub-sub-module
*
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0.
*/
protected function handleExternalFunctionValue()
{
// Must clean first to make sure the correct key is set...
$this->pObj->MOD_SETTINGS = BackendUtility::getModuleData($this->pObj->MOD_MENU, GeneralUtility::_GP('SET'), 'web_ts');
if ($this->function_key) {
$this->extClassConf = $this->pObj->getExternalItemConfig('web_ts', $this->function_key, $this->pObj->MOD_SETTINGS[$this->function_key]);
}
}
/**
* @return LanguageService
*/
protected function getLanguageService(): LanguageService
{
return $GLOBALS['LANG'];
}
/**
* @return BackendUserAuthentication
*/
protected function getBackendUserAuthentication(): BackendUserAuthentication
{
return $GLOBALS['BE_USER'];
}
/**
* @return PageRenderer
*/
protected function getPageRenderer(): PageRenderer
{
return GeneralUtility::makeInstance(PageRenderer::class);
}
}