Extbase: Controller/Action per FlexForm konfigurierbar machen

In Extbase lassen sich die Controller&Actions zum einen mit Parameter in der URL steuern, dass kann jedoch nicht genug sein, wenn man auf einer Seite eine bestimmte Action aufrufen möchte, ohne Parameter an die Seite zu übergeben. Um in einem Plugin die Action (oder auch den Controller) konfigurierbar zu machen, definiert die Auswahl in Flexforms. Der so ausgewählte Controller bzw. die Action wird dann berücksichtigt.

Innerhalb des XML-Elements „el“ braucht man ein Knoten mit dem Namen „switchableControllerActions“, in dem später folgenden Abschnitt items gibt man als Value die Kombination aus Controller und Action an, die ausgeführt werden sollen. Dabei läßt man den Suffix „Controller“ bzw. „Action“ weg.

<switchableControllerActions>
	<TCEforms>
	<label>LLL:EXT:my_extension/Resources/Private/Language/locallang_db.xml:ff.actionSelection</label>
	<config>
		<type>select</type>
		<items type="array">
			<numIndex index="0" type="array">
			<numIndex index="0">LLL:EXT:my_extension/Resources/Private/Language/locallang_db.xml:ff.actionDefault</numIndex>
			<numIndex index="1">Job->list</numIndex>
			</numIndex>
</items>
		<maxitems>1</maxitems>
		<size>1</size>
	</config>
	</TCEforms>
</switchableControllerActions>

Vielen Dank an Daniel Lienert!

Nachtrag: Diese Konfiguration funktioniert nur solange gut, solange man keine GET-Parameter verwendet. Damit man wieder mit GET-Parametern von einem Controller zum nächsten springen kann, muss man die erlaubten Controller-Action-Paare in einer Semikolon-separierten Liste angeben: Job->new;Job->create

7 Kommentare

  1. Thomas

    Bei mir führt das Ganze leider nur zu:

    Tx_Extbase_Configuration_Exception_ParseError

    Controller or action were empty when overriding switchableControllerActions from flexform.

    im Frontend. Im Backend kommt die Meldung INVALID VALUE (User-index).

    FlexForm scheint hier ein Problem mit > zu haben.

  2. natalia

    Flex-Form erneut abspeichern (das Invalid Value könnte daher kommen, dass die Datei mit der Flexform-Konfiguration geändert wurde, nachdem bereits einmal abgespeichert worden ist.

    Funktioniert es denn, wenn du die Action nicht konfigurierbar machst, also bei passiert bei der Default Action?

    Wenn es an dem > liegt, was komisch ist, denn die Konfiguration funktioniert in einer Extension genau so bei mir, könntest du versuchen, ein CDATA drumzuwrappen.

  3. Björn

    Hallo,

    ich habe das selbe Problem. Das > wird beim Speichern der Flexform weggenommen. Im Formular selber sieht die Value der Option noch so aus: Shop->index Nach dem speichern ist dann nur noch folgendes übrig: Shop-index.
    Seltsamer Weise tritt das Problem aber nur in manchen Systemen auf.
    Hat jemand evtl. die Ursache schon genauer einkreisen können ??

    Gruß Björn

  4. Björn Biege

    Hallo,

    ich habe eine Lösung des Problems gefunden:
    Schuld ist ein Bug in einigen libxml-Versionen.
    [BE][flexformForceCDATA] = 0
    Diese Option im Installtool aktivieren und es sollte wieder gehen.

    Gruß Björn

  5. Thomas Mayerhofer

    Hallo,
    danke für die gute Hilfestellung. Eine Frage: Wie kann ich einen Parameter an die Action hängen, z.b. möchte ich die Anzahl der angezeigten Datensätze steueren, in der Art Job->list(limit=5) ?

    Grüßte
    Thomas

  6. natalia

    An der Stelle so weit ich weiß nicht. Du könntest eine Action schreiben, die eine vordefinierte Anzahl an Datensätzen anzeigt, also z.B. Job->list5Items.
    Du kannst ansonsten an die Action alle Parameter übergeben, die du möchtest, in dem du einfach ?limit=5 an die URL hängst. Dann steht dir dieser Parameter per $_GET[‚limit‘] zur Verfügung. Dann wäre es deine Aufgabe, dafür zu Sorgen, dass der Parameter als Integer geparst wird, mit (int). Besser ist es, wenn man den Extension-Namen verwendet, also z.B. ?tx_myextension[limit]=5. Dann kannst du die Action mit listAction($limit = 10) angeben, Extbase sorgt dafür, dass der Parameter in der Action zur Verfügung steht.
    Wenn limit in der URL gesetzt ist, dann wird der Wert davon verwendet, ansonsten die 10 als Fallback.

  7. Hallo,
    ich habe damit noch ein kleines Problem. Invalid Value erscheint bei mir nicht beim bearbeiten des Content Elements sondern im Seitenmodul (normale Spaltenansicht, sprich wo alle CEs einer Seite aufgeführt werden). Dort erscheint bei dem Inhaltselement „Invalid Value ….“ (Typo3 Version 6.1.x).

    Jemand ne idee?