Feature: #107047 - FlexForm enhancements: Direct plugin registration and raw TCA support
See forge#107047
FlexForm direct plugin registration
The methods
\TYPO3\
and
\TYPO3\ have been
extended to accept a FlexForm definition directly via an additional
$flex
argument.
This new argument allows extensions to provide the FlexForm data structure when
registering a plugin. The FlexForm can either be a reference to a FlexForm
XML file (for example, FILE:) or
the XML content itself.
This simplifies configuration and avoids the need to define the FlexForm separately in TCA.
Examples
Direct FlexForm plugin registration
ExtensionUtility::registerPlugin(
'MyExtension',
'MyPlugin',
'My Plugin Title',
'my-extension-icon',
'plugins',
'Plugin description',
'FILE:EXT:my_extension/Configuration/FlexForm.xml'
);
Alternatively, using
add when not using Extbase:
ExtensionManagementUtility::addPlugin(
[
'My Plugin Title',
'my_plugin',
'my-extension-icon'
],
'FILE:EXT:my_extension/Configuration/FlexForm.xml'
);
Internally, this adds the FlexForm definition to the ds option of the plugin
via the
columns configuration and also adds the pi_
field to the showitem list. For more information, see
Breaking: #107047 - Remove pointer field functionality of TCA flex, which describes the migration of the ds
option from multi-entry to single-entry.
FlexFormTools schema parameter requirement
The service
Flex
has been refactored to remove its dependency on
$GLOBALS, which caused
architectural issues.
The following methods now support an explicit
$schema parameter that accepts
either a
Tca object or a raw TCA
configuration array:
getData Structure Identifier () parseData Structure By Identifier () cleanFlex Form XML ()
Previously, these methods had no schema parameter and relied on
$GLOBALS internally, which was problematic during schema building.
Calling code must now explicitly provide schema data, either as:
- A resolved
Tcaobject (for normal usage)Schema - A raw TCA configuration array (for schema building contexts)
This architectural improvement eliminates circular dependencies and allows
Flex to be used
during schema building processes where TCA Schema
objects are not yet available, resolving issues in components such as the
Relation.
FlexFormTools with TCA Schema
use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
use TYPO3\CMS\Core\Utility\GeneralUtility;
$flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
// Using TCA Schema object
$tcaSchema = $tcaSchemaFactory->get('tt_content');
$identifier = $flexFormTools->getDataStructureIdentifier(
$fieldTca,
'tt_content',
'pi_flexform',
$row,
$tcaSchema
);
FlexFormTools with raw TCA array
use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
use TYPO3\CMS\Core\Utility\GeneralUtility;
$flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
// Using raw TCA configuration array
$rawTca = $fullTca['tt_content'];
$identifier = $flexFormTools->getDataStructureIdentifier(
$fieldTca,
'tt_content',
'pi_flexform',
$row,
$rawTca
);
Schema building context
use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
use TYPO3\CMS\Core\Utility\GeneralUtility;
// In RelationMapBuilder - previously not possible
$flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
foreach ($tca as $table => $tableConfig) {
foreach ($tableConfig['columns'] ?? [] as $fieldName => $fieldConfig) {
if ($fieldConfig['config']['type'] === 'flex') {
// Can now use raw TCA during schema building
$dataStructure = $flexFormTools->parseDataStructureByIdentifier(
$identifier,
$tableConfig // Raw TCA array
);
}
}
}
Impact
Direct FlexForm plugin registration
This enhancement simplifies plugin configuration and FlexForm integration, as
FlexForms can now be registered directly with the plugin. The call
Extension is no longer required.
This method has been deprecated; see Deprecation: #107047 - ExtensionManagementUtility::addPiFlexFormValue().
FlexFormTools schema support
The service now automatically detects the input type and uses the appropriate
resolution strategy for both TCA Schema objects and raw TCA arrays. It no longer
relies on
$GLOBALS, allowing direct control over the service and
making it usable during schema building where no TCA Schema is available.
Technical details
The service uses PHP union types (
array) and automatically routes
to the appropriate internal methods. Both input types produce identical normalized
output, ensuring consistent data structures for all
Flex consumers.