Feature: #97449 - PSR-14 events for modifying FlexForm parsing
See forge#97449
Description
Four new PSR-14 events have been introduced which serve as a more powerful
and flexible alternative for the now removed
$GLOBALS
hooks. Corresponding docblocks describe how and when the new PSR-14 events
\TYPO3\
CMS\ Core\ Configuration\ Event\ Before Flex Form Data Structure Parsed Event \TYPO3\
CMS\ Core\ Configuration\ Event\ After Flex Form Data Structure Parsed Event \TYPO3\
CMS\ Core\ Configuration\ Event\ Before Flex Form Data Structure Identifier Initialized Event \TYPO3\
CMS\ Core\ Configuration\ Event\ After Flex Form Data Structure Identifier Initialized Event
should be used.
Example
Registration of the events in your extension's Services.
:
MyVendor\MyPackage\Backend\FlexFormParsingModifyEventListener:
tags:
- name: event.listener
identifier: 'form-framework/set-data-structure'
method: 'setDataStructure'
- name: event.listener
identifier: 'form-framework/modify-data-structure'
method: 'modifyDataStructure'
- name: event.listener
identifier: 'form-framework/set-data-structure-identifier'
method: 'setDataStructureIdentifier'
- name: event.listener
identifier: 'form-framework/modify-data-structure-identifier'
method: 'modifyDataStructureIdentifier'
The corresponding event listener class:
use TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureIdentifierInitializedEvent;
use TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureParsedEvent;
use TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureIdentifierInitializedEvent;
use TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureParsedEvent;
final class FlexFormParsingModifyEventListener
{
public function setDataStructure(BeforeFlexFormDataStructureParsedEvent $event): void
{
$identifier = $event->getIdentifier();
if (($identifier['type'] ?? '') === 'my_custom_type') {
$event->setDataStructure('FILE:EXT:myext/Configuration/FlexForms/MyFlexform.xml');
}
}
public function modifyDataStructure(AfterFlexFormDataStructureParsedEvent $event): void
{
$identifier = $event->getIdentifier();
if (($identifier['type'] ?? '') === 'my_custom_type') {
$parsedDataStructure = $event->getDataStructure();
$parsedDataStructure['sheets']['sDEF']['ROOT']['TCEforms']['sheetTitle'] = 'Some dynamic custom sheet title';
$event->setDataStructure($parsedDataStructure);
}
}
public function setDataStructureIdentifier(BeforeFlexFormDataStructureIdentifierInitializedEvent $event): void
{
if ($event->getTableName() === 'tx_myext_sometable') {
$event->setIdentifier([
'type' => 'my_custom_type',
]);
}
}
public function modifyDataStructureIdentifier(AfterFlexFormDataStructureIdentifierInitializedEvent $event): void
{
$identifier = $event->getIdentifier();
if (($identifier['type'] ?? '') !== 'my_custom_type') {
$identifier['type'] = 'my_custom_type';
}
$event->setIdentifier($identifier);
}
}
Available Methods
The list below describes all available methods for
Before
:
Method | Parameters | Description |
---|---|---|
getIdentifier() | Returns the resolved data structure identifier. | |
setDataStructure() |
$data | Allows to either set an already parsed data
structure as
array , a file reference or the
XML structure as
string . Setting a data
structure will immediately stop propagation. |
getDataStructure() | Returns the current data structure, which will
always be
null for listeners, since the
event propagation is stopped as soon as a listener
sets a data structure. | |
isPropagationStopped() | Returns whether propagation has been stopped. |
Note
Using the now-removed hook method
parse
previously required
implementations to always return an
array
or
string
. This means, implementations returned
an empty
array
or empty
string
in case they did not want to set a data structure, allowing
further implementations to be called. This has now changed. As soon as a listener sets a data structure
using the
set
method, the event propagation is stopped immediately and no further
listeners are being called. Therefore, listeners should avoid setting an empty
array
or an empty
string
, but should just "return" without any change to the
$event
object in such a case.
The list below describes all available methods for
After
:
Method | Parameters | Description |
---|---|---|
getIdentifier() | Returns the resolved data structure identifier. | |
setDataStructure() |
$data | Allows to modify or completely replace the parsed data structure. |
getDataStructure() | Returns the current data structure, which has been
processed and parsed by the
Flex
component. Might contain additional data from
previously called listeners. |
The list below describes all available methods for
Before
:
Method | Parameters | Description |
---|---|---|
getFieldTca() | Returns the full TCA of the currently handled
field, having type=flex set. | |
getTableName() | Returns the table name of the TCA field. | |
getFieldName() | Returns the TCA field name. | |
getRow() | Returns the whole database row of the record. | |
setIdentifier() |
$identifier | Allows to define the data structure identifier for the TCA field. Setting an identifier will immediately stop propagation. |
getIdentifier() | Returns the current data structure identifier,
which will always be
null for listeners,
since the event propagation is stopped as soon
as a listener defines an identifier. | |
isPropagationStopped() | Returns whether propagation has been stopped. |
Note
Using the now removed hook method
get
previously required
implementations to always return an
array
. This means, implementations returned an empty
array
in case they did not want to set an identifier, allowing further implementations to be
called. This has now changed. As soon as a listener sets the identifier using the
set
method, the event propagation is stopped immediately and no further listeners are being called.
Therefore, listeners should avoid setting an empty
array
, but should just "return" without
any change to the
$event
object in such a case.
The list below describes all available methods for
After
:
Method | Parameters | Description |
---|---|---|
getFieldTca() | Returns the full TCA of the currently handled
field, having type=flex set. | |
getTableName() | Returns the table name of the TCA field. | |
getFieldName() | Returns the TCA field name. | |
getRow() | Returns the whole database row of the record. | |
setIdentifier() |
$identifier | Allows to modify or completely replace the initialized data structure identifier. |
getIdentifier() | Returns the initialized data structure identifier,
which has either been defined by an event listener
or set to the default by the
Flex
component. |
Impact
It's now possible to fully control the FlexForm parsing using an object oriented approach with four new PSR-14 events.