first commit

This commit is contained in:
salam committed 2026-10-19 08:18:39 +02:00
commit 1218dd1517
12716 files changed
+989233

No files matched your search

@@ -0,0 +1,228 @@
<?php
namespace TYPO3\CMS\Backend\Module;
/*
* 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\Template\DocumentTemplate;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Localization\LanguageService;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* Parent class for 'Extension Objects' in backend modules.
*
* Used for 'submodules' to other modules. Also called 'Function menu modules'
* in \TYPO3\CMS\Core\Utility\ExtensionManagementUtility. And now its even called
* 'Extension Objects'. Or 'Module functions'. Wish we had just one name. Or a
* name at all...(?) Thank God its not so advanced when it works...
*
* In other words this class is used for backend modules which is not true
* backend modules appearing in the menu but rather adds themselves as a new
* entry in the function menu which typically exists for a backend
* module (like Web>Info or Tools etc...)
* The magic that binds this together is stored in the global variable
* $TBE_MODULES_EXT where extensions wanting to connect a module based on
* this class to an existing backend module store configuration which consists
* of the classname, script-path and a label (title/name).
*
* For more information about this, please see the large example comment for the
* class \TYPO3\CMS\Backend\Module\BaseScriptClass. This will show the principle of a
* 'level-1' connection. The more advanced example - having two layers as it is done
* with the 'web_info' module - can be seen in the comment above.
*
* EXAMPLE: One level.
* This can be seen in the extension 'frontend' where the info module have a
* function added. In 'ext_tables.php' this is done by this function call:
*
* \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::insertModuleFunction(
* 'web_info',
* \TYPO3\CMS\Frontend\Controller\PageInformationController::class,
* NULL,
* 'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:mod_tx_cms_webinfo_page'
* );
*
* For this two-level thing to work it also requires that the parent
* module (the real backend module) supports it.
* This is the case for the modules web_info since it has two
* times inclusion sections in their index.php scripts.
*
* @see \TYPO3\CMS\Backend\Module\BaseScriptClass
* @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0
*/
abstract class AbstractFunctionModule
{
/**
* Contains a reference to the parent (calling) object (which is probably an instance of
* an extension class to \TYPO3\CMS\Backend\Module\BaseScriptClass
*
* @var BaseScriptClass
* @see init()
*/
public $pObj;
/**
* @var BaseScriptClass
*/
public $extObj;
/**
* 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
*/
public $localLangFile = '';
/**
* Contains module configuration parts from TBE_MODULES_EXT if found
*
* @see handleExternalFunctionValue()
* @var array
*/
public $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'
*
* @see handleExternalFunctionValue(), \TYPO3\CMS\FuncWizards\Controller\WebFunctionWizardsBaseController
* @var string
*/
public $function_key = '';
/**
* @var PageRenderer
*/
protected $pageRenderer;
/**
* Constructor deprecates the class
*/
public function __construct()
{
trigger_error(
'Class AbstractFunctionModule is deprecated and will be removed in TYPO3 v10.0',
E_USER_DEPRECATED
);
}
/**
* Initialize the object
*
* @param \object $pObj A reference to the parent (calling) object
* @throws \RuntimeException
* @see \TYPO3\CMS\Backend\Module\BaseScriptClass::checkExtObj()
*/
public function init($pObj)
{
$this->pObj = $pObj;
// Local lang:
if (!empty($this->localLangFile)) {
$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());
}
/**
* 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
*
* @see $function_key, \TYPO3\CMS\FuncWizards\Controller\WebFunctionWizardsBaseController::init()
*/
public 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'), $this->pObj->MCONF['name']);
if ($this->function_key) {
$this->extClassConf = $this->pObj->getExternalItemConfig($this->pObj->MCONF['name'], $this->function_key, $this->pObj->MOD_SETTINGS[$this->function_key]);
}
}
/**
* Same as \TYPO3\CMS\Backend\Module\BaseScriptClass::checkExtObj()
*
* @see \TYPO3\CMS\Backend\Module\BaseScriptClass::checkExtObj()
*/
public function checkExtObj()
{
if (is_array($this->extClassConf) && $this->extClassConf['name']) {
$this->extObj = GeneralUtility::makeInstance($this->extClassConf['name']);
$this->extObj->init($this->pObj, $this->extClassConf);
// Re-write:
$this->pObj->MOD_SETTINGS = BackendUtility::getModuleData($this->pObj->MOD_MENU, GeneralUtility::_GP('SET'), $this->pObj->MCONF['name']);
}
}
/**
* Calls the main function inside ANOTHER sub-submodule which might exist.
*/
public function extObjContent()
{
if (is_object($this->extObj)) {
return $this->extObj->main();
}
}
/**
* Dummy function - but is used to set up additional menu items for this submodule.
*
* @return array A MOD_MENU array which will be merged together with the one from the parent object
* @see init(), \TYPO3\CMS\Frontend\Controller\PageInformationController::modMenu()
*/
public function modMenu()
{
return [];
}
/**
* @return LanguageService
*/
protected function getLanguageService()
{
return $GLOBALS['LANG'];
}
/**
* @return BackendUserAuthentication
*/
protected function getBackendUserAuthentication()
{
return $GLOBALS['BE_USER'];
}
/**
* @return DocumentTemplate
*/
protected function getDocumentTemplate()
{
return $GLOBALS['TBE_TEMPLATE'];
}
/**
* @return PageRenderer
*/
protected function getPageRenderer()
{
if ($this->pageRenderer === null) {
$this->pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
}
return $this->pageRenderer;
}
}