From 241497a2ab5e34501ead41106e021de0145b8332 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Wed, 20 Jan 2016 09:15:59 +0100
Subject: [PATCH] [TASK] Unify references for backend modules icons
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Somehow on earth, regular (non-extbase) modules
register their module icons via [labels][tabs_images][tab]
when using addModule(). The icon is not related to the
labels at all, and can be simplified.

All icons registered are available via the module
configuration option "icon" and old formats are migrated
automatically (with a deprecation warning), and always
stored in an absolute format.

Using "icon" now in the available places makes it easier
and is unified in ModuleLoader, FormEngine, EXT:about and the
Module Menu.

Resolves: #72827
Releases: master
Change-Id: Ie5770539bcb94921a9319a1d8d53d981c49fbcd8
Reviewed-on: https://review.typo3.org/46100
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Frank Nägler <frank.naegler@typo3.org>
Tested-by: Frank Nägler <frank.naegler@typo3.org>
---
 .../Classes/Controller/ModulesController.php  |  2 +-
 .../ToolbarItems/ShortcutToolbarItem.php      | 35 +++++++------
 .../Module/BackendModuleRepository.php        | 45 ++---------------
 .../FormDataProvider/AbstractItemProvider.php |  7 ++-
 .../backend/Classes/Module/ModuleLoader.php   | 10 ----
 .../FormDataProvider/TcaSelectItemsTest.php   |  8 +--
 typo3/sysext/backend/ext_tables.php           |  4 +-
 .../Utility/ExtensionManagementUtility.php    | 27 +++++++---
 ...onConfigurationViaLabelstabs_imagestab.rst | 50 +++++++++++++++++++
 typo3/sysext/dbal/ext_tables.php              |  4 +-
 typo3/sysext/func/ext_tables.php              |  4 +-
 typo3/sysext/info/ext_tables.php              |  4 +-
 typo3/sysext/install/ext_tables.php           |  4 +-
 typo3/sysext/lowlevel/ext_tables.php          |  8 +--
 typo3/sysext/recordlist/ext_tables.php        |  4 +-
 typo3/sysext/scheduler/ext_tables.php         |  4 +-
 typo3/sysext/setup/ext_tables.php             |  4 +-
 typo3/sysext/taskcenter/ext_tables.php        |  4 +-
 typo3/sysext/tstemplate/ext_tables.php        |  4 +-
 19 files changed, 119 insertions(+), 113 deletions(-)
 create mode 100644 typo3/sysext/core/Documentation/Changelog/master/Deprecation-72827-ModuleIconConfigurationViaLabelstabs_imagestab.rst

diff --git a/typo3/sysext/about/Classes/Controller/ModulesController.php b/typo3/sysext/about/Classes/Controller/ModulesController.php
index 8768ca597710..37ce64e35b54 100644
--- a/typo3/sysext/about/Classes/Controller/ModulesController.php
+++ b/typo3/sysext/about/Classes/Controller/ModulesController.php
@@ -144,7 +144,7 @@ class ModulesController extends ActionController
             $subModuleKey = $moduleName . '_' . $subModuleName . '_tab';
             $subModuleData = array();
             $subModuleData['name'] = $subModuleName;
-            $subModuleData['icon'] = PathUtility::stripPathSitePrefix($this->languageService->moduleLabels['tabs_images'][$subModuleKey]);
+            $subModuleData['icon'] = PathUtility::getAbsoluteWebPath($subModuleInfo['icon']);
             $subModuleData['label'] = $this->languageService->moduleLabels['tabs'][$subModuleKey];
             $subModuleData['shortDescription'] = $this->languageService->moduleLabels['labels'][$subModuleKey . 'label'];
             $subModuleData['longDescription'] = $this->languageService->moduleLabels['labels'][$subModuleKey . 'descr'];
diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php
index 799395bf718b..18bb512b6adf 100644
--- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php
+++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php
@@ -74,18 +74,21 @@ class ShortcutToolbarItem implements ToolbarItemInterface
      */
     protected $iconFactory;
 
