[TYPO3-german] ViewHelper in Controller rendern

Stephan Schuler Stephan.Schuler at netlogix.de
Fri Apr 26 10:38:47 CEST 2013


Hallo zusammen.


Abhängig von dem möglichen Parametern eines ViewHelpers lässt sich halt einfach nicht generisch bestimmen, ob der jetzt eine triviale oder komplexe Ausgabe hat.

Ich nehm mal als Beispiel den ifViewHelper der als Parameter eine Condition hat und, wenn er nicht zusammen mit einem thenViewHelper und/oder einem elseViewHelper verwendet wird abhängig vom Rückgabewert dieser Condition wahlweise seine ChildNodes rendert oder nicht.

Ich verbinde diesen ifViewHelper mit einem linkViewHelper der mir eine Seite verlinkt, diesen linkViewHelper mit einem zweiten und einem Stringvergleich und möchte prüfen, ob der erzeugte Link Cross-Domian wird oder nicht. Und abhängig von dieser Rückgabe lass ich dann wahlweise einen HTML-Code-Block produzieren der mir lediglich ein DIV und einen Link darin ausspuckt oder einen ganz anderen der die erste 10 Inhaltselemente der Zielseite in UL/LI packt, mit einer Pagination drum rum um von 0-9 auch noch 10-19 und weitere Inhaltselementsgruppen aufgelistet zu bekommen.

Das Beispiel habe ich so  natürlich nicht im Einsatz, nicht mal im Ansatz. Trotzdem wäre dieses Konstrukt möglich.

Alleine wenn man den ifViewHelper betrachtet kann man natürlich immer sagen: Dazu lade ich mir keinen aufgeblasenen View, die Funktion kann ich viel leichter ohne Template abbilden.
Aber bei den anderen sieht das schon anders aus.
* Der (action.)linkViewHelper braucht ein Plugin, damit die NULL-Parameter definiert sind (controller und extension)
* Der paginateViewHelper braucht sowohl ein Plugin damit sein grundsätzlicher definiert ist als auch ein QueryResultInterface damit er einen Query zum Verändern hat.

Es ist -- und das ist eigentlich alles was ich bisher sagen wollte -- ganz häufig situationsabhängig, wie viel Framework ich drum rum brauche.

Aber gerade der linkViewHelper und der ifViewHelper zeigen eigentlich intern schon wie hier die Lösung aussieht: Wenn diese Situation auftritt dann ist ein Service sinnvoll der die Arbeit erledigt und ein kleiner schmaler ViewHelper der den Service lediglich in Fluid zur Verfügung stellt.
Immer dann wenn ich lediglich die Rückgabe in einem String in der Hand haben will spreche ich mit dem Service direkt, nicht mit dem ViewHelper.

Was sicher jeder schon mal gemacht hat und was bei der Betrachtung auch so trivial ist dass es überhaupt nicht auf fällt: Es würde von uns ja nie einer auf die Idee kommen, den linkViewHelper im PHP-Code zu instanziieren, nur um einen Link in der Hand zu haben, etwa für einen Header-Redirect.

Der relevante Punkt dabei bleibt immer der gleiche: Es muss situationsabhängig abgewogen werden, wie viel Kontext ein Mechanismus braucht.

In die gleiche Frage fällt dann auch, warum ich nicht so ohne Weiteres über ein eID oder in einem CLI TypoLink verwenden kann.
Die Antwort ist klar: Es fehlt der Kontext in Form des TSFE. Konkret fehlt die aktuelle Seite mit analysiertem TypoScript um zu wissen wie Mount-Points, LinkVars und was sonst noch alles für einen Link notwendig ist aussehen.
Und diese Frage hat offensichtlich überhaupt nichts mit ExtBase am Hut sondern steht schon grob fünf Jahre länger monatlich auf sämtlichen TYPO3-Listen.

