[Frage] switchableControllerActions und zwei Plugins auf einer Seite [Gelöst]

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    14. 02. 2014, 16:23

    Hallo, ich bin es mal wieder.
    Ich bin schon wieder auf ein Problem gestoßen in Bezug auf Extbase. Und zwar geht es um switchableControllerActions.

    Ich habe im Grunde ein Plugin (Kalender) und dort eine Tagesansicht und eine Listenansicht. Die Ansichten können über switchableControllerActions gewählt werden. Mein Problem: ich möchte gern die Listenansicht neben der Tagesansicht anzeigen. Dazu muss ich das Plugin zweimal auf der Seite einbinden und die entsprechenden Ansichten wählen. Wenn ich in der Listenansicht auf einen Termin klicke, soll dieser in der Tagesansicht angezeigt werden. Die URL wird also mit einer Show-Action für das Plugin aufgerufen. Wie es aber immer so ist, funktioniert das nicht so einfach. Erstmal als Hinweis: Ich nutze Typo3 6.2 beta5.

    Zunächst gab es eine Fehlermeldung "The action 'show' (controller 'Calendar') is not allowed by this plugin. Please check TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin() in your ext_localconf.php."
    Das Problem habe ich schon gelöst, wie hier am Ende beschrieben:
    [url]http://wiki.typo3.org/Exception/CMS/1313855175[/url] bzw hier:
    [url]http://maischner.de/typo3-extbase-fluid-fehlermeldungen/[/url]

    Nun hänge ich an dem Problem, welches in dem zweiten Link schon angesprochen wurde: das Plugin mit der Listenansicht "denkt" nun auch, dass es die Tagesansicht anzeigen soll. Somit wird mir in beiden Plugins plötzlich die Tagesansicht angezeigt, wenn ich auf einen Termin geklickt habe.

    Meine Frage: Kennt schon jemand einen Workaround dafür? (Ich habe beim Suchen leider nichts gefunden)
    Ich könnte natürlich für die beiden Ansichten einfach jeweils eigenständige Plugins schreiben, aber diese Lösung würde ich wirklich nur ungern nutzen...

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    17. 02. 2014, 10:02 - Lösung

    Ich habe die Sache nun so gelöst, dass ich alle Funktionalitäten, die evtl. gemeinsam auf einer Seite stehen (also wo ich das selbe Plugin mehrmals auf einer Seite einbinden müsste), als eigene Plugins angelegt habe.
    Ich hatte hier allerdings gleich das nächste Problem, denn mit "<f:link.action ..." hatte es mir die Werte immer in das falsche Plugin-Array geschrieben. Die Parameter standen im Array mit dem Namen des Quell-Plugins, sie mussten aber in ein Array mit dem Namen des Ziel-Plugins. Für alle, die das selbe Problem haben, hier die Lösung mit den dafür benötigten Parametern:

    1. <f:link.action pluginName="NAME_DES_ZIELPLUGINS" action="ACTION_DES_ZIELPLUGINS" pageUid="UID_DER_ZIELSEITE" arguments="...">...</f:link.action>

    Falls es doch mal eine bessere Möglichkeit gibt, würde ich mich darüber freuen, diese zu erfahren :-)


  • 1
  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    17. 02. 2014, 10:02

    Ich habe die Sache nun so gelöst, dass ich alle Funktionalitäten, die evtl. gemeinsam auf einer Seite stehen (also wo ich das selbe Plugin mehrmals auf einer Seite einbinden müsste), als eigene Plugins angelegt habe.
    Ich hatte hier allerdings gleich das nächste Problem, denn mit "<f:link.action ..." hatte es mir die Werte immer in das falsche Plugin-Array geschrieben. Die Parameter standen im Array mit dem Namen des Quell-Plugins, sie mussten aber in ein Array mit dem Namen des Ziel-Plugins. Für alle, die das selbe Problem haben, hier die Lösung mit den dafür benötigten Parametern:

    1. <f:link.action pluginName="NAME_DES_ZIELPLUGINS" action="ACTION_DES_ZIELPLUGINS" pageUid="UID_DER_ZIELSEITE" arguments="...">...</f:link.action>

    Falls es doch mal eine bessere Möglichkeit gibt, würde ich mich darüber freuen, diese zu erfahren :-)

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    17. 02. 2014, 12:19

    Ich muss das Thema doch nochmal aufgreifen, da ich das Problem nur halb lösen konnte. Ich erhalte auf meiner Seite, auf der ein Plugin für die Listenansicht des Kalenders und ein Plugin für die Detailansicht eines Eintrags angezeigt wird, in dem Plugin für die Detailansicht folgende nichtssagende Fehlermeldung:
    An error occurred while trying to call Blubb\Calendar\Controller\CalendarController->showAction().

    Der Teil, der in meiner Listenansicht den Link zur Detailansicht erzeugt, sieht so aus:

    1. <f:link.action pluginName="calendarshow" action="show" pageUid="23" arguments="{calendar : calendar}">mehr</f:link.action>

    Der erzeugte Link sieht wie folgt aus:
    http://meinedomain.de/kalender-detailseite/?tx_blubb_calendarshow[calendar]=1&tx_blubb_calendarshow[action]=show&tx_blubb_calendarshow[controller]=Calendar&cHash=...

    Der erzeugte Link ist meiner Meinung nach korrekt.

    Meine Controller-Action sieht wie folgt aus:

    1. /**
    2.  * action show
    3.  *
    4.  * @param \Blubb\Calendar\Domain\Model\Calendar $calendar
    5.  * @dontvalidate $calendar
    6.  * @return void
    7.  */
    8. public function showAction(\Blubb\Calendar\Domain\Model\Calendar $calendar) {
    9. $this->view->assign('calendar', $calendar);
    10. }

    Die Funktion "show" ist die einzige Funktion, die das Plugin aufrufen darf - sie wird auch nicht gecached.

    Offenbar erhält die Show-Aktion das calendar-Objekt nicht, obwohl es in der URL korrekt übergeben wird. Ich glaube, dass das Problem damit zusammen hängt, dass die Daten von Plugin 1 an Plugin 2 übergeben werden, das sich auf einer anderen Seite befindet, wobei ich das Ziel-Plugin ja in meinem Link angegeben habe und es wird auch korrekt in die URL geschrieben. Mein Model und mein TCA habe ich schon auf Fehler überprüft. Auch der Cache kann als Fehler ausgeschlossen werden, da ich immer alle Caches nach Änderungen lösche (auch im Install-Tool).
    Ich verstehe nicht, wo der Fehler liegt. Wenn Quell- und Ziel-Plugin identisch sind und sich die Seite beim Aufruf nicht ändert, hat der Aufruf von einer List-Funktion zu einer Show-Funktion aus immer funktioniert. Ich habe das Gefühl, dass Extbase die übergebene uid nicht mit dem Model mapped. Ich weiß aber nicht, wie ich das prüfen kann, da die Fehlermeldung schon vor Aufruf der Action erzeugt wird. Der Debug-Modus in Typo3 ist aktiv.

    Zur Info: Ich arbeite mit Typo3 6.2.

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    17. 02. 2014, 13:30

    Hat sich erledigt. In einem Model einer ganz anderen Domäne, welche aber als StorageObject-Eigenschaft in meinem Kalender-Model enthalten war, hat der Validator einen Fehler geworfen. D.h. Extbase hat im Hintergrund einen Fehler für dieses Model geworfen - ausgegeben wurde aber nur die Meldung
    "An error occurred while trying to call Blubb\Calendar\Controller\CalendarController->showAction()."

    Herausgefunden habe ich den Fehler, indem ich in der Datei typo3\sysext\extbase\Classes\Mvc\Controller\Argument.php in der Funktion "setValue" folgenden Code angepasst habe:

    1. // die Zeile ist original enthalten in der Funktion
    2. $validationMessages = $this->validator->validate($this->value);
    3. // die Zeile habe ich zum Debuggen eingefügt
    4. echo \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($validationMessages);

    So habe ich gesehen, dass der Validator Fehler geworfen hat. Vielleicht hilft die Information ja jemandem, der ein ähnliches Problem hat.

    Mein Fazit: Bei Extbase sollten dringend die Fehlermeldungen überarbeitet werden!

  • jpsy jpsy
    Padawan
    0 x
    44 Beiträge
    0 Hilfreiche Beiträge
    11. 06. 2015, 11:38

    Mehr Infos zu diesem Problem und seiner Lösung finden sich hier:
    http://wiki.typo3.org/Exception/CMS/1313855175

    Dort ist auch eine Methode beschrieben, wie man das Problem per TS lösen kann, ohne die Extension zu ändern. So wird es möglich, Fremd-Extensions zur Zusammenarbeit zu bewegen, die den Effekt zeigen. Ich hatte diesen Fall z.B. gerade mit der Extension sf_event_mgt bei der sich List-View und Details-View nicht auf einer gemeinsamen Seite platzieren ließen. Mit dieser Zeile im TS-Setup ließ sich der Fehler komplett beheben:

    1. plugin.tx_sfeventmgt.mvc.callDefaultActionIfActionCantBeResolved = 1

  • 1