VITEC headless v14: 5-bug fix unifies plugin renderers + cleanup

Resolves a cascade of TYPO3 v14 breaking changes that left every VITEC
plugin's JSON output silently empty:

1. `list_type` column dropped — all renderer page-discovery queries now
   filter by `CType = 'vitec_X'`.
2. `#[AsAllowedCallable]` attribute added to every public render() —
   without it v14 throws AllowedCallableException, which headless
   silently filters via its "Oops, an error occurred!" guard.
3. `$GLOBALS['TSFE']->id` is null inside JSON cObj context — page id
   now read from the `frontend.page.information` request attribute
   (TSFE fallback kept for legacy entry points).
4. page.tsconfig wizard items migrated to `CType = vitec_X` directly
   (legacy `CType=list, list_type=...` no longer exists in v14).
5. ContainerChildrenProcessor + ContentElementResolver dispatch the
   PLUGIN_RENDERERS map by CType (primary) with list_type fallback.

Beyond the bug fix this commit also contains:
- Datasheets renderer rewritten to "products with newest datasheet"
  semantics (filtered via Download.hideondatasheets).
- New vitec/card content block — multi-purpose card with backend
  preview and layout/background/aspect/alignment/border/shadow options.
- New vitec_container CType (b13 single-column container, FlexForm
  cssClass propagated into the JSON envelope).
- ContentElementResolver service for contentelement/contentelementcta
  link resolution; ContainerChildrenProcessor for nested plugin
  resolution inside b13 containers.
- Vitecset setup.typoscript: ContentElement import moved to top so
  lib.contentElement is defined before VITEC's tt_content blocks.
- Cleanup: 98 .bak.<timestamp> debugging backups removed; *.bak.* and
  /public/_assets_install/ added to .gitignore.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
o-rascheandClaude Opus 4.7 committed 2026-06-15 14:29:17 +02:00
1 parent 64ea55d29d
commit 3aaf8fdad5
98 files changed
+5650 -10154

No files matched your search

View File
File mode changed.
@@ -1,120 +1,53 @@
<?php
declare(strict_types=1);
defined('TYPO3') or die();
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
// Register the Simple Card plugin
$simplecardPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Simplecard',
'Simple Card'
);
(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
);
};
// Register the "Single Success Story" plugin
$usecaseShowPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Usecaseshow',
'Single Success Story'
);
$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');
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$usecaseShowPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$usecaseShowPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Usecase.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;
// Register the "Show Single Market" plugin
$marketShowPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Marketshow',
'Show Single Market'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$marketShowPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$marketShowPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Market.xml'
);
// Register the "Show Single Solution" plugin
$solutionShowPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Solutionshow',
'Show Single Solution'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$solutionShowPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$solutionShowPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Solution.xml'
);
// Register the "Show Products by Category" plugin
$productListPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Productlist',
'Show Products by Category'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$productListPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$productListPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Productlist.xml'
);
// Register the "Show Single Product" plugin
$productShowPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Productshow',
'Show Single Product'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$productShowPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$productShowPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Productshow.xml'
);
// Register the "Shows List of all Success Stories" plugin
$usecaseListPluginSignature = \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Vitec',
'Usecaselist',
'Shows List of all Success Stories'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$usecaseListPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$usecaseListPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Usecaselist.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$simplecardPluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$simplecardPluginSignature,
'FILE:EXT:vitec/Configuration/FlexForms/Simplecard.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist']['vitec_datasheets'] = 'recursive,select_key,pages';
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['vitec_datasheets'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'vitec_datasheets',
'FILE:EXT:vitec/Configuration/FlexForms/Datasheets.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'],
]
);
// 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'],
]
);
})();
@@ -47,7 +47,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
--palette--;;hidden,
--palette--;;access';
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_25_25_25_25 {
iconIdentifier = vitec-cols-25-25-25-25
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cols_25_25_25_25.title
@@ -56,5 +56,5 @@ mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_25_25_25_25
CType = vitec_cols_25_25_25_25
}
}
TSCONFIG);
TSCONFIG;
})();
+2 -2
View File
@@ -46,7 +46,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
--palette--;;hidden,
--palette--;;access';
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_33_33_33 {
iconIdentifier = vitec-cols-33-33-33
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cols_33_33_33.title
@@ -55,5 +55,5 @@ mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_33_33_33 {
CType = vitec_cols_33_33_33
}
}
TSCONFIG);
TSCONFIG;
})();
+2 -2
View File
@@ -45,7 +45,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
--palette--;;hidden,
--palette--;;access';
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_33_66 {
iconIdentifier = vitec-cols-33-66
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cols_33_66.title
@@ -54,5 +54,5 @@ mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_33_66 {
CType = vitec_cols_33_66
}
}
TSCONFIG);
TSCONFIG;
})();
+2 -2
View File
@@ -45,7 +45,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
--palette--;;hidden,
--palette--;;access';
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_50_50 {
iconIdentifier = vitec-cols-50-50
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cols_50_50.title
@@ -54,5 +54,5 @@ mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_50_50 {
CType = vitec_cols_50_50
}
}
TSCONFIG);
TSCONFIG;
})();
+2 -2
View File
@@ -45,7 +45,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
--palette--;;hidden,
--palette--;;access';
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_66_33 {
iconIdentifier = vitec-cols-66-33
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cols_66_33.title
@@ -54,5 +54,5 @@ mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_cols_66_33 {
CType = vitec_cols_66_33
}
}
TSCONFIG);
TSCONFIG;
})();
+2 -2
View File
@@ -56,7 +56,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
'vitec_container'
);
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_container {
iconIdentifier = vitec-container
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:container.title
@@ -65,5 +65,5 @@ mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_container {
CType = vitec_container
}
}
TSCONFIG);
TSCONFIG;
})();
@@ -1,64 +0,0 @@
<?php
declare(strict_types=1);
defined('TYPO3') or die();
use B13\Container\Tca\ContainerConfiguration;
use B13\Container\Tca\Registry;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
(static function (): void {
$l = 'LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:';
/** @var Registry $registry */
$registry = GeneralUtility::makeInstance(Registry::class);
$registry->configureContainer(
(new ContainerConfiguration(
'vitec_container',
$l . 'container.title',
$l . 'container.description',
[
[
['name' => $l . 'container.column', 'colPos' => 220],
],
]
))
->setIcon('EXT:vitec/Resources/Public/Icons/vitec-container.svg')
->setGroup('vitec')
->setSaveAndCloseInNewContentElementWizard(true)
);
$GLOBALS['TCA']['tt_content']['types']['vitec_container']['showitem'] =
'--palette--;;general,
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
tx_vitec_bg_variant,
pi_flexform,
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.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';
// Bind the Container FlexForm to this CType.
// Core tt_content.pi_flexform uses ds_pointerField = 'list_type,CType',
// so the CType value is a valid data-structure key.
$GLOBALS['TCA']['tt_content']['columns']['pi_flexform']['config']['ds']['vitec_container'] =
'FILE:EXT:vitec/Configuration/FlexForms/Container.xml';
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
mod.wizards.newContentElement.wizardItems.vitec.elements.vitec_container {
iconIdentifier = vitec-container
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:container.title
description = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:container.description
tt_content_defValues {
CType = vitec_container
}
}
TSCONFIG);
})();
+2 -2
View File
@@ -28,10 +28,10 @@ use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
]);
// Register VITEC wizard group header
ExtensionManagementUtility::addPageTSConfig(<<<TSCONFIG
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
mod.wizards.newContentElement.wizardItems.vitec {
header = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:group.header
show = *
}
TSCONFIG);
TSCONFIG;
})();