Und genau aus diesem Grund kann ich hier auch keine Musterlösung nennen. Die Frage ist: "Was machen die eigenen FormatViewHelper, mit welchen Daten gehen die um und was benötigen sie". Ausgehend von diesen Antwort lässt sich das dann entweder auch ohne Fluid-Stack bewerkstelligen oder eben nicht.

Der grundsätzlich einfachste Weg, an einen Fluid-Stack zu kommen ist wohl der ObjectManager->get(StandaloneView). Man braucht zwar noch ein paar andere Kleinigkeiten, aber dazu sollte Google weiter helfen. Jedenfalls ist der StandaloneView hier vermutlich das Mittel der Wahl, wenn sich die Funktionalität nicht ohne ViewHelper machen lässt.

Den ViewHelper separat zu instanziieren und mit "->render()" auszuführen halte ich dagegen für keine kluge Idee. Eben weil alles das dann defekt ist, das im ViewHelper so an Kontext normalerweise da ist. Das kann in Ausnahmefällen gehen (ifViewHelper->render($condition=$condition; $then='ja'; $else='nein') wird wohl immer "ja" oder "nein" liefern, dazu ist nicht viel Kontext notwendig), aber eben aufgrund der obigen Erkläuterung nicht immer.


Gruß,


Stephan Schuler
Web-Entwickler

Telefon: +49 (911) 539909 - 0
E-Mail: Stephan.Schuler at netlogix.de
Website: media.netlogix.de



--
netlogix GmbH & Co. KG
IT-Services | IT-Training | Media
Andernacher Straße 53 | 90411 Nürnberg
Telefon: +49 (911) 539909 - 0 | Fax: +49 (911) 539909 - 99
E-Mail: info at netlogix.de | Internet: http://www.netlogix.de

netlogix GmbH & Co. KG ist eingetragen am Amtsgericht Nürnberg (HRA 13338)
Persönlich haftende Gesellschafterin: netlogix Verwaltungs GmbH (HRB 20634)
Umsatzsteuer-Identifikationsnummer: DE 233472254
Geschäftsführer: Stefan Buchta, Matthias Schmidt



-----Ursprüngliche Nachricht-----
Von: typo3-german-bounces at lists.typo3.org [mailto:typo3-german-bounces at lists.typo3.org] Im Auftrag von Elmar Hinz
Gesendet: Freitag, 26. April 2013 10:01
An: typo3-german at lists.typo3.org
Betreff: [TYPO3-german] Re: ViewHelper in Controller rendern

Beides Verstöße gegen das DRY-Prinzip. In beiden Fällen aber zu möglicherweis zu rechtfrtigen.

> Alternativ könnte man die Funktion des ViewHelpers ohne Abhängigkeiten
> selbst bauen ...

Man könnte hier den vorhandnen Viewhelper so abwandeln, daß seine Funktionalität auch ohne Abhängigkeiten zu nutzen ist. Das entspräche DRY.

Wenn der vorhanden Viewhelper in einer anderen Extension steckt, kann man möglicherweiese etwas durch Vererbung erreichen.

>
> PS: Bei jQuery mit MVC solltest du eh nur die Daten übertragen und
> dann im FE das Layout mit JS rendern ...

Ja, um die Seitenperformance zu verbessern, macht es Sinn Funktionalitäten im Browser zu doppeln.

DRY wäre eine automatische Erzeugung des JS Codes auf Basis des PHP codes. Praktisch nicht machbar. Dazu fehlte ein entspechendes System.

Idealerweise sollte man View und Viewhelper in JavaScript schreiben, damit man sie wahlweise serverseitig und clientseitig einsetzen kann.

Fluid ist aber nun einmal kein JavaScript.  Damit müssen wir unsere Daten oft  5-fach programmieren: SQL, TCA, DO, FLUID, jQuery.
Das ist für mich nicht der Weg in die Zukunft.

Xajax pumpt die XHTML-Ausgabe ausschnitsweise vom Server in den Client. Das ist vom Konzept eher DRY als jQuery.

Elmar

_______________________________________________
TYPO3-german mailing list
TYPO3-german at lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german


More information about the TYPO3-german mailing list