Files
VITEC-website/packages/vitec/Configuration/TCA/Overrides/tt_content.php
2026-08-13 12:49:10 +02:00

205 lines
9.6 KiB
PHP

<?php
declare(strict_types=1);
defined('TYPO3') or die();
use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
(static function (): void {
$registerPluginWithFlexForm = static function (
string $pluginName,
string $pluginTitle,
string $flexFormFile,
?string $iconIdentifier = null
): void {
ExtensionUtility::registerPlugin(
'Vitec',
$pluginName,
$pluginTitle,
$iconIdentifier ?? 'content-plugin',
'plugins',
'',
$flexFormFile
);
};
$registerPluginWithFlexForm('Productlist', 'Show Products by Category', 'FILE:EXT:vitec/Configuration/FlexForms/Productlist.xml', 'vitec-plugin-productlist');
$registerPluginWithFlexForm('Simplecard', 'Simple Card', 'FILE:EXT:vitec/Configuration/FlexForms/Simplecard.xml', 'vitec-plugin-simplecard');
$registerPluginWithFlexForm('Productshow', 'Show Single Product', 'FILE:EXT:vitec/Configuration/FlexForms/Productshow.xml', 'vitec-plugin-productshow');
$registerPluginWithFlexForm('Usecaseshow', 'Single Success Story', 'FILE:EXT:vitec/Configuration/FlexForms/Usecase.xml', 'vitec-plugin-usecaseshow');
$registerPluginWithFlexForm('Marketshow', 'Show Single Market', 'FILE:EXT:vitec/Configuration/FlexForms/Market.xml', 'vitec-plugin-marketshow');
$registerPluginWithFlexForm('Solutionshow', 'Show Single Solution', 'FILE:EXT:vitec/Configuration/FlexForms/Solution.xml', 'vitec-plugin-solutionshow');
$registerPluginWithFlexForm('Usecaselist', 'Shows List of all Success Stories', 'FILE:EXT:vitec/Configuration/FlexForms/Usecaselist.xml', 'vitec-plugin-usecaselist');
$registerPluginWithFlexForm('Downloadcard', 'Download Card', 'FILE:EXT:vitec/Configuration/FlexForms/Downloadcard.xml', 'vitec-plugin-downloadcard');
$registerPluginWithFlexForm('Downloadcardcollection', 'Download Card Collection', 'FILE:EXT:vitec/Configuration/FlexForms/Downloadcardcollection.xml', 'vitec-plugin-downloadcardcollection');
$registerPluginWithFlexForm('Datasheets', 'Datasheets', 'FILE:EXT:vitec/Configuration/FlexForms/Datasheets.xml');
$registerPluginWithFlexForm('Eventlist', 'Event List', 'FILE:EXT:vitec/Configuration/FlexForms/Eventlist.xml', 'vitec-plugin-eventlist');
// Locations: lives in the "VITEC" wizard group, titled "VITEC Locations".
$GLOBALS['TCA']['tt_content']['columns']['CType']['config']['itemGroups']['vitec']
= 'LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:group.header';
// VITEC Forms — own wizard tab for the three form plugins.
$GLOBALS['TCA']['tt_content']['columns']['CType']['config']['itemGroups']['vitec_forms']
= 'VITEC Forms';
ExtensionUtility::registerPlugin(
'Vitec',
'Contactform',
'VITEC Contact Form',
'vitec-plugin-contactform',
'vitec_forms',
'Contact form — email or Salesforce delivery.',
'FILE:EXT:vitec/Configuration/FlexForms/Contactform.xml'
);
ExtensionUtility::registerPlugin(
'Vitec',
'Demoform',
'VITEC Request Demo',
'vitec-plugin-demoform',
'vitec_forms',
'Demo request form — email or Salesforce delivery.',
'FILE:EXT:vitec/Configuration/FlexForms/Demoform.xml'
);
ExtensionUtility::registerPlugin(
'Vitec',
'Helpdeskform',
'VITEC HelpDesk Access',
'vitec-plugin-helpdeskform',
'vitec_forms',
'Request access to the online helpdesk — email or Salesforce delivery.',
'FILE:EXT:vitec/Configuration/FlexForms/Helpdeskform.xml'
);
ExtensionUtility::registerPlugin(
'Vitec',
'Modelcard',
'VITEC Card',
'vitec-plugin-modelcard',
'vitec',
'One card for a Product, Success Story, Market or Solution — all data from the model.',
'FILE:EXT:vitec/Configuration/FlexForms/Modelcard.xml'
);
$GLOBALS['TCA']['tt_content']['types']['vitec_modelcard']['previewRenderer']
= \Evomedien\Vitec\Preview\ModelcardPreviewRenderer::class;
ExtensionUtility::registerPlugin(
'Vitec',
'Customerlogos',
'VITEC Customer Logos',
'vitec-plugin-customerlogos',
'vitec',
'Customer logos in list, grid, carousel or marquee layout.',
'FILE:EXT:vitec/Configuration/FlexForms/Customerlogos.xml'
);
ExtensionUtility::registerPlugin(
'Vitec',
'Locationlist',
'VITEC Locations',
'vitec-plugin-locationlist',
'vitec',
'Locations as grid, list or interactive map.',
'FILE:EXT:vitec/Configuration/FlexForms/Locationlist.xml'
);
ExtensionUtility::registerPlugin(
'Vitec',
'Marketlist',
'VITEC Market List',
'vitec-plugin-marketlist',
'vitec',
'All markets as grid, list or carousel.',
'FILE:EXT:vitec/Configuration/FlexForms/Marketlist.xml'
);
// Change frame_class to allow multiple selections.
$GLOBALS['TCA']['tt_content']['columns']['frame_class']['config']['renderType'] = 'selectCheckBox';
$GLOBALS['TCA']['tt_content']['columns']['frame_class']['config']['maxitems'] = 999;
// Add custom frame_class options for Vitec.
$GLOBALS['TCA']['tt_content']['columns']['frame_class']['config']['items'] = array_merge(
$GLOBALS['TCA']['tt_content']['columns']['frame_class']['config']['items'],
[
['label' => 'Vitec: Full Width', 'value' => 'vitec-full-width'],
['label' => 'Vitec: Centered Container', 'value' => 'vitec-centered'],
['label' => 'Vitec: Card Style', 'value' => 'vitec-card'],
['label' => 'Vitec: Dark Background', 'value' => 'vitec-dark'],
['label' => 'Vitec: Highlight Box', 'value' => 'vitec-highlight'],
// Background variants, ordered light to dark. Mutually exclusive by
// intent, but frame_class is a multi-select here (selectCheckBox,
// see above) and stays that way on purpose -- a restriction would
// have to be built for every other class too. If an editor ticks two
// backgrounds, both end up comma-separated in the JSON `frameClass`
// and the frontend decides which one wins.
//
// `vitec-bg-graphite`, `-blue` and `-midnight` were already styled in
// the frontend bundle but had no backend option; `-white` and
// `-light-grey` still need their CSS.
//
// The older 'Vitec: Dark Background' (vitec-dark) above stays as it
// is: existing content depends on it, and it is the most heavily
// styled class of them all.
['label' => 'Vitec: White Background', 'value' => 'vitec-bg-white'],
['label' => 'Vitec: Light-Grey Background', 'value' => 'vitec-bg-light-grey'],
['label' => 'Vitec: VITEC-Graphite Background', 'value' => 'vitec-bg-graphite'],
['label' => 'Vitec: VITEC-Blue Background', 'value' => 'vitec-bg-blue'],
['label' => 'Vitec: VITEC-Midnight Background', 'value' => 'vitec-bg-midnight'],
]
);
// Inline parent pointer: content elements owned by a Success Story record.
$GLOBALS['TCA']['tt_content']['columns']['tx_vitec_usecase_content'] = [
'config' => ['type' => 'passthrough'],
];
// The standard TYPO3 "Appearance" tab for the Content Blocks elements.
//
// Content Blocks builds each element's showitem itself
// (TcaGenerator::getContentElementStandardShowItem) and appends only the
// "Extended" tab -- Appearance is never part of it. The Extbase plugins are
// unaffected: ExtensionManagementUtility::addPlugin() seeds their type from
// tt_content types['header'], which carries the tab already.
//
// Until now that meant an editor could not reach layout, frame_class
// (including the Vitec classes registered above), spaceBefore/spaceAfter,
// sectionIndex or linkToTop on a Content Block at all.
//
// Deliberately NOT declared as a palette in every config.yaml: palettes live
// in TCA under a global identifier, so a second definition of `frames` would
// collide with the Core one -- the same trap that took the page module down
// on 2026-08-10. Pointing at the Core palettes keeps a single definition.
//
// This file runs after Content Blocks, which generates its TCA on
// BeforeTcaOverridesEvent.
$appearanceTab = '--div--;core.form.tabs:appearance,'
. '--palette--;;frames,'
. '--palette--;;appearanceLinks';
$extendedTab = '--div--;core.form.tabs:extended';
foreach ($GLOBALS['TCA']['tt_content']['types'] as $cType => &$typeConfig) {
// Own elements only, and only those still missing the tab -- that skips
// the plugins and makes a repeated run a no-op.
if (!str_starts_with((string)$cType, 'vitec_')
|| !isset($typeConfig['showitem'])
|| str_contains($typeConfig['showitem'], '--palette--;;frames')
) {
continue;
}
// Content Blocks puts "Extended" last, so Appearance goes in front of it
// and the tab order matches the Core content elements. Should a future
// version drop that marker, append rather than silently do nothing.
if (str_contains($typeConfig['showitem'], $extendedTab)) {
$typeConfig['showitem'] = str_replace(
$extendedTab,
$appearanceTab . ',' . $extendedTab,
$typeConfig['showitem']
);
} else {
$typeConfig['showitem'] = rtrim($typeConfig['showitem'], ", \t\n\r") . ',' . $appearanceTab;
}
}
unset($typeConfig);
})();