Article revised on February 26, 2025
TYPO3 12 or newer
Since TYPO3 12 you can use an event to completely overwrite the FlexForm in TYPO3 or just add individual parts.
The EventListener to be used must be registered in the Services.yaml:
services:
In2code\In2template\EventListener\ModifyTtAddressFlexForm:
tags:
- name: event.listener
event: TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureParsedEvent Existing fields can then be modified (or the FlexForm completely overwritten):
<?php
declare(strict_types=1);
namespace In2code\In2template\EventListener;
use TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureParsedEvent;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
final class ModifyTtAddressFlexForm
{
private string $flexFormFile = 'EXT:in2template/Configuration/FlexForm/Extend/TtAddress.xml';
public function __invoke(AfterFlexFormDataStructureParsedEvent $event): void
{
$dataStructure = $event->getDataStructure();
if ($this->isTtAddressPlugin($event->getIdentifier())) {
$configurationNew = file_get_contents(GeneralUtility::getFileAbsFileName($this->flexFormFile));
if ($configurationNew !== false) {
ArrayUtility::mergeRecursiveWithOverrule($dataStructure, GeneralUtility::xml2array($configurationNew));
}
}
$event->setDataStructure($dataStructure);
}
private function isTtAddressPlugin(array $identifier): bool
{
return $identifier['type'] === 'tca'
&& $identifier['tableName'] === 'tt_content'
&& $identifier['dataStructureKey'] === 'ttaddress_listview,list';
}
} You could either configure the array directly in the EventListener or alternatively specify a FlexForm file that then overwrites parts of the original FlexForm (for example under EXT:in2template/Configuration/FlexForm/Extend/TtAddress.xml):
<T3DataStructure>
<sheets>
<sDISPLAY>
<ROOT>
<el>
<settings.displayMode>
<onChange>reload</onChange>
</settings.displayMode>
<settings.backgroundColor>
<displayCond>FIELD:settings.displayMode:=:banner</displayCond>
<exclude>1</exclude>
<label>LLL:EXT:in2template/Resources/Private/Language/Backend/locallang.xlf:tt_content.in2template_background.label</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<itemsProcFunc>In2code\In2template\Tca\ColorOptions->addOptions</itemsProcFunc>
</config>
</settings.backgroundColor>
</el>
</ROOT>
</sDISPLAY>
</sheets>
</T3DataStructure> TYPO3 11 or older
ext_localconf.php eurer Extension (z.B. Sitepackage):
<?php
defined('TYPO3_MODE') || die();
call_user_func(
function () {
/**
* Overwrite FlexForm with a new one
*/
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp'][] =
\Vendor\YourSitepackage\Hooks\OverwriteFlexForm::class . '->overwrite';
}
); OverwriteFlexForm.php:
<?php
declare(strict_types=1);
namespace Vendor\YourSitepackage\Hooks;
/**
* Class OverwriteFlexForm
*/
class OverwriteFlexForm
{
/**
* @var string
*/
protected $path = 'FILE:EXT:your_sitepackage/Configuration/FlexForms/FlexformStudyfinderList.xml';
/**
* @return void
*/
public function overwrite()
{
$GLOBALS['TCA']['tt_content']['columns']['pi_flexform']['config']['ds']['in2studyfinder_pi1,list']
= $this->path;
}
} FlexformStudyfinderList.xml:
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<main>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:in2studyfinder/Resources/Private/Language/locallang_db.xlf:listView</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.flexform.studyCourseDetailPage>
<TCEforms>
<exclude>1</exclude>
<label>LLL:EXT:in2studyfinder/Resources/Private/Language/locallang_db.xlf:detailView</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>pages</allowed>
<size>1</size>
<maxitems>1</maxitems>
<minitems>1</minitems>
<show_thumbs>1</show_thumbs>
<wizards>
<suggest>
<type>suggest</type>
</suggest>
</wizards>
</config>
</TCEforms>
</settings.flexform.studyCourseDetailPage>
<settings.flexform.select.department>
<TCEforms>
<label>LLL:EXT:in2studyfinder/Resources/Private/Language/locallang_db.xlf:department</label>
<config>
<type>select</type>
<renderType>selectCheckBox</renderType>
<maxitems>9999</maxitems>
<size>5</size>
<minitems>0</minitems>
<foreign_table>tx_in2studyfinder_domain_model_department</foreign_table>
<foreign_table_where>and tx_in2studyfinder_domain_model_department.sys_language_uid in (-1,0) order by tx_in2studyfinder_domain_model_department.title</foreign_table_where>
</config>
</TCEforms>
</settings.flexform.select.department>
<settings.flexform.select.graduation>
<TCEforms>
<label>LLL:EXT:in2studyfinder/Resources/Private/Language/locallang_db.xlf:academicDegree</label>
<config>
<type>select</type>
<renderType>selectCheckBox</renderType>
<maxitems>9999</maxitems>
<size>5</size>
<minitems>0</minitems>
<foreign_table>tx_in2studyfinder_domain_model_graduation</foreign_table>
<foreign_table_where>and tx_in2studyfinder_domain_model_graduation.sys_language_uid in (-1,0) order by tx_in2studyfinder_domain_model_graduation.title</foreign_table_where>
</config>
</TCEforms>
</settings.flexform.select.graduation>
<settings.flexform.bodytext>
<TCEforms>
<label>LLL:EXT:in2studyfinder_extend/Resources/Private/Language/locallang_db.xlf:flexform.bodytext</label>
<config>
<type>text</type>
<default></default>
<enableRichtext>1</enableRichtext>
<richtextConfiguration>default</richtextConfiguration>
</config>
<defaultExtras>richtext[]:rte_transform[mode=ts_css]</defaultExtras>
</TCEforms>
</settings.flexform.bodytext>
</el>
</ROOT>
</main>
</sheets>
</T3DataStructure>




