From 87acb2b1e791ee8e5ed7adff7455aec474721fcb Mon Sep 17 00:00:00 2001 From: Nikita Hovratov <nikita.h@live.de> Date: Tue, 3 Sep 2024 18:28:58 +0200 Subject: [PATCH] [FEATURE] Auto-add system fields showitem for tt_content This change adds system fields - as defined in the ctrl section - of tt_content to the showitem field list automatically. This is either done based on palettes that already exist or adding the fields individually to the corresponding tabs. Tabs that are therefore added automatically are: * General tab at the beginning * Language tab including language fields * Access tab including hidden+access fields * Description tab including descriptionColumn In case the showitem of such type defines the "Extended" tab, it is added at the end. We do this for tt_content because we want a unified way of how FormEngine renders the fields. Resolves: #104814 Releases: main Change-Id: I69965fbc74ae2192151ad2617c1a88cf1eb2a987 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/85859 Tested-by: Nikita Hovratov <nikita.h@live.de> Tested-by: Benni Mack <benni@typo3.org> Reviewed-by: Benni Mack <benni@typo3.org> Reviewed-by: Nikita Hovratov <nikita.h@live.de> Tested-by: Oliver Bartsch <bo@cedev.de> Tested-by: core-ci <typo3@b13.com> Reviewed-by: Oliver Bartsch <bo@cedev.de> --- .../Configuration/Tca/TcaPreparation.php | 193 +++++ ...maticallyAddSystemFieldsToContentTypes.rst | 128 ++++ .../Tests/Functional/Schema/TcaSchemaTest.php | 2 +- .../Configuration/Tca/TcaPreparationTest.php | 657 ++++++++++++++++++ .../frontend/Configuration/TCA/tt_content.php | 209 +----- 5 files changed, 980 insertions(+), 209 deletions(-) create mode 100644 typo3/sysext/core/Documentation/Changelog/13.3/Feature-104814-AutomaticallyAddSystemFieldsToContentTypes.rst diff --git a/typo3/sysext/core/Classes/Configuration/Tca/TcaPreparation.php b/typo3/sysext/core/Classes/Configuration/Tca/TcaPreparation.php index 9e477bad0a2f..d7c9a355cca8 100644 --- a/typo3/sysext/core/Classes/Configuration/Tca/TcaPreparation.php +++ b/typo3/sysext/core/Classes/Configuration/Tca/TcaPreparation.php @@ -17,6 +17,7 @@ declare(strict_types=1); namespace TYPO3\CMS\Core\Configuration\Tca; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\StringUtility; /** @@ -48,6 +49,7 @@ readonly class TcaPreparation $tca = $this->configureLinkSoftReferences($tca); $tca = $this->configureSelectSingle($tca); $tca = $this->configureRelationshipToOne($tca); + $tca = $this->addSystemFieldsToShowitemTypes($tca); return $tca; } @@ -385,4 +387,195 @@ readonly class TcaPreparation } return $tca; } + + /** + * Ensure that all system fields (CType, colPos, hidden etc.) are automatically added + * to the showitem list of all CTypes in tt_content. As custom CTypes might have added + * the fields, the respective fields also need to be removed first. + */ + protected function addSystemFieldsToShowitemTypes(array $tca): array + { + // @todo Only deal with this for tt_content in v13, as other parts might be too intrusive + // might change in v14 + if (!isset($tca['tt_content'])) { + return $tca; + } + // Only proceed in case the record type field is defined + $typeField = (string)($tca['tt_content']['ctrl']['type'] ?? ''); + if ($typeField === '') { + return $tca; + } + // Build list of values (fields and palettes) which should be removed + // from custom palettes, because they will be added automatically. + $listOfValuesToRemove = [ + '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general', + '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language', + '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access', + '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes', + '--palette--;;general', + '--palette--;;language', + '--palette--;;access', + '--palette--;;hidden', + 'colPos', + ]; + $listOfValuesToRemove[] = $typeField; + if (($languageField = (string)($tca['tt_content']['ctrl']['languageField'] ?? '')) !== '') { + $listOfValuesToRemove[] = $languageField; + } + if (($transOrigPointerField = (string)($tca['tt_content']['ctrl']['transOrigPointerField'] ?? '')) !== '') { + $listOfValuesToRemove[] = $transOrigPointerField; + } + $enablecolumns = $tca['tt_content']['ctrl']['enablecolumns'] ?? []; + foreach ($enablecolumns as $fieldName) { + $listOfValuesToRemove[] = $fieldName; + } + if (($editlock = (string)($tca['tt_content']['ctrl']['editlock'] ?? '')) !== '') { + $listOfValuesToRemove[] = $editlock; + } + if (($descriptionColumn = (string)($tca['tt_content']['ctrl']['descriptionColumn'] ?? '')) !== '') { + $listOfValuesToRemove[] = $descriptionColumn; + } + + // Remove any system field from custom palettes + foreach ($tca['tt_content']['palettes'] as $paletteName => &$paletteConfig) { + if (in_array($paletteName, ['general', 'language', 'access', 'hidden'], true)) { + continue; + } + $showItemSplitted = GeneralUtility::trimExplode(',', $paletteConfig['showitem'], true); + $paletteConfig['showitem'] = implode(',', array_diff($this->removeCustomFieldLabels($showItemSplitted, $listOfValuesToRemove), $listOfValuesToRemove)); + } + unset($paletteConfig); + + // Process the content types + foreach ($tca['tt_content']['types'] as $type => $typeInformation) { + // Remove any of the special fields from the content type's current showitem + $showItemSplitted = GeneralUtility::trimExplode(',', $typeInformation['showitem'] ?? '', true); + $showItemFiltered = array_diff($this->removeCustomFieldLabels($showItemSplitted, $listOfValuesToRemove), $listOfValuesToRemove); + + // Extract all fields of the extended tab to add it at the end + [$showItemList, $extendedParts] = $this->extractExtendedParts($showItemFiltered); + + // Add record type field (usually "CType") and colPos either using the "general" palette + // or manually, in case the palette does not exist or does not contain the fields. + $generalPaletteItems = $this->removeCustomFieldLabels(GeneralUtility::trimExplode(',', $tca['tt_content']['palettes']['general']['showitem'] ?? '', true), $listOfValuesToRemove); + if (in_array($typeField, $generalPaletteItems, true) && in_array('colPos', $generalPaletteItems, true)) { + $showItemParts = ['--palette--;;general']; + } else { + $showItemParts = [ + $typeField === 'CType' ? 'CType;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:CType_formlabel' : $typeField, + 'colPos;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:colPos_formlabel', + ]; + } + + // Because FormEngine will add the general tab automatically, we will not do this here + // However, if the first item in the $showItemList is actually a tab (--div--), we need to + // add if before the "first fields" + if (str_starts_with($showItemList[0] ?? '', '--div--')) { + array_unshift($showItemParts, $showItemList[0]); + unset($showItemList[0]); + } + $showItemParts = array_merge($showItemParts, $showItemList); + + // Add language field either using the "language" palette or manually, + // in case the palette does not exist or does not contain the field. + if ($languageField !== '') { + $showItemParts[] = '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language'; + $languagePaletteItems = $this->removeCustomFieldLabels(GeneralUtility::trimExplode(',', $tca['tt_content']['palettes']['language']['showitem'] ?? '', true), $listOfValuesToRemove); + if (in_array($languageField, $languagePaletteItems, true) + && ($transOrigPointerField === '' || in_array($transOrigPointerField, $languagePaletteItems, true)) + ) { + $showItemParts[] = '--palette--;;language'; + } else { + $showItemParts[] = $languageField; + if ($transOrigPointerField) { + $showItemParts[] = $transOrigPointerField; + } + } + } + + // Add enable fields either using the "hidden" amd "access" palettes or + // manually, in case the palettes do not exist or do not contain the fields. + if ($enablecolumns !== [] || $editlock !== '') { + $showItemParts[] = '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access'; + if (isset($enablecolumns['disabled'])) { + $hiddenPaletteParts = $this->removeCustomFieldLabels(GeneralUtility::trimExplode(',', $tca['tt_content']['palettes']['hidden']['showitem'] ?? '', true), $listOfValuesToRemove); + if (in_array($enablecolumns['disabled'], $hiddenPaletteParts, true)) { + $showItemParts[] = '--palette--;;hidden'; + } else { + $showItemParts[] = $enablecolumns['disabled']; + } + } + if ((isset($enablecolumns['starttime']) || isset($enablecolumns['endtime']) || isset($enablecolumns['fe_group']) || $editlock)) { + $accessPaletteParts = $this->removeCustomFieldLabels(GeneralUtility::trimExplode(',', $tca['tt_content']['palettes']['access']['showitem'] ?? '', true), $listOfValuesToRemove); + if ((!isset($enablecolumns['starttime']) || in_array($enablecolumns['starttime'], $accessPaletteParts, true)) + && (!isset($enablecolumns['endtime']) || in_array($enablecolumns['endtime'], $accessPaletteParts, true)) + && (!isset($enablecolumns['fe_group']) || in_array($enablecolumns['fe_group'], $accessPaletteParts, true)) + && (!$editlock || in_array($editlock, $accessPaletteParts, true)) + ) { + $showItemParts[] = '--palette--;;access'; + } else { + if (isset($enablecolumns['starttime'])) { + $showItemParts[] = $enablecolumns['starttime']; + } + if (isset($enablecolumns['endtime'])) { + $showItemParts[] = $enablecolumns['endtime']; + } + if (isset($enablecolumns['fe_group'])) { + $showItemParts[] = $enablecolumns['fe_group']; + } + if ($editlock) { + $showItemParts[] = $editlock; + } + } + } + } + + // Add description column if defined + if ($descriptionColumn !== '') { + $showItemParts[] = '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes,' . $descriptionColumn; + } + + // Add extended tab at the end - if it exists + $showItemParts = array_merge($showItemParts, $extendedParts); + + // Merge parts together + $tca['tt_content']['types'][$type]['showitem'] = trim(implode(',', $showItemParts), ','); + } + return $tca; + } + + private function extractExtendedParts(array $showItemFiltered): array + { + $extendedParts = []; + $addFields = false; + foreach ($showItemFiltered as $key => $part) { + if ($part === '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended') { + $extendedParts[] = $part; + $addFields = true; + unset($showItemFiltered[$key]); + } elseif ($addFields) { + if (str_starts_with($part, '--div--')) { + break; + } + $extendedParts[] = $part; + unset($showItemFiltered[$key]); + } + } + return [$showItemFiltered, $extendedParts]; + } + + private function removeCustomFieldLabels(array $showitemParts, array $fieldList): array + { + foreach ($showitemParts as &$showItem) { + // Check if we deal with a field + if (!str_starts_with($showItem, '--div--') && !str_starts_with($showItem, '--palette--')) { + $parts = GeneralUtility::trimExplode(';', $showItem, true, 2); + // Just keep the first part => the fieldname in case field is defined in the $fieldList + if ($fieldList !== [] && in_array($parts[0], $fieldList, true)) { + $showItem = $parts[0]; + } + } + } + return $showitemParts; + } } diff --git a/typo3/sysext/core/Documentation/Changelog/13.3/Feature-104814-AutomaticallyAddSystemFieldsToContentTypes.rst b/typo3/sysext/core/Documentation/Changelog/13.3/Feature-104814-AutomaticallyAddSystemFieldsToContentTypes.rst new file mode 100644 index 000000000000..b80d94830a43 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/13.3/Feature-104814-AutomaticallyAddSystemFieldsToContentTypes.rst @@ -0,0 +1,128 @@ +.. include:: /Includes.rst.txt + +.. _feature-104814-1725444916: + +=================================================================== +Feature: #104814 - Automatically add system fields to content types +=================================================================== + +See :issue:`104814` + +Description +=========== + +All content elements (:php:`CTypes`'s) are usually equipped with the same +system fields (`language`, `hidden`, etc.) - see also :ref:`feature-104311-1720176189`. +Adding them to the editor form has previously been done by adding those fields +to each content type's :php:`showitem` definition. + +In the effort to simplify content element creation, to unify the available +fields and position for the editor and to finally reduce configuration effort +for integrators, those system fields are now added automatically based +on the :php:`ctrl` definition. + +.. note:: + + The fields are added to the :php:`showitem` through their corresponding + palettes. In case such palette has been changed by extensions, the required + system fields are added individually to corresponding tabs. + +The following tabs / palettes are now added automatically: + +* The :guilabel:`General` tab with the `general` palette at the very beginning +* The :guilabel:`Language` tab with the `language` palette after custom fields +* The :guilabel:`Access` tab with the `hidden` and `access` palettes +* The :guilabel:`Notes` tab with the `rowDescription` field + +As mentioned, in case one of those palettes has been changed to no longer +include the corresponding system fields, those fields are added individually +depending on their definition in the table's :php:`ctrl` section: + +* The :php:`ctrl[type]` field (usually :php:`CType`) +* The :php:`colPos` field +* The :php:`ctrl[languageField]` (usually :php:`sys_language_uid`) +* The :php:`ctrl[editlock]` field (usually :php:`editlock`) +* The :php:`ctrl[enablecolumns][disabled]` field (usually :php:`hidden`) +* The :php:`ctrl[enablecolumns][starttime]` field (usually :php:`starttime`) +* The :php:`ctrl[enablecolumns][endtime]` field (usually :php:`endtime`) +* The :php:`ctrl[enablecolumns][fe_group]` field (usually :php:`fe_group`) +* The :php:`ctrl[descriptionColumn]` field (usually :php:`rowDescription`) + +By default, all custom fields - the ones still defined in :php:`showitem` - are +added after the `general` palette and are therefore added to the +:guilabel:`General` tab, unless a custom tab (e.g. :guilabel:`Plugin`, +or :guilabel:`Categories`) is defined in between. It's also possible to start +with a custom tab by defining a `--div--` as the first item in the +:php:`showitem`. In this case, the :guilabel:`General` tab will be omitted. + +All those system fields, which are added based on the :php:`ctrl` section are +also automatically removed from any custom palette and from the customized +type's :php:`showitem` definition. + +If the content element defines the :guilabel:`Extended` tab, it will be +inserted at the end, including all fields added to the type via API methods, +without specifying a position, e.g. via +:php:`ExtensionManagementUtility::addToAllTcaTypes()`. + +Impact +====== + +Creating content elements has been simplified by removing the need to +define the system fields for each element again and again. This shrinks +down a content element's :php:`showitem` to just the element specific fields. + +A usual migration will therefore look like the following: + +Before: + +.. code-block:: php + + 'slider' => [ + 'showitem' => ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;;general, + --palette--;;headers, + slider_elements, + bodytext;LLL:EXT:awesome_slider/Resources/Private/Language/locallang_ttc.xlf:bodytext.ALT.slider_description, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + ], + +After: + +.. code-block:: php + + 'slider' => [ + 'showitem' => ' + --palette--;;headers, + slider_elements, + bodytext;LLL:EXT:awesome_slider/Resources/Private/Language/locallang_ttc.xlf:bodytext.ALT.slider_description, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + ], + +Since all fields, palettes and tabs, which are defined in the :php:`showitem` +are added after the :php:`general` palette, also the :guilabel:`Categories` tab +- if defined - is displayed before the system tabs / fields. The only special +case is the :guilabel:`Extended` tab, which is always added at the end. + +.. important:: + + For consistency reasons, custom labels for system fields are no + longer preserved. + +.. index:: PHP-API, TCA, ext:core diff --git a/typo3/sysext/core/Tests/Functional/Schema/TcaSchemaTest.php b/typo3/sysext/core/Tests/Functional/Schema/TcaSchemaTest.php index 6c5aa18cfb0d..cd2837e1664b 100644 --- a/typo3/sysext/core/Tests/Functional/Schema/TcaSchemaTest.php +++ b/typo3/sysext/core/Tests/Functional/Schema/TcaSchemaTest.php @@ -69,6 +69,7 @@ final class TcaSchemaTest extends FunctionalTestCase 'space_after_class', 'sectionIndex', 'linkToTop', + 'categories', 'sys_language_uid', 'l18n_parent', 'hidden', @@ -76,7 +77,6 @@ final class TcaSchemaTest extends FunctionalTestCase 'endtime', 'fe_group', 'editlock', - 'categories', 'rowDescription', ], $usedColumns); diff --git a/typo3/sysext/core/Tests/Unit/Configuration/Tca/TcaPreparationTest.php b/typo3/sysext/core/Tests/Unit/Configuration/Tca/TcaPreparationTest.php index 42099440a0b6..895e4b59e99a 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/Tca/TcaPreparationTest.php +++ b/typo3/sysext/core/Tests/Unit/Configuration/Tca/TcaPreparationTest.php @@ -20,6 +20,7 @@ namespace TYPO3\CMS\Core\Tests\Unit\Configuration\Tca; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; use TYPO3\CMS\Core\Configuration\Tca\TcaPreparation; +use TYPO3\CMS\Core\Utility\ArrayUtility; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; final class TcaPreparationTest extends UnitTestCase @@ -814,4 +815,660 @@ final class TcaPreparationTest extends UnitTestCase $subject = (new TcaPreparation())->prepare(['foo' => ['columns' => ['relation' => ['config' => ['type' => $type, 'relationship' => 'manyToMany']]]]]); self::assertEquals(0, $subject['foo']['columns']['relation']['config']['maxitems'] ?? 0); } + + #[Test] + public function addSystemFieldsWorksForTtContentOnly(): void + { + $tca = ['foo' => $this->getTtContentTca()]; + $subject = (new TcaPreparation())->prepare($tca); + self::assertEquals($tca, $subject); + } + + #[Test] + public function addSystemFieldsWorksForTtContentWithRecordTypeFieldOnly(): void + { + $tca = ['tt_content' => $this->getTtContentTca()]; + unset($tca['tt_content']['ctrl']['type']); + $subject = (new TcaPreparation())->prepare($tca); + self::assertEquals($tca, $subject); + } + + public static function addSystemFieldsWorksForTtContentDataProvider(): iterable + { + yield 'Default behaviour' => [ + [], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'Missing general palette' => [ + [ + 'palettes' => [ + 'general' => '__UNSET', + ], + ], + ' + CType;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:CType_formlabel, + colPos;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:colPos_formlabel, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'General palette with wrong field names' => [ + [ + 'palettes' => [ + 'general' => [ + 'showitem' => ' + CType123;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:CType_formlabel, + foocolPos;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:colPos_formlabel, + ', + ], + ], + ], + ' + CType;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:CType_formlabel, + colPos;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:colPos_formlabel, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'LanguageField not set' => [ + [ + 'ctrl' => [ + 'languageField' => '__UNSET', + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'language palette defines different fields' => [ + [ + 'palettes' => [ + 'language' => [ + 'showitem' => 'some_unintended_field', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + sys_language_uid, + l18n_parent, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'unusual language field used and transOrigPointerField not set' => [ + [ + 'ctrl' => [ + 'languageField' => 'custom_language_field', + 'transOrigPointerField' => '__UNSET', + ], + 'palettes' => [ + 'language' => [ + 'showitem' => 'some_unintended_field', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + custom_language_field, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'additional fields are kept in the extended tab at the end' => [ + [ + 'types' => [ + 'header' => [ + 'showitem' => ' + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + custom_field, + --custom_field;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:custom_field_label, + ', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + custom_field, + --custom_field;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:custom_field_label + ', + ]; + yield 'category tab is ommited' => [ + [ + 'types' => [ + 'header' => [ + 'showitem' => ' + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'duplicate system fields and palettes are removed' => [ + [ + 'types' => [ + 'header' => [ + 'showitem' => ' + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + --palette--;;general, + colPos, + sys_language_uid, + + ', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'access tab and palette are added for editlock field only' => [ + [ + 'ctrl' => [ + 'enablecolumns' => '__UNSET', + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'starttime field is added only' => [ + [ + 'ctrl' => [ + 'editlock' => '__UNSET', + 'enablecolumns' => [ + 'disabled' => '__UNSET', + 'endtime' => '__UNSET', + 'fe_group' => '__UNSET', + ], + ], + 'palettes' => [ + 'access' => '__UNSET', + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + starttime, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'access tab adds hidden palette only' => [ + [ + 'ctrl' => [ + 'editlock' => '__UNSET', + 'enablecolumns' => [ + 'starttime' => '__UNSET', + 'endtime' => '__UNSET', + 'fe_group' => '__UNSET', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'notes tab is omitted' => [ + [ + 'ctrl' => [ + 'descriptionColumn' => '__UNSET', + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'custom label is removed' => [ + [ + 'types' => [ + 'header' => [ + 'showitem' => ' + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:customLabel, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + + ', + ], + ], + ], + ' + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ', + ]; + yield 'custom first tab is kept' => [ + [ + 'types' => [ + 'header' => [ + 'showitem' => ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:custom-label, + --palette--;;headers, + bodytext, + --palette--;;custom-palette + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + custom_field, + --custom_field;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:custom_field_label, + ', + ], + ], + ], + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:custom-label, + --palette--;;general, + --palette--;;headers, + bodytext, + --palette--;;custom-palette + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + custom_field, + --custom_field;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:custom_field_label + ', + ]; + yield 'custom first tab is kept and first fields are added manually' => [ + [ + 'ctrl' => [ + 'type' => 'recordType', + ], + 'types' => [ + 'header' => [ + 'showitem' => ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:custom-label, + --palette--;;headers, + bodytext, + --palette--;;custom-palette, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + custom_field, + --custom_field;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:custom_field_label, + ', + ], + ], + 'palettes' => [ + 'general' => '__UNSET', + ], + ], + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:custom-label, + recordType, + colPos;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:colPos_formlabel, + --palette--;;headers, + bodytext, + --palette--;;custom-palette, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + custom_field, + --custom_field;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:custom_field_label + ', + ]; + } + + #[DataProvider('addSystemFieldsWorksForTtContentDataProvider')] + #[Test] + public function addSystemFieldsWorksForTtContent(array $overwriteConfiguration, string $expectedShowitem): void + { + $tca = $this->getTtContentTca(); + ArrayUtility::mergeRecursiveWithOverrule($tca, $overwriteConfiguration); + + $subject = (new TcaPreparation())->prepare(['tt_content' => $tca]); + + self::assertEquals( + preg_replace('/\s/', '', $expectedShowitem), + preg_replace('/\s/', '', $subject['tt_content']['types']['header']['showitem']) + ); + } + + public static function systemFieldsAreRemovedFromCustomPalettesDataProvider(): iterable + { + yield 'duplicate system fields are removed from custom palettes' => [ + [ + 'palettes' => [ + 'custom-palette' => [ + 'showitem' => ' + colPos, + sys_language_uid, + custom-field + ', + ], + ], + ], + 'custom-field', + ]; + yield 'duplicate system fields with field label are removed from custom palettes' => [ + [ + 'palettes' => [ + 'custom-palette' => [ + 'showitem' => ' + colPos;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:colPos.label, + sys_language_uid, + custom-field + ', + ], + ], + ], + 'custom-field', + ]; + yield 'duplicate system fields with unusual field name are removed from custom palettes' => [ + [ + 'ctrl' => [ + 'type' => 'CType123', + 'languageField' => 'lang123', + ], + 'palettes' => [ + 'custom-palette' => [ + 'showitem' => ' + CType123;LLL:EXT:extension/Resources/Private/Language/locallang.xlf:ctype.label, + lang123, + custom-field + ', + ], + ], + ], + 'custom-field', + ]; + } + + #[DataProvider('systemFieldsAreRemovedFromCustomPalettesDataProvider')] + #[Test] + public function systemFieldsAreRemovedFromCustomPalettes(array $overwriteConfiguration, string $expectedPaletteShowitem): void + { + $tca = $this->getTtContentTca(); + ArrayUtility::mergeRecursiveWithOverrule($tca, $overwriteConfiguration); + + $subject = (new TcaPreparation())->prepare(['tt_content' => $tca]); + + self::assertEquals( + preg_replace('/\s/', '', $expectedPaletteShowitem), + preg_replace('/\s/', '', $subject['tt_content']['palettes']['custom-palette']['showitem']) + ); + } + + private function getTtContentTca(): array + { + return [ + 'ctrl' => [ + 'descriptionColumn' => 'rowDescription', + 'editlock' => 'editlock', + 'type' => 'CType', + 'transOrigPointerField' => 'l18n_parent', + 'languageField' => 'sys_language_uid', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + 'fe_group' => 'fe_group', + ], + ], + 'palettes' => [ + 'general' => [ + 'showitem' => ' + CType;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:CType_formlabel, + colPos;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:colPos_formlabel, + ', + ], + 'hidden' => [ + 'showitem' => ' + hidden;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:field.default.hidden + ', + ], + 'language' => [ + 'showitem' => ' + sys_language_uid,l18n_parent + ', + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel, + --linebreak--, + fe_group;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:fe_group_formlabel, + --linebreak--,editlock + ', + ], + ], + 'types' => [ + 'header' => [ + 'showitem' => ' + --palette--;;headers, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + ], + ], + ]; + } } diff --git a/typo3/sysext/frontend/Configuration/TCA/tt_content.php b/typo3/sysext/frontend/Configuration/TCA/tt_content.php index 765c3ea2925e..b07d260535e2 100644 --- a/typo3/sysext/frontend/Configuration/TCA/tt_content.php +++ b/typo3/sysext/frontend/Configuration/TCA/tt_content.php @@ -1080,27 +1080,18 @@ return [ ], 'types' => [ '1' => [ - 'showitem' => 'CType', + 'showitem' => '', ], 'bullets' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, bullets_type, bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext.ALT.bulletlist_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1116,21 +1107,12 @@ return [ 'saveAndClose' => true, ], 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.div_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1141,42 +1123,24 @@ return [ ], 'header' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'text' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1189,8 +1153,6 @@ return [ ], 'textpic' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:images, @@ -1201,15 +1163,8 @@ return [ --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1222,8 +1177,6 @@ return [ ], 'textmedia' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:media, @@ -1234,15 +1187,8 @@ return [ --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1255,8 +1201,6 @@ return [ ], 'image' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:images, image, @@ -1266,36 +1210,20 @@ return [ --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'html' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.html_formlabel, bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext.ALT.html_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1306,8 +1234,6 @@ return [ ], 'list' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:plugin, list_type;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:list_type_formlabel, @@ -1316,23 +1242,14 @@ return [ --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'subtype_value_field' => 'list_type', ], 'menu_categorized_pages' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, selected_categories, category_field, @@ -1341,15 +1258,8 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1369,8 +1279,6 @@ return [ ], 'menu_categorized_content' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, selected_categories, category_field, @@ -1379,15 +1287,8 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1407,8 +1308,6 @@ return [ ], 'menu_pages' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1416,22 +1315,13 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_subpages' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1439,44 +1329,26 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_sitemap' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_section' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1484,22 +1356,13 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_abstract' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1507,22 +1370,13 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_recently_updated' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1530,22 +1384,13 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_related_pages' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1553,22 +1398,13 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_section_pages' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1576,22 +1412,13 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'menu_sitemap_pages' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, @@ -1599,36 +1426,20 @@ return [ --palette--;;appearanceLinks, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:accessibility, --palette--;;menu_accessibility, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], 'shortcut' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.shortcut_formlabel, records;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:records_formlabel, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1639,8 +1450,6 @@ return [ ], 'table' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:field.table.bodytext, --palette--;;tableconfiguration, @@ -1649,15 +1458,8 @@ return [ --palette--;;frames, --palette--;;tablelayout, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', 'columnsOverrides' => [ @@ -1671,23 +1473,14 @@ return [ ], 'uploads' => [ 'showitem' => ' - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, - --palette--;;general, --palette--;;headers, --palette--;;uploads, --palette--;;uploadslayout, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:appearance, --palette--;;frames, --palette--;;appearanceLinks, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - --palette--;;language, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;;hidden, - --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, - rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, ', ], -- GitLab