Files
gutachten_t3/typo3/sysext/adminpanel/Classes/View/AdminPanelView.php
T
2026-10-19 08:18:39 +02:00

481 lines
19 KiB
PHP

<?php
namespace TYPO3\CMS\Adminpanel\View;
/*
* 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\Adminpanel\ModuleApi\ConfigurableInterface;
use TYPO3\CMS\Adminpanel\ModuleApi\DataProviderInterface;
use TYPO3\CMS\Adminpanel\ModuleApi\ModuleInterface;
use TYPO3\CMS\Adminpanel\Service\EditToolbarService;
use TYPO3\CMS\Adminpanel\Utility\StateUtility;
use TYPO3\CMS\Backend\FrontendBackendUserAuthentication;
use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\PathUtility;
/**
* View class for the admin panel in frontend editing.
*
* @internal
*/
class AdminPanelView
{
/**
* Force preview
*
* @var bool
*/
protected $ext_forcePreview = false;
/**
* Array of adminPanel modules
*
* @var \TYPO3\CMS\Adminpanel\ModuleApi\ModuleInterface[]
*/
protected $modules = [];
/**
* @var array
*/
protected $configuration;
/**
* Setter for injecting new-style modules
*
* @see \TYPO3\CMS\Adminpanel\Controller\MainController::render()
* @param array $modules
* @internal
*/
public function setModules(array $modules): void
{
$this->modules = $modules;
}
/**
* Returns LanguageService
*
* @return \TYPO3\CMS\Core\Localization\LanguageService
*/
protected function getLanguageService()
{
return $GLOBALS['LANG'];
}
/**
* Returns the current BE user.
*
* @return FrontendBackendUserAuthentication
*/
protected function getBackendUser()
{
return $GLOBALS['BE_USER'];
}
/*****************************************************
* Admin Panel: Deprecated API
****************************************************/
/**
* Backwards compatibility method ensuring hook still gets the same content as before
*
* @deprecated since TYPO3 v9 - remove when hook can be removed
* @internal
* @return string
* @throws \UnexpectedValueException
*/
public function callDeprecatedHookObject(): string
{
$moduleContent = '';
if (StateUtility::isOpen()) {
foreach ($this->modules as $module) {
$moduleContent .= $this->getModule($module);
}
foreach (
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_adminpanel.php']['extendAdminPanel']
??
[] as $className
) {
trigger_error(
'The hook $GLOBALS[TYPO3_CONF_VARS][SC_OPTIONS][tslib/class.tslib_adminpanel.php][extendAdminPanel] will be removed in TYPO3 v10.0, register an AdminPanelModule instead.',
E_USER_DEPRECATED
);
$hookObject = GeneralUtility::makeInstance($className);
if (!$hookObject instanceof AdminPanelViewHookInterface) {
throw new \UnexpectedValueException(
$className . ' must implement interface ' . AdminPanelViewHookInterface::class,
1311942539
);
}
$content = $hookObject->extendAdminPanel($moduleContent, $this);
if ($content) {
$moduleContent .= '<div class="typo3-adminPanel-section typo3-adminPanel-section-open">';
$moduleContent .= ' <div class="typo3-adminPanel-section-body">';
$moduleContent .= ' ' . $content;
$moduleContent .= ' </div>';
$moduleContent .= '</div>';
}
}
}
return $moduleContent;
}
/**
* Render a single module with header panel
*
* @deprecated since TYPO3 v9 - only used in deprecated hook call (which triggers the corresponding deprecation error)
* @param ModuleInterface $module
* @return string
*/
protected function getModule(ModuleInterface $module): string
{
$output = [];
if ($module instanceof ConfigurableInterface && $module->isEnabled()) {
$output[] = '<div class="typo3-adminPanel-section typo3-adminPanel-section-open">';
$output[] = ' <div class="typo3-adminPanel-section-title">';
$output[] = ' ' . $this->getSectionOpenerLink($module);
$output[] = ' </div>';
$output[] = '<div class="typo3-adminPanel-section-body">';
$output[] = ' ' . $module->getContent();
$output[] = '</div>';
$output[] = '</div>';
}
if ($module instanceof DataProviderInterface) {
foreach ($module->getJavaScriptFiles() as $javaScriptFile) {
$output[] =
'<script src="' .
PathUtility::getAbsoluteWebPath(GeneralUtility::getFileAbsFileName($javaScriptFile)) .
'"></script>';
}
}
return implode('', $output);
}
/*****************************************************
* Admin Panel Layout Helper functions
****************************************************/
/**
* Wraps a string in a link which will open/close a certain part of the Admin Panel
*
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0. Only used in deprecated hook call (which triggers the corresponding deprecation error)
* @param ModuleInterface $module
* @return string
*/
protected function getSectionOpenerLink(ModuleInterface $module): string
{
$identifier = $module->getIdentifier();
$onclick = 'document.TSFE_ADMIN_PANEL_FORM[' .
GeneralUtility::quoteJSvalue('TSFE_ADMIN_PANEL[display_' . $identifier . ']') .
'].value=' .
($this->getBackendUser()->uc['AdminPanel']['display_' . $identifier] ? '0' : '1') .
';document.TSFE_ADMIN_PANEL_FORM.submit();return false;';
$output = [];
$output[] = '<span class="typo3-adminPanel-section-title-identifier"></span>';
$output[] = '<a href="javascript:void(0)" onclick="' . htmlspecialchars($onclick) . '">';
$output[] = ' ' . htmlspecialchars($module->getLabel());
$output[] = '</a>';
$output[] = '<input type="hidden" name="TSFE_ADMIN_PANEL[display_' .
$identifier .
']" value="' .
1 .
'" />';
return implode('', $output);
}
/**
* Creates the tool bar links for the "edit" section of the Admin Panel.
*
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0. Use EditToolbarService instead or create buttons via fluid
* @return string A string containing images wrapped in <a>-tags linking them to proper functions.
*/
public function ext_makeToolBar(): string
{
trigger_error(
'AdminPanelView::ext_makeToolBar() will be removed in TYPO3 v10.0, use fluid and backend uri builder to create a toolbar.',
E_USER_DEPRECATED
);
$editToolbarService = GeneralUtility::makeInstance(EditToolbarService::class);
return $editToolbarService->createToolbar();
}
/**
* Translate given key
*
* @param string $key Key for a label in the $LOCAL_LANG array of "EXT:core/Resources/Private/Language/locallang_tsfe.xlf
* @param bool $convertWithHtmlspecialchars If TRUE the language-label will be sent through htmlspecialchars
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - only used in deprecated methods
* @return string The value for the $key
*/
protected function extGetLL($key, $convertWithHtmlspecialchars = true)
{
$labelStr = $this->getLanguageService()->getLL($key);
if ($convertWithHtmlspecialchars) {
$labelStr = htmlspecialchars($labelStr);
}
return $labelStr;
}
/**
* Add an additional stylesheet
*
* @return string
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - implement AdminPanelModules via the new API (see AdminPanelModuleInterface)
*/
public function getAdminPanelHeaderData()
{
trigger_error(
'AdminPanelView->getAdminPanelHeaderData() will be removed in TYPO3 v10.0. Implement AdminPanelModules via the new API (see AdminPanelModuleInterface).',
E_USER_DEPRECATED
);
$result = '';
if (!empty($GLOBALS['TBE_STYLES']['stylesheets']['admPanel'])) {
$stylesheet = GeneralUtility::locationHeaderUrl($GLOBALS['TBE_STYLES']['stylesheets']['admPanel']);
$result = '<link rel="stylesheet" type="text/css" href="' .
htmlspecialchars($stylesheet, ENT_QUOTES | ENT_HTML5) . '" />';
}
return $result;
}
/**
* Checks if an Admin Panel section ("module") is available for the user. If so, TRUE is returned.
*
* @param string $key The module key, eg. "edit", "preview", "info" etc.
* @return bool
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - implement AdminPanelModules via the new API (see AdminPanelModuleInterface)
*/
public function isAdminModuleEnabled($key)
{
trigger_error(
'AdminPanelView->isAdminModuleEnabled() will be removed in TYPO3 v10.0. Implement AdminPanelModules via the new API (see AdminPanelModuleInterface).',
E_USER_DEPRECATED
);
$result = false;
// Returns TRUE if the module checked is "preview" and the forcePreview flag is set.
if ($key === 'preview' && $this->ext_forcePreview) {
$result = true;
} elseif (!empty($this->configuration['enable.']['all'])) {
$result = true;
} elseif (!empty($this->configuration['enable.'][$key])) {
$result = true;
}
return $result;
}
/**
* Saves any change in settings made in the Admin Panel.
*
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - implement AdminPanelModules via the new API (see AdminPanelModuleInterface)
*/
public function saveConfigOptions()
{
trigger_error(
'AdminPanelView->saveConfigOptions() will be removed in TYPO3 v10.0. Implement AdminPanelModules via the new API (see AdminPanelModuleInterface).',
E_USER_DEPRECATED
);
$input = GeneralUtility::_GP('TSFE_ADMIN_PANEL');
$beUser = $this->getBackendUser();
if (is_array($input)) {
// Setting
$beUser->uc['AdminPanel'] = array_merge(
!is_array($beUser->uc['AdminPanel']) ? [] : $beUser->uc['AdminPanel'],
$input
);
unset($beUser->uc['AdminPanel']['action']);
foreach ($this->modules as $module) {
if ($module->isEnabled()) {
// We use TYPO3_REQUEST for compatibility reasons. The object and this method are deprecated anyway, this should be fine.
$module->onSubmit($input, $GLOBALS['TYPO3_REQUEST']);
}
}
// Saving
$beUser->writeUC();
// Flush fluid template cache
$cacheManager = new CacheManager();
$cacheManager->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
$cacheManager->getCache('fluid_template')->flush();
}
}
/**
* Returns the value for an Admin Panel setting.
*
* @param string $sectionName Module key
* @param string $val Setting key
* @return mixed The setting value
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - implement AdminPanelModules via the new API (see AdminPanelModuleInterface)
*/
public function extGetFeAdminValue($sectionName, $val = '')
{
trigger_error(
'AdminPanelView->extGetFeAdminValue() will be removed in TYPO3 v10.0. Implement AdminPanelModules via the new API (see AdminPanelModuleInterface).',
E_USER_DEPRECATED
);
if (!$this->isAdminModuleEnabled($sectionName)) {
return null;
}
$beUser = $this->getBackendUser();
// Exceptions where the values can be overridden (forced) from backend:
// deprecated
if (
$sectionName === 'edit' && (
$val === 'displayIcons' && $this->configuration['module.']['edit.']['forceDisplayIcons'] ||
$val === 'displayFieldIcons' && $this->configuration['module.']['edit.']['forceDisplayFieldIcons'] ||
$val === 'editNoPopup' && $this->configuration['module.']['edit.']['forceNoPopup']
)
) {
return true;
}
// Override all settings with user TSconfig
if ($val && isset($this->configuration['override.'][$sectionName . '.'][$val])) {
return $this->configuration['override.'][$sectionName . '.'][$val];
}
if (!$val && isset($this->configuration['override.'][$sectionName])) {
return $this->configuration['override.'][$sectionName];
}
$returnValue = $val ? $beUser->uc['AdminPanel'][$sectionName . '_' . $val] : 1;
// Exception for preview
if ($sectionName === 'preview' && $this->ext_forcePreview) {
return !$val ? true : $returnValue;
}
// See if the menu is expanded!
return $this->isAdminModuleOpen($sectionName) ? $returnValue : null;
}
/**
* Enables the force preview option.
*
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - see AdminPanelModule: Preview
*/
public function forcePreview()
{
trigger_error(
'AdminPanelView->forcePreview() will be removed in TYPO3 v10.0. Use new AdminPanel Preview Module instead.',
E_USER_DEPRECATED
);
$this->ext_forcePreview = true;
}
/**
* Returns TRUE if admin panel module is open
*
* @param string $key Module key
* @return bool TRUE, if the admin panel is open for the specified admin panel module key.
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - use new AdminPanel API instead
*/
public function isAdminModuleOpen($key)
{
trigger_error(
'AdminPanelView->isAdminModuleOpen() will be removed in TYPO3 v10.0. Use new AdminPanel API instead.',
E_USER_DEPRECATED
);
return $this->getBackendUser()->uc['AdminPanel']['display_top'] &&
$this->getBackendUser()->uc['AdminPanel']['display_' . $key];
}
/**
* Returns a row (with 4 columns) for content in a section of the Admin Panel.
* It will take $pre as a key to a label to display and $element as the content to put into the forth cell.
*
* @param string $title Key to label
* @param string $content The HTML content for the forth table cell.
* @param string $checkbox The HTML for a checkbox or hidden fields.
* @param string $innerDivClass The Class attribute for the td element.
* @param string $outerDivClass The Class attribute for the tr element.
* @return string HTML table row.
* @see extGetHead()
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - use new AdminPanel API instead
*/
public function extGetItem($title, $content = '', $checkbox = '', $outerDivClass = null, $innerDivClass = null)
{
trigger_error(
'AdminPanelView->extGetItem() will be removed in TYPO3 v10.0. Use new AdminPanel API instead.',
E_USER_DEPRECATED
);
$title = $title ? '<label for="' . htmlspecialchars($title) . '">' . $this->extGetLL($title) . '</label>' : '';
$out = '';
$out .= (string)$outerDivClass ? '<div class="' . htmlspecialchars($outerDivClass) . '">' : '<div>';
$out .= (string)$innerDivClass ? '<div class="' . htmlspecialchars($innerDivClass) . '">' : '<div>';
$out .= $checkbox . $title . $content . '</div></div>';
return $out;
}
/**
* Returns a row (with colspan=4) which is a header for a section in the Admin Panel.
* It will have a plus/minus icon and a label which is linked so that it submits the form which surrounds the whole Admin Panel when clicked, alterting the TSFE_ADMIN_PANEL[display_' . $pre . '] value
* See the functions get*Module
*
* @param string $sectionSuffix The suffix to the display_ label. Also selects the label from the LOCAL_LANG array.
* @return string HTML table row.
* @see extGetItem()
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - use new AdminPanel API instead
*/
public function extGetHead($sectionSuffix)
{
trigger_error(
'AdminPanelView->extGetHead() will be removed in TYPO3 v10.0. Use new AdminPanel API instead.',
E_USER_DEPRECATED
);
return $this->linkSectionHeader($sectionSuffix, $this->extGetLL($sectionSuffix));
}
/**
* Wraps a string in a link which will open/close a certain part of the Admin Panel
*
* @param string $sectionSuffix The code for the display_ label/key
* @param string $sectionTitle Title (HTML-escaped)
* @param string $className The classname for the <a> tag
* @return string $className Linked input string
* @see extGetHead()
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0 - use new AdminPanel API instead
*/
public function linkSectionHeader($sectionSuffix, $sectionTitle, $className = '')
{
trigger_error(
'AdminPanelView->linkSectionHeader() will be removed in TYPO3 v10.0. Use new AdminPanel API instead.',
E_USER_DEPRECATED
);
$onclick = 'document.TSFE_ADMIN_PANEL_FORM[' .
GeneralUtility::quoteJSvalue('TSFE_ADMIN_PANEL[display_' . $sectionSuffix . ']') .
'].value=' .
($this->getBackendUser()->uc['AdminPanel']['display_' . $sectionSuffix] ? '0' : '1') .
';document.TSFE_ADMIN_PANEL_FORM.submit();return false;';
$output = [];
$output[] = '<span class="typo3-adminPanel-section-title-identifier"></span>';
$output[] = '<a href="javascript:void(0)" onclick="' . htmlspecialchars($onclick) . '">';
$output[] = ' ' . $sectionTitle;
$output[] = '</a>';
$output[] = '<input type="hidden" name="TSFE_ADMIN_PANEL[display_' .
$sectionSuffix .
']" value="' .
(int)$this->isAdminModuleOpen($sectionSuffix) .
'" />';
return implode('', $output);
}
}