diff --git a/typo3/sysext/core/Classes/Configuration/Tca/TcaPreparation.php b/typo3/sysext/core/Classes/Configuration/Tca/TcaPreparation.php index 9e477bad0a2f94514a3dbdf7fd34240fc6a071e9..d7c9a355cca835ed63366bd44fda2f42789284a2 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 0000000000000000000000000000000000000000..b80d94830a43518848ff673b84e803a47e3dcfb4 --- /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 6c5aa18cfb0d1dc00b0329deccdb8cd4e3888292..cd2837e1664b71d46e4f29e24ae054a73cf24d42 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 42099440a0b66bc7226dea923713f0da2efb80ee..895e4b59e99a25f0c58d5ff72bc0239343e46498 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 765c3ea2925ee083ba889e83793249f234aa62a9..b07d260535e2108c32dda1d4af58e80db1c11518 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, ', ],