[Frage] Extension mit Fluid und Extbase TYPO3-Version: -

  • GSTL GSTL
    T3PO
    0 x
    26 Beiträge
    1 Hilfreiche Beiträge
    18. 02. 2016, 16:24

    Hallo,
    ich arbeite gerade an meiner ersten Extension mit Extbase und Fluid.
    Die Basis dafür habe ich mit dem Extension-Builder erstellt.
    Ich möchte eine Liste von Webcambildern mit Beschreibung anzeigen.
    Die Liste funktioniert und die Detail-Ansicht (show) funktioniert auch.

    im Controller wird mit
    public function showAction(\GSWebcams\GsWebcams\Domain\Model\Webcams $webcams)
    {
    $this->view->assign('webcams', $webcams);
    }
    die Detailansicht aufgerufen.
    Jetzt möchte ich aber dem Besucher die Möglichkeit geben, wenn z.B. durch Nebel auf dem aktuellen Bild nichts zu sehen ist, ein anderes Bild (ohne Nebel) anzuschauen.

    mit dem Link <f:link.action action="show" arguments="{webcams : webcams}">Sommerbild</f:link.action>

    rufe ich die Seite erneut auf.
    Wie kann ich es realisieren, dass ich über diesen Link einen zusätzlichen Parameter übergebe, den ich dann als Kriterium verwenden kann, um das andere Bild anzuzeigen?

    Vielen Dank,
    Gerald


  • 1
  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    19. 02. 2016, 10:06

    Hallo Gerald,

    mit dem Link <f:link.action action="show" arguments="{webcams : webcams}">Sommerbild</f:link.action>

    rufe ich die Seite erneut auf.
    Wie kann ich es realisieren, dass ich über diesen Link einen zusätzlichen Parameter übergebe, den ich dann als Kriterium verwenden kann, um das andere Bild anzuzeigen?

    Der Parameter ist schon da und heißt arguments. Das ist ein kommasepariertes Array, das du nach Belieben erweitern kannst.
    arguments="{webcams:webcams, foo:bar}

    Diese Argumente werden dann an deine showAction übergeben.
    Dort musst du logischerweise Bezug auf diesen weiteren Parameter nehmen.

    .

    Btw: Ich nehme an, sowohl Klassenname Webcams wie auch die Variable $webcams beziehen sich auf genau EINE Webcam (Singular!) Dann benenne sie doch nicht im Plural!

    Gruß
    Harald

  • GSTL GSTL
    T3PO
    0 x
    26 Beiträge
    1 Hilfreiche Beiträge
    19. 02. 2016, 11:10

    Hallo Harald,
    erst einmal danke für Deine Info.
    Es sind in der Listenansicht natürlich einige Webcams, in der Detailansicht (show) natürlich immer nur die ausgewählte Cam. Der Extension-Builder hat die Klassen schon so angelegt. Da ich gerade erst einmal versuche, mich freizuschwimmen, habe ich daran auch nichts geändert.
    Gut, die Variable habe ich für die Single-Ansicht umbenannt.
    <f:link.action action="show" arguments="{webcam : webcam, image:'s'}">Sommerbild</f:link.action>

    Die showAction sieht danach so aus:
    public function showAction(\GSWebcams\GsWebcams\Domain\Model\Webcams $webcam)
    {
    $this->view->assign('webcam', $webcam);
    }
    Mein Parameter wird jetzt in der Variable "image" an die showAction übergeben.
    Nun ist mir allerdings nicht so richtig klar, wie ich diesen Parameter wieder an die Funktion
    $this->view->assign('webcam', $webcam); übergebe.
    Ich hatte versucht:
    public function showAction(\GSWebcams\GsWebcams\Domain\Model\Webcams $webcam, $image)
    {
    $this->view->assign('webcam', $webcam, $image);
    }
    das führt aber nur zu einer sinnlosen Fehlermeldung Oups ....: und ein Code, der sich mit jedem Aufruf ändert.

    Gerald

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    20. 02. 2016, 01:08

    Yo,

    also eins nach dem anderen.
    Klassennamen und Tabellennamen sollten Singular benannt werden.
    Dann hättest du eine

    1. \GSWebcams\GsWebcams\Domain\Model\Webcam $webcam

    Für mehrere (also eine 1:N Beziehung) hättest du einen Container

    1. \TYPO3\CMS\Extbase\Persistence\ObjectStorage <\GSWebcams\GsWebcams\Domain\Model\Webcam> $webcams

    Der Extension-Builder hat die Klassen schon so angelegt.

    Den Namen hast aber du ihm gegeben.

    ***

    1. <f:link.action action="show" arguments="{webcam : webcam, image:'s'}">Sommerbild</f:link.action>

    Das bedeutet, dieser Link verweist auf die showAction und übergibt 2 Argumente:
    1. $webcam erhält den Wert von webcam aus dem fluid-script.
    2. $image erhält den Wert 's' ... das ist ein String, eine Zeichenkette
    ...
    3. Diese showAction benötigt die gleiche Signatur (Anzahl und Typen der Argumente):
    Von welchem Typ soll $image sein? Ist das eine URL? Ein Pfad zu einer Datei? Eine Zeichenkette? Soll es ein Image-Object sein? Ein Verzeichnis-Pfad-Object?

    Wenn es sich um Extbase-Klassen handelt, müssen diese zum einen in der Parameterliste genannt werden, zum anderen im Kommentar. Für alle gewöhnlichen PHP-Variablentypen braucht es afaik keine Bennenung.

    ... das war von fluid nach PHP

    ***

    1. $this->view->assign('webcam', $webcam, $image);

    Das ist die andere Richtung... von PHP nach fluid
    ... und außerdem falsch. Wenn schon, dann so:
    1. $this->view->assign('webcam', $webcam);
    2. $this->view->assign('image', $image);

    [url]https://typo3.org/api/typo3cms/interface_t_y_p_o3_1_1_c_m_s_1_1_extbase_1_1_mvc_1_1_view_1_1_view_interface.html[/url]
    assign($key, $value);

    Die andere Richtung bedeutet jetzt natürlich auch wieder, daß die Variablen, die du hier assignest, in deinem fluid-script irgendwie verarbeitet werden müssen - ansprechbar unter ihrem $key.

    Ich hoffe, das war klar genug... is schon spät ;)

  • GSTL GSTL
    T3PO
    0 x
    26 Beiträge
    1 Hilfreiche Beiträge
    04. 04. 2016, 15:38

    Hallo,
    Entschuldigung, ich war einige Wochen krank und versuche jetzt den Faden wieder aufzunehmen.

    Der String "s" ist einfach nur eine Zeichenkette und zwar das "s". Im Fluidscript möchte ich einfach nur über eine If-Abfrage auswerten, ob dieser Wert gesetzt ist und damit den Bildnamen ändern.
    <f:if condition="{image}">
    <f:then>
    <f:image src=".../Images/Examples/{webcam.camName}_{image}.jpg" alt="{webcam.titel}" width="750"/>
    </f:then>
    <f:else>
    <f:image src=".../Images/Examples/{webcam.camName}.jpg" alt="{webcam.titel}" width="750"/>
    </f:else>
    </f:if>
    Bin mir nicht sicher, ob die Syntax so richtig ist.

    Im Controller habe ich die showAction geändert:
    /**
    * action show
    *
    * @param \GSWebcams\GsWebcams\Domain\Model\Webcams $webcam
    * @param \GSWebcams\GsWebcams\Domain\Model\Webcams $image
    * @return void
    */
    public function showAction(\GSWebcams\GsWebcams\Domain\Model\Webcams $webcam, $image)
    {
    $this->view->assign('webcam', $webcam);
    $this->view->assign('image', $image);
    }
    Das scheint aber falsch zu sein, da ich wieder die tolle Fehlermeldung "Oups..." erhalte, sobald ich den Parameter $image einsetze.

    Wo liegt hier der Fehler

    Danke

  • 1