Extbase: Verwendeter Controller & Action per Flexform konfigurierbar machen
Momentan beschäftige ich mich eingehender mit der in Typo3 4.3 gestarteten MVC Erweiterung ExtBase. Gerade weil der neue Weg Extensions in Typo3 zu schreiben noch so frisch ist, sind die Dokumentationen und Beispiele im Internet noch ziemlich dünn gesät.
Beispielsweise habe ich kein vollständiges Tutorial gefunden wie man die verwendete Standard-ExtBase–Action im Backend per FlexForms konfigurierbar macht. Genau darum soll es hier nun gehen.
1. Schritt XML-Datei anlegen und einbinden
Die FelexForm XML Datei wird im Verzeichnis Configuration -> Flexform im Extension Verzeichnis angelegt.
Eingebunden wird die Konfiguration in der ext_tables.php:
- $extensionName = t3lib_div::underscoredToUpperCamelCase($_EXTKEY);
- $TCA['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
- t3lib_extMgm::addPiFlexFormValue($pluginSignature, 'FILE:EXT:'.$_EXTKEY.'/Configuration/FlexForms/ControllerActions.xml');
2. Schritt FlexForm Konfiguration
- <T3DataStructure>
- <sheets>
- <sDEF>
- <ROOT>
- <TCEforms>
- <sheetTitle>Verhalten</sheetTitle>
- </TCEforms>
- <type>array</type>
- <el>
- <switchableControllerActions>
- <TCEforms>
- <label>Standardaktion des Plugins</label>
- <config>
- <type>select</type>
- <items>
- <numIndex index="0">
- <numIndex index="0">Listenansicht</numIndex>
- <numIndex index="1">MyController->list</numIndex>
- </numIndex>
- <numIndex index="1">
- <numIndex index="0">Einzelansicht</numIndex>
- <numIndex index="1">MyController->show;MyController->edit;MyController->update</numIndex>
- </numIndex>
- </items>
- </config>
- </TCEforms>
- </switchableControllerActions>
- </el>
- </ROOT>
- </sDEF>
- </sheets>
- </T3DataStructure>
Das Ergebnis ist eine Dropdownbox zur Einfachen Auswahl der Controller-Action Kombination.
Die Definition der Kombinationen (Zeile 18,19) lassen sich beliebig nach dem Schema erweitern.
Achtung: Es können nur Actions aufgerufen werden, die in der Felxform konfiguriert sind. Um alle Actions eines Controllers aufrufen zu können, müssen diese mit Semikolon separiert aufgeführt werden:
Beispiel:
- MyController->show;MyController->update;MyController->edit
Die erste Action der Liste wird jeweils per default ausgeführt.
- 11 Kommentare

Vielen Dank für das Snippet. Mit ExtBase und Fluid macht Extensions entwickeln noch mehr Spass.
Vielen Dank, funktioniert. Kleiner Hinweis: anstatt MyController muss man natürlich den Namen des Controller eintragen, allerdings ohne Suffix-Controller. Also, wenn z.B. Blog (für BlogController)
Korrigiertes Snippet
Hier zum Kopieren nochmal korrekt und ohne die b-Tags:
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Verhalten</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<switchableControllerActions>
<TCEforms> Standardaktion des Plugins <config>
<type>select</type>
<items>
<numIndex index="0">
<numIndex index="0">Listenansicht</numIndex>
<numIndex index="1">MyController->list</numIndex>
</numIndex>
<numIndex index="1">
<numIndex index="0">Einzelansicht</numIndex>
<numIndex index="1">MyController->show;MyController->edit;MyController->update</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</switchableControllerActions>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
Viel Spaß und danke für den Beitrag!
Mimi
Die b-Tags sind raus - was auch immer die da verloren hatten :)
In wie fern überschneiden sich denn die erlaubten Actions mit den Angaben in Tx_Extbase_Utility_Extension::configurePlugin in ext_localconf.php? Müssen die an beiden Stellen definiert werden?
aufzurufende Actions
Nur weil ich da ein bisschen rumgesucht habe: Wenn man nachträglich die flexform.xml ändert (sprich Actions hinzufügt), muss man den Wert im Record im BE im Flexform erneut auswählen. Tut man das nicht, dann bleibt dort ein ungültiger Wert stehen.
Hallo Felix,
Die verwendeten Controller/Action in der Flexform sind immer eine Teilmenge der in der localconf definierten Controller und Actions. Das heist, ja die müssen auf alle Fälle auch in der localconf definiert werden.
2 Bemerkugnen
Hi,
zwei kurze Hinweise:
v.a. FE-Plugins, die über den neuen Extbase Kickstarter erstellt werden, enden nicht mehr auf _pi1, damit muss sich auch die $pluginSignature anders aufbauen, sonst wird das Flexform nicht im tt_content-Feld eingetragen.
2. Wie übergibst du der show-Action ein entsprechendes (standardmäßig gefordertes) Domain-Objekt ?
2 Bemerkungen
Das Plugin _pi1 zu nennen hat natürlich nur noch historische Gründe. Dem Plugin kann ein beliebiger Identifier gegeben werden und muss nur zu den anderen Angaben in ext_localconf und ext_tables passen. Ich weiss gerade nicht, welchen Code der aktuelle Kickstarter für die Controller generiert, aber welches Objekt in welcher Action gefordert wird, bestimmst du mit den Angaben in der MethodenDefinition und dem Kommentar der Methode selbst. Das heisst eine show-Action kommt auch ganz ohne (übergebenes) Domain-Objekt aus.
2 Bemerkugnen
Hi,
bleibt man mit den Action-Bezeichnungen innerhalb der ExtBase - Konventionen, wird die showAction zur Darstellung eines einzelnen Domänenobjekts verwendet. Dieses muss natürlich als Parameter übergeben werden und hier hakt es anscheinend noch. Abhilfe schafft hier eine eigene Methode, die wie du schon sagtest, ohne DO auskommt. Trotzdem: remember - "Convention over configuration" ;)...
showAction
Dass es dafür eine Konvention gibt war mir unbekannt. Kannst du mir sagen wo das definiert ist?