[PHP] FlexForm einer Extension komplett ersetzen

[PHP] FlexForm einer Extension komplett ersetzen

TYPO3 Entwickler benötigen von Zeit zu Zeit neue Felder in den FlexForm-Einstellungen anderer Erweiterungen (wie z.B. News, Powermail oder tt_address). Nachfolgende Snippets zeigen euch, wie ihr ein FlexForm komplett oder teilweise ersetzen könnt am Beispiel der Extensions tt_address und in2studyfinder.

Artikel am 26. Februar 2025 überarbeitet

TYPO3 12 oder neuer

Seit TYPO3 12 kann man ein Event nutzen um das FlexForm in TYPO3 komplett zu überschreiben oder auch nur einzelne Teile zu ergänzen.

Der zu nutzende EventListener muss in der Services.yaml registriert werden:

services: In2code\In2template\EventListener\ModifyTtAddressFlexForm: tags: - name: event.listener event: TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureParsedEvent

So können dann vorhandene Felder modifiziert (oder das FlexForm komplett überschrieben werden):

<?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'; } }

 

Man könnte das Array entweder direkt im EventListener konfigurieren oder alternativ eine FlexForm-Datei angeben, die dann Teile des originalen FlexForm überschreiben (beispielhaft unter 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 oder älter

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>

TYPO3: Unbenutzte Dateien im fileadmin finden

Ihr wollt unbenutzte oder verwaiste Dateien im fileadmin oder einer anderen Storage löschen? Leider gibt es hier nichts direkt vom Core. Aber ein kleiner Command in eurem Sitepackage hilft schnell...

Zum Beitrag

TYPO3: Redakteure mit individuellen user_upload Folder

Vielleicht kennt ihr die Kundenanforderung? Redakteure sollen Videos über den Button "Add media by URL" hinzufügen können. Aber die Dateien sollen sich dann nicht in fileadmin/user_upload/ sondern in...

Zum Beitrag

TYPO3: Seiten im Mixed Mode finden

Mixed Mode bezeichnet man in TYPO3 übersetzte Seiten, auf denen sich Seiteninhalte befinden, die nur zum Teil eine Relation auf entsprechende Seiteninhalte in der Hauptsprache haben. Dies wird im...

Zum Beitrag

Extbase Extensions: An Erweiterbarkeit denken mit data, site und language

Heute mal eine kleine Bitte an die TYPO3-Extension-Autoren da draußen: Achtet auf Erweiterbarkeit eurer Extensions. Dies fördert dann auch die Verbreitung der entsprechenden Plugins.

Zum Beitrag

SQL: Zeige alle Tabellen absteigend nach Größe sortiert

Ich brauche in letzter Zeit häufiger den SQL-Befehl, um herauszufinden, welche Tabellen in der TYPO3-Datenbank am größten sind. Ich habe das Snippet einmal veröffentlicht.

Zum Beitrag

TYPO3 12 mit CKEditor 5: Stile als Einfachauswahl

Wenn man im RTE in TYPO3 einen Link setzt, kann es sein, dass man zwischen verschiedenen Link-Klassen auswählen muss, um beispielsweise Buttons im Frontend zu erzeugen. Neu ist in TYPO3 12 dass man...

Zum Beitrag