Zum Inhalt springen

Kommunikation zwischen Extbase Plugins (Widgets)

Erstellt am 4. April 2011 · 6 Antworten · letzte Antwort am 6. April 2011

Tags: Frage

FrediL ·

Servus.

Ich habe auf einer Seite eine Extbase-Extension in verschiedenen Widgets als Plugins eingebunden, wie es hier http://bit.ly/eCLtlt beschrieben ist.

Jedes der Plugins verwendet einen eigenen Controller.
Pi1 ist als normales Plugin als Seiteninhalt eingefügt und verwendet den ProductController. Pi2 (MenuController) und Pi3 (SuggestController) sind per per TypoScript als Widget hinzugefügt.

Jetzt muss ich, wenn jemand in Pi2 ein Produkt auswählt, zum einen das entsprechende Menü in Pi2 rendern. Das funktioniert. Außerdem muss ich in Pi1 die Action zum Ausgeben der Produktdetails aufrufen und in Pi3 die entsprechenden Produktempfehlungen.

Wie kann ich das Produkt zwischen den einzelnen Controllern und Plugins "weitergeben"? Bzw. wie kann ich überhaupt in den anderen Plugins eine entsprechende Action aufrufen?

Eine Möglichkeit wäre einen Controller zu erzeugen, der die URL entsprechend modifiziert und die Actions und Parameter für die anderen Plugins ergänzt und einen redirect ausführt.

Ein forward innerhalb des Controllers scheint nicht möglich zu sein, weil dieser nur innerhalb des aktuellen Plugins funktioniert.

Oder ist es sinnvoller den LinkActionViewHelper so zu erweitern, dass man ihm mehrere PluginNamen und Parameter mitgeben kann?

Gibt es noch bessere Lösungsansätze? (Sub-)Controller?
Ich bin für jeden Tipp dankbar.

Gruß
FrediL

brucelie ·

Hallo,
Das ist verzwickt. Vorallem auch, weil du ja so wie du das beschrieben hast und ich das verstehe, immer davon ausgehen musst, dass das Plugin zuerst gerendert wird, damit die anderen TS Plugins die geänderten Daten auch verarbeiten können.

In dem Fall empfehle ich dir einen Context für deine Extension aufzubauen, welcher das erste Plugin deiner Extension das aufgerufen wird aufbaut und die Verarbeitung der Eingabedaten vornimmt. Deine anderen beiden Extensions können dann aus diesem ContextObjekt die Daten abgreifen.

Nur so als Idee.

FrediL ·

Mh, die Idee mit dem Context klingt sinnvoll. Die Reihenfolge des Renderns ist eigentlich egal.

Es müssen nur ALLE Plugins auf die Request-Parameter des EINEN Plugins reagieren. Also wenn durch einen Link in Pi2 z.B. ein Produkt ausgewählt/übergeben wird, dann müssen Pi1 und Pi3 entsprechend darauf reagieren und Informationen in Abhängigkeit von diesem Produkt anzeigen.

Einfach in Pi1 in der indexAction auf $_GET['tx_myextension_pi2']['...'] zugreifen, finde ich etwas dirty.

Bei der Gelegenheit habe ich noch ein Frage zu forward in einem ActionController. Ich lade ein Product anhand seiner uid:
$product = $this->productRepository->findByUid($uid);

Anschließend muss ich an eine andere Action mittels forward weiterleiten, damit der vorhandene Request-Response-Zyklus erhalten bleibt:
$this->forward('show', NULL, NULL, array('product' => $product));

Allerdings meldet das Frontend folgenden Error:
The value must be of type "Tx_MyExtension_Domain_Model_Product", but was of type "NULL".

$product ist aber definitiv nicht NULL!!! Übergebe ich statt des ProductDomainModels nur die UID und lade das Produkt noch einmal in der anderen Extension, dann geht es. Kann es sein, dass man bei forward als Argumente nur einfache Datentypen übergeben kann und keine komplexen Objekte? Das macht irgendwie keinen Sinn #paralyzed#

brucelie ·

Ich habe leider keinen Code da, in dem ich Objekte an die Action per forward übergebe. Aber ich kann mir gut vorstellen dass das nicht geht weil dabei intern ein komplett neuer Request dispatched wird.
Wenn du bei dem Forward nur die ID des Objektes übergibst (wie das auch bei einem normalem Request passiert) dann müsste das funktionieren.

Eventuell würde Extbase das Objekt dann auch nicht neu laden sondern aus der IdentityMap holen, umd das zu bestätigen müsste man an der Stelle aber noch tiefer in den extBase Code schauen.

FrediL ·
brucelie schrieb

[...] Aber ich kann mir gut vorstellen dass das nicht geht weil dabei intern ein komplett neuer Request dispatched wird. [...]

Im Buch "TYPO3-Extensions mit Extbase und Fluid" von Jochen Rau und Sebastian Kurfürst steht:
"Die forward()-Methode schließlich bewirkt, wie die beiden redirect-Methoden, ebenfalls eine sofortige Weiterleitung der Anfrage an eine andere Action. Im Gegensatz dazu wird allerdings kein Request-Response-Zyklus gestartet. Es wird lediglich das Request-Objekt mit den Angaben von Action, Controller und Extension aktualisiert und dem Dispatcher wieder zur Verarbeitung zurückgereicht. Dieser gibt dann die aktuellen Request- und Response-Objekte an den entsprechenden Controller weiter."

Bei redirect() kann man ein Objekt als Argument übergeben. Deshalb kann ich nicht verstehen, wieso es bei forward() innerhalb des aktuellen Response-Request-Zyklus nicht funktionieren soll.
Einzige Erklärung wäre, dass das Request-Objekt nicht aktualisiert wird und damit eben auch nicht die neuen Argumente weitergereicht werden. Das würde aber letztendlich ja bedeuten, dass man nur an Actions forwarden kann, die die gleichen Parameter verlangen, wie die aktuelle Action. Und das macht noch weniger Sinn.

Also entweder mache ich noch etwas komplett falsch oder es handelt sich um einen Bug.

FrediL ·

Aha, ich habe mir gerade mal den Code ein bisschen genauer angesehen. Die Übergabe des Objekts an das Request-Objekt funktioniert. Aber bei der Umwandlung in

Tx_Extbase_MVC_Controller_Argument->transformValue($value)

funktioniert das mapping nicht. Die Methode bekommt zwar als $value das richtige EntityObjekt zugewiesen, scheitert aber am Mapping.

Grund ist das fehlende Handling von EntityObjekts in transformValue(). Ich habe dazu einen entsprechenden Bug angelegt: http://devel.forge.typo3.org/issues/8082

Anschließend habe ich gesehen, dass es bereits einen ähnlichen Bug gibt, der das Handling entsprechend Implementiert: http://devel.forge.typo3.org/issues/7573

brucelie ·

Ich habe mich gerade über die niedrigen BUG Nummern gewundert. Ich nehme mal an devel.forge.typo3.org ist nur ein Testsystem. Der von dir gefundene Bug wird hier beschrieben: http://forge.typo3.org/issues/9687 und scheint mit der Version 1.4.0 von extbase behoben zu sein.