+    /**
+     * @var ModuleLoader
+     */
+    protected $moduleLoader;
+
     /**
      * Constructor
      */
     public function __construct()
     {
         $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
-        if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_AJAX) {
-            $this->getLanguageService()->includeLLFile('EXT:lang/locallang_misc.xlf');
-            // Needed to get the correct icons when reloading the menu after saving it
-            $loadModules = GeneralUtility::makeInstance(ModuleLoader::class);
-            $loadModules->load($GLOBALS['TBE_MODULES']);
-        }
+        $this->getLanguageService()->includeLLFile('EXT:lang/locallang_misc.xlf');
+        // Needed to get the correct icons when reloading the menu after saving it
+        $this->moduleLoader = GeneralUtility::makeInstance(ModuleLoader::class);
+        $this->moduleLoader->load($GLOBALS['TBE_MODULES']);
 
         // By default, 5 groups are set
         $this->shortcutGroups = array(
@@ -275,7 +278,8 @@ class ShortcutToolbarItem implements ToolbarItemInterface
             }
             // Check for module access
             $moduleName = $row['M_module_name'] ?: $row['module_name'];
-            if (!isset($this->getLanguageService()->moduleLabels['tabs_images'][$moduleName . '_tab'])) {
+
+            if (!isset($this->getLanguageService()->moduleLabels['labels'][$moduleName . '_tablabel'])) {
                 // Nice hack to check if the user has access to this module
                 // - otherwise the translation label would not have been loaded :-)
                 continue;
@@ -840,14 +844,15 @@ class ShortcutToolbarItem implements ToolbarItemInterface
                 $icon = '<span title="' . $titleAttribute . '">' . $this->iconFactory->getIcon('mimetypes-word', Icon::SIZE_SMALL)->render() . '</span>';
                 break;
             default:
-                if ($languageService->moduleLabels['tabs_images'][$row['module_name'] . '_tab']) {
-                    $icon = $languageService->moduleLabels['tabs_images'][$row['module_name'] . '_tab'];
-                    // Change icon of fileadmin references - otherwise it doesn't differ with Web->List
-                    $icon = str_replace('mod/file/list/list.gif', 'mod/file/file.gif', $icon);
-                    if (GeneralUtility::isAbsPath($icon)) {
-                        $icon = '../' . PathUtility::stripPathSitePrefix($icon);
-                    }
-                    // @todo: hardcoded width as we don't have a way to address module icons with an API yet.
+                $moduleName = $row['module_name'];
+                if (strpos($moduleName, '_') !== false) {
+                    list($mainModule, $subModule) = explode('_', $moduleName, 2);
+                    $icon = $this->moduleLoader->modules[$mainModule]['sub'][$subModule]['icon'];
+                } elseif (!empty($moduleName)) {
+                    $icon = $this->moduleLoader->modules[$moduleName]['icon'];
+                }
+                if (!empty($icon) && file_exists($icon)) {
+                    $icon = '../' . PathUtility::stripPathSitePrefix($icon);
                     $icon = '<img src="' . htmlspecialchars($icon) . '" alt="' . $titleAttribute . '" width="16">';
                 } else {
                     $icon = '<span title="' . $titleAttribute . '">' . $this->iconFactory->getIcon('empty-empty', Icon::SIZE_SMALL)->render() . '</span>';
diff --git a/typo3/sysext/backend/Classes/Domain/Repository/Module/BackendModuleRepository.php b/typo3/sysext/backend/Classes/Domain/Repository/Module/BackendModuleRepository.php
index 493ec471b929..07a82fccb191 100644
--- a/typo3/sysext/backend/Classes/Domain/Repository/Module/BackendModuleRepository.php
+++ b/typo3/sysext/backend/Classes/Domain/Repository/Module/BackendModuleRepository.php
@@ -18,6 +18,7 @@ use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Core\Utility\PathUtility;
 
 /**
  * Repository for backend module menu
@@ -353,47 +354,11 @@ class BackendModuleRepository implements \TYPO3\CMS\Core\SingletonInterface
         if (!empty($moduleData['iconIdentifier'])) {
             $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
             $icon = $iconFactory->getIcon($moduleData['iconIdentifier'])->render();
-        } elseif (!empty($GLOBALS['LANG']->moduleLabels['tabs_images'][$moduleKey])) {
-            $imageReference = $GLOBALS['LANG']->moduleLabels['tabs_images'][$moduleKey];
-            $iconFileRelative = $this->getModuleIconRelative($imageReference);
-            if (!empty($iconFileRelative)) {
-                $iconTitle = $GLOBALS['LANG']->moduleLabels['tabs'][$moduleKey];
-                $iconSizes = @getimagesize($this->getModuleIconAbsolute($imageReference));
-                $icon = '<img src="' . $iconFileRelative . '" ' . $iconSizes[3] . ' title="' . htmlspecialchars($iconTitle) . '" alt="' . htmlspecialchars($iconTitle) . '" />';
-            }
+        } elseif (isset($moduleData['icon']) && is_file($moduleData['icon'])) {
+            $iconTitle = $GLOBALS['LANG']->moduleLabels['tabs'][$moduleKey];
+            $iconSizes = @getimagesize($moduleData['icon']);
+            $icon = '<img src="' . PathUtility::getAbsoluteWebPath($moduleData['icon']) . '" ' . $iconSizes[3] . ' title="' . htmlspecialchars($iconTitle) . '" alt="' . htmlspecialchars($iconTitle) . '" />';
         }
         return $icon;
     }
-
-    /**
-     * Returns the filename readable for the script from PATH_typo3.
-     * That means absolute names are just returned while relative names are
-     * prepended with the path pointing back to typo3/ dir
-     *
-     * @param string $iconFilename Icon filename
-     * @return string Icon filename with absolute path
-     * @see getModuleIconRelative()
-     */
-    protected function getModuleIconAbsolute($iconFilename)
-    {
-        if (!GeneralUtility::isAbsPath($iconFilename)) {
-            $iconFilename = PATH_typo3 . $iconFilename;
-        }
-        return $iconFilename;
-    }
-
-    /**
-     * Returns relative path to the icon filename for use in img-tags
-     *
-     * @param string $iconFilename Icon filename
-     * @return string Icon filename with relative path
-     * @see getModuleIconAbsolute()
-     */
-    protected function getModuleIconRelative($iconFilename)
-    {
-        if (GeneralUtility::isAbsPath($iconFilename)) {
-            $iconFilename = '../' . \TYPO3\CMS\Core\Utility\PathUtility::stripPathSitePrefix($iconFilename);
-        }
-        return $iconFilename;
-    }
 }
diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/AbstractItemProvider.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/AbstractItemProvider.php
index e682a6ed6e2a..47f0370c27e6 100644
--- a/typo3/sysext/backend/Classes/Form/FormDataProvider/AbstractItemProvider.php
+++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/AbstractItemProvider.php
@@ -310,7 +310,12 @@ abstract class AbstractItemProvider
                 if (is_array($modList)) {
                     foreach ($modList as $theMod) {
                         // Icon:
-                        $icon = $languageService->moduleLabels['tabs_images'][$theMod . '_tab'];
+                        if (strpos($theMod, '_') !== false) {
+                            list($mainModule, $subModule) = explode('_', $theMod, 2);
+                            $icon = $loadModules->modules[$mainModule]['sub'][$subModule]['icon'];
+                        } else {
+                            $icon = $loadModules->modules[$theMod]['icon'];
+                        }
                         if ($icon) {
                             $icon = '../' . PathUtility::stripPathSitePrefix($icon);
                         }
diff --git a/typo3/sysext/backend/Classes/Module/ModuleLoader.php b/typo3/sysext/backend/Classes/Module/ModuleLoader.php
index 7e9cfb6c97a7..c9d5e27e91e2 100644
--- a/typo3/sysext/backend/Classes/Module/ModuleLoader.php
+++ b/typo3/sysext/backend/Classes/Module/ModuleLoader.php
@@ -168,18 +168,8 @@ class ModuleLoader
         // Language processing. This will add module labels and image reference to the internal ->moduleLabels array of the LANG object.
         $lang = $this->getLanguageService();
         if (is_object($lang)) {
-            // $setupInformation['labels']['default']['tabs_images']['tab'] is for modules the reference
-            // to the module icon.
             $defaultLabels = $setupInformation['labels']['default'];
 
-            // Here the path is transformed to an absolute reference.
-            if ($defaultLabels['tabs_images']['tab']) {
-                if (\TYPO3\CMS\Core\Utility\StringUtility::beginsWith($defaultLabels['tabs_images']['tab'], 'EXT:')) {
-                    list($extensionKey, $relativePath) = explode('/', substr($defaultLabels['tabs_images']['tab'], 4), 2);
-                    $defaultLabels['tabs_images']['tab'] = ExtensionManagementUtility::extPath($extensionKey) . $relativePath;
-                }
-            }
-
             // If LOCAL_LANG references are used for labels of the module:
             if ($defaultLabels['ll_ref']) {
                 // Now the 'default' key is loaded with the CURRENT language - not the english translation...
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php
index e17996df76e5..8bc4ce2b5676 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php
@@ -1059,9 +1059,6 @@ class TcaSelectItemsTest extends UnitTestCase
         $GLOBALS['LANG'] = $languageService->reveal();
         $languageService->sL(Argument::cetera())->willReturnArgument(0);
         $languageService->moduleLabels = [
-            'tabs_images' => [
-                'aModule_tab' => PATH_site . 'aModuleTabIcon.gif',
-            ],
             'labels' => [
                 'aModule_tablabel' => 'aModuleTabLabel',
                 'aModule_tabdescr' => 'aModuleTabDescription',
@@ -1078,6 +1075,11 @@ class TcaSelectItemsTest extends UnitTestCase
         $moduleLoaderProphecy->modListGroup = [
             'aModule',
         ];
+        $moduleLoaderProphecy->modules = [
+            'aModule' => [
+                'icon' => PATH_site . 'aModuleTabIcon.gif'
+            ]
+        ];
 
         $expectedItems = [
             0 => [
diff --git a/typo3/sysext/backend/ext_tables.php b/typo3/sysext/backend/ext_tables.php
index 630652a3ab0a..87d03b3f6779 100644
--- a/typo3/sysext/backend/ext_tables.php
+++ b/typo3/sysext/backend/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Backend\Controller\PageLayoutController::class . '::mainAction',
             'access' => 'user,group',
             'name' => 'web_layout',
+            'icon' => 'EXT:backend/Resources/Public/Icons/module-page.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:backend/Resources/Public/Icons/module-page.svg',
-                ),
                 'll_ref' => 'LLL:EXT:backend/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
diff --git a/typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php b/typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php
index e3d0aa45c690..5e6208b4d581 100644
--- a/typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php
+++ b/typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php
@@ -865,15 +865,17 @@ class ExtensionManagementUtility
     public static function configureModule($moduleSignature)
     {
         $moduleConfiguration = $GLOBALS['TBE_MODULES']['_configuration'][$moduleSignature];
-        $iconPathAndFilename = $moduleConfiguration['icon'];
-        if (substr($iconPathAndFilename, 0, 4) === 'EXT:') {
-            list($extensionKey, $relativePath) = explode('/', substr($iconPathAndFilename, 4), 2);
-            $iconPathAndFilename = self::extPath($extensionKey) . $relativePath;
+        if (!empty($moduleConfiguration['labels']['tabs_images']['tab'])) {
+            GeneralUtility::deprecationLog('Module registration for backend module "' . $moduleSignature . '" uses old referencing for the icon. Use the configuration option "icon" directly instead of [labels][tabs_images][tab]. The old option is removed with TYPO3 v9.');
+            $moduleConfiguration['icon'] = $moduleConfiguration['labels']['tabs_images']['tab'];
+            unset($moduleConfiguration['labels']['tabs_images']['tab']);
         }
+
+        if (!empty($moduleConfiguration['icon'])) {
+            $moduleConfiguration['icon'] = GeneralUtility::getFileAbsFileName($moduleConfiguration['icon'], false, true);
+        }
+
         $moduleLabels = array(
-            'tabs_images' => array(
-                'tab' => $iconPathAndFilename
-            ),
             'labels' => array(
                 'tablabel' => $GLOBALS['LANG']->sL($moduleConfiguration['labels'] . ':mlang_labels_tablabel'),
                 'tabdescr' => $GLOBALS['LANG']->sL($moduleConfiguration['labels'] . ':mlang_labels_tabdescr')
@@ -934,6 +936,17 @@ class ExtensionManagementUtility
         // add additional configuration
         if (is_array($moduleConfiguration) && !empty($moduleConfiguration)) {
             $fullModuleSignature = $main . ($sub ? '_' . $sub : '');
+
+            if (!empty($moduleConfiguration['labels']['tabs_images']['tab'])) {
+                GeneralUtility::deprecationLog('Module registration for module "' . $fullModuleSignature . '" uses old referencing for the icon. Use the configuration option "icon" directly instead of [labels][tabs_images][tab]. The old option is removed with TYPO3 v9.');
+                $moduleConfiguration['icon'] = $moduleConfiguration['labels']['tabs_images']['tab'];
+                unset($moduleConfiguration['labels']['tabs_images']['tab']);
+            }
+
+            if (!empty($moduleConfiguration['icon'])) {
+                $moduleConfiguration['icon'] = GeneralUtility::getFileAbsFileName($moduleConfiguration['icon'], false, true);
+            }
+
             $GLOBALS['TBE_MODULES']['_configuration'][$fullModuleSignature] = $moduleConfiguration;
         }
     }
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-72827-ModuleIconConfigurationViaLabelstabs_imagestab.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-72827-ModuleIconConfigurationViaLabelstabs_imagestab.rst
new file mode 100644
index 000000000000..5f2ac7e81308
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-72827-ModuleIconConfigurationViaLabelstabs_imagestab.rst
@@ -0,0 +1,50 @@
+==============================================================================
+Deprecation: #72827 - Module Icon configuration via [labels][tabs_images][tab]
+==============================================================================
+
+Description
+===========
+
+When registering a non-extbase module, the option to configure the icon was previously done with the module
+configuration option ``[labels][tabs_images][tab]``. To clarify the naming, the property "icon" is introduced which
+expects a reference to the icon via the ``EXT:myextension/path/to/the/file.png`` syntax.
+
+The old option ``[labels][tabs_images][tab]`` was deprecated.
+
+
+Impact
+======
+
+When using the old configuration property ``[labels][tabs_images][tab]``, a deprecation message is thrown.
+
+
+Affected Installations
+======================
+
+Installations with custom backend non-extbase modules of third-party-extensions that still use the old configuration
+property.
+
+
+Migration
+=========
+
+Replace the ``[labels][tabs_images][tab]`` with ``[icon]`` in ``ext_tables.php`` in your extension like this:
+
+.. code-block:: php
+
+    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addModule(
+        'system',
+        'dbint',
+        '',
+        '',
+        array(
+            'routeTarget' => \TYPO3\CMS\Lowlevel\View\DatabaseIntegrityView::class . '::mainAction',
+            'access' => 'admin',
+            'name' => 'system_dbint',
+            'workspaces' => 'online',
+            'icon' => 'EXT:lowlevel/Resources/Public/Icons/module-dbint.svg',
+            'labels' => array(
+                'll_ref' => 'LLL:EXT:lowlevel/Resources/Private/Language/locallang_mod.xlf',
+            ),
+        )
+    );
\ No newline at end of file
diff --git a/typo3/sysext/dbal/ext_tables.php b/typo3/sysext/dbal/ext_tables.php
index a75e934f7a7e..880c6b402584 100644
--- a/typo3/sysext/dbal/ext_tables.php
+++ b/typo3/sysext/dbal/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Dbal\Controller\ModuleController::class . '::mainAction',
             'access' => 'admin',
             'name' => 'tools_txdbalM1',
+            'icon' => 'EXT:dbal/Resources/Public/Icons/module-dbal.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:dbal/Resources/Public/Icons/module-dbal.svg',
-                ),
                 'll_ref' => 'LLL:EXT:dbal/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
diff --git a/typo3/sysext/func/ext_tables.php b/typo3/sysext/func/ext_tables.php
index 2e8fa3cbe03a..a3ddb703fc8d 100644
--- a/typo3/sysext/func/ext_tables.php
+++ b/typo3/sysext/func/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Func\Controller\PageFunctionsController::class . '::mainAction',
             'access' => 'user,group',
             'name' => 'web_func',
+            'icon' => 'EXT:func/Resources/Public/Icons/module-func.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:func/Resources/Public/Icons/module-func.svg',
-                ),
                 'll_ref' => 'LLL:EXT:lang/locallang_mod_web_func.xlf',
             ),
         )
diff --git a/typo3/sysext/info/ext_tables.php b/typo3/sysext/info/ext_tables.php
index 5abcacf6e902..1b83637f3dae 100644
--- a/typo3/sysext/info/ext_tables.php
+++ b/typo3/sysext/info/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Info\Controller\InfoModuleController::class . '::mainAction',
             'access' => 'user,group',
             'name' => 'web_info',
+            'icon' => 'EXT:info/Resources/Public/Icons/module-info.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:info/Resources/Public/Icons/module-info.svg',
-                ),
                 'll_ref' => 'LLL:EXT:lang/locallang_mod_web_info.xlf',
             ),
         )
diff --git a/typo3/sysext/install/ext_tables.php b/typo3/sysext/install/ext_tables.php
index 945c7ddf764d..58fa1dbf38bf 100644
--- a/typo3/sysext/install/ext_tables.php
+++ b/typo3/sysext/install/ext_tables.php
@@ -20,10 +20,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Install\Controller\BackendModuleController::class . '::index',
             'access' => 'admin',
             'name' => 'system_extinstall',
+            'icon' => 'EXT:install/Resources/Public/Icons/module-install.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:install/Resources/Public/Icons/module-install.svg',
-                ),
                 'll_ref' => 'LLL:EXT:install/Resources/Private/Language/BackendModule.xlf',
             ),
         )
diff --git a/typo3/sysext/lowlevel/ext_tables.php b/typo3/sysext/lowlevel/ext_tables.php
index 697d5d5de3a0..73736a493379 100644
--- a/typo3/sysext/lowlevel/ext_tables.php
+++ b/typo3/sysext/lowlevel/ext_tables.php
@@ -12,10 +12,8 @@ if (TYPO3_MODE === 'BE') {
             'access' => 'admin',
             'name' => 'system_dbint',
             'workspaces' => 'online',
+            'icon' => 'EXT:lowlevel/Resources/Public/Icons/module-dbint.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:lowlevel/Resources/Public/Icons/module-dbint.svg',
-                ),
                 'll_ref' => 'LLL:EXT:lowlevel/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
@@ -30,10 +28,8 @@ if (TYPO3_MODE === 'BE') {
             'access' => 'admin',
             'name' => 'system_config',
             'workspaces' => 'online',
+            'icon' => 'EXT:lowlevel/Resources/Public/Icons/module-config.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:lowlevel/Resources/Public/Icons/module-config.svg',
-                ),
                 'll_ref' => 'LLL:EXT:lowlevel/Resources/Private/Language/locallang_mod_configuration.xlf',
             ),
         )
diff --git a/typo3/sysext/recordlist/ext_tables.php b/typo3/sysext/recordlist/ext_tables.php
index ab8384aafa2e..19dcd17fd9f1 100644
--- a/typo3/sysext/recordlist/ext_tables.php
+++ b/typo3/sysext/recordlist/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Recordlist\RecordList::class . '::mainAction',
             'access' => 'user,group',
             'name' => 'web_list',
+            'icon' => 'EXT:recordlist/Resources/Public/Icons/module-list.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:recordlist/Resources/Public/Icons/module-list.svg',
-                ),
                 'll_ref' => 'LLL:EXT:lang/locallang_mod_web_list.xlf',
             ),
         )
diff --git a/typo3/sysext/scheduler/ext_tables.php b/typo3/sysext/scheduler/ext_tables.php
index c865657fb97f..9fa19841cef9 100644
--- a/typo3/sysext/scheduler/ext_tables.php
+++ b/typo3/sysext/scheduler/ext_tables.php
@@ -12,10 +12,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController::class . '::mainAction',
             'access' => 'admin',
             'name' => 'system_txschedulerM1',
+            'icon' => 'EXT:scheduler/Resources/Public/Icons/module-scheduler.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:scheduler/Resources/Public/Icons/module-scheduler.svg',
-                ),
                 'll_ref' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
diff --git a/typo3/sysext/setup/ext_tables.php b/typo3/sysext/setup/ext_tables.php
index 1c2c5c0b7d4d..f24947b2fbf3 100644
--- a/typo3/sysext/setup/ext_tables.php
+++ b/typo3/sysext/setup/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Setup\Controller\SetupModuleController::class . '::mainAction',
             'access' => 'group,user',
             'name' => 'user_setup',
+            'icon' => 'EXT:setup/Resources/Public/Icons/module-setup.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:setup/Resources/Public/Icons/module-setup.svg',
-                ),
                 'll_ref' => 'LLL:EXT:setup/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
diff --git a/typo3/sysext/taskcenter/ext_tables.php b/typo3/sysext/taskcenter/ext_tables.php
index b7f2f81211d0..6ba59ccd03ec 100644
--- a/typo3/sysext/taskcenter/ext_tables.php
+++ b/typo3/sysext/taskcenter/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Taskcenter\Controller\TaskModuleController::class . '::mainAction',
             'access' => 'group,user',
             'name' => 'user_task',
+            'icon' => 'EXT:taskcenter/Resources/Public/Icons/module-taskcenter.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:taskcenter/Resources/Public/Icons/module-taskcenter.svg',
-                ),
                 'll_ref' => 'LLL:EXT:taskcenter/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
diff --git a/typo3/sysext/tstemplate/ext_tables.php b/typo3/sysext/tstemplate/ext_tables.php
index 40467d96a884..d12e8ede53a8 100644
--- a/typo3/sysext/tstemplate/ext_tables.php
+++ b/typo3/sysext/tstemplate/ext_tables.php
@@ -11,10 +11,8 @@ if (TYPO3_MODE === 'BE') {
             'routeTarget' => \TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController::class . '::mainAction',
             'access' => 'admin',
             'name' => 'web_ts',
+            'icon' => 'EXT:tstemplate/Resources/Public/Icons/module-tstemplate.svg',
             'labels' => array(
-                'tabs_images' => array(
-                    'tab' => 'EXT:tstemplate/Resources/Public/Icons/module-tstemplate.svg',
-                ),
                 'll_ref' => 'LLL:EXT:tstemplate/Resources/Private/Language/locallang_mod.xlf',
             ),
         )
-- 
GitLab