TYPO3 & Fluid: GET / POST Parameter auslesen

Heute mal wieder in kleines Snippet fürs Fluid Templating in TYPO3. Hierbei ist es hin und wieder hilfreich GET oder POST Parameter auszulesen um diese zum Beispiel in Conditions zu verwenden. Bedauerlicherweise konnte ich hierfür weder im normalen Fluid noch bei VHS einen entsprechenden ViewHelper finden, daher möchte ich hier ein kleines Workaround posten.

Wie bereits erwähnt wäre es zum Beispiel möglich einen ViewHelper zu schreiben der GET oder POST Parameter liefert. Auch könnte man den Wert von GET / Post Parametern aus dem Controller direkt ans Fluid übergeben:

$GPvariable = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('meineVariable');
$this->view->assign('GPVariable',$GPvariable);

Wie so oft bei komplexeren Sachen kann man sich jedoch auch einfach dem funktionsreichen Typoscript bedienen und die Verarbeitung dort durchführen lassen.

Hier also eine kleine Typoscript Lib die den Wert einer beliebigen GET / POST Variable zurückgibt:

lib.gpvar = COA
lib.gpvar {
  # Schuetzt vor XSS, daher auch ein COA!
  stdWrap.htmlSpecialChars = 1
  10 = TEXT
  10 {
    dataWrap = GP:{current}
    insertData = 1
    wrap3 = {|}
  }
}

Der Aufruf kann dann beispielsweise so im Fluid erfolgen:

{f:cObject(typoscriptObjectPath: 'lib.gpvar', data: 'wunschparameter')}

Wichtiger Hinweis:
Beachtet beim Umgang mit GET Variablen immer das ihr euch vor XSS Angriffen schützt! Gebt die Werte aus GET Parametern niemals unverarbeitet zurück in die Ausgabe und „escaped“ die Werte mit htmlspecialchars!

7 Kommentare

  • Danke für das wertvolle Snippet. Es funktioniert perfekt, solange die Parameter nicht verschachtelt sind.

    In folgendem Fall wird ein leerer String zurück gegeben statt des Inhalts der Get-Variable „tx_ttnews[tt_news]“:

    [html]
    {f:cObject(typoscriptObjectPath: ‚lib.gpvar‘, data: ‚tx_ttnews|tt_news‘)}
    [html]

    Woran könnte das liegen?

    • Hallo Adrian,

      vielleicht kommt das darin enthaltene „|“ dem wrap3 in die Quere. Möglicherweise muss man das Typoscript Objekt für solche Fälle anders verschachteln… leider fehler mir gerade die Zeit dafür. Wenn Du etwas herausfindest wäre es nett wenn Du es uns mitteilst.

  • Danke für die Antwort und den Tipp.

    Nach einem Blick in die Dokumentation (https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Stdwrap/Index.html#wrap3) habe ich folgendes probiert, jedoch noch immer ohne den gewünschten Effekt:
    [ts]
    lib.gpvar = COA
    lib.gpvar {
    stdWrap.htmlSpecialChars = 1
    10 = TEXT
    10 {
    dataWrap = GP:{current}
    insertData = 1
    wrap3 = {-}
    wrap3.splitChar = –
    }
    }
    [ts]

    Für den Moment lebe ich mit statischen Variante:

    [ts]
    lib.eddPi3secHashOccId = TEXT
    lib.eddPi3secHashOccId.data = GP:tx_tx_ttnews|tt_news
    [ts]

  • Die Pipe kommt nicht dem wrap3 sondern dem dataWrap in die Quere und das bietet unglücklicherweise nicht die Möglichkeit einen anderen solitChar zu setzen 🙁

  • Folgendes geht, zumindest bei uns in der TYPO3v8. Damit gehen dann auch verschachtelte Parameter…

    lib.gpvar = COA
    lib.gpvar {
        # Schuetzt vor XSS, daher auch ein COA!
        stdWrap.htmlSpecialChars = 1
        10 = TEXT
        10 {
            value = GP:{current}
            wrap3 = {^}
            wrap3.splitChar = ^
            insertData = 1
            stdWrap.insertData = 1
        }
    }
    
  • Hallo, dazu folgende Frage von meiner Seite aus:
    Ich versuche über so einen Get-Parameter den header von Datensätzen in einer Seite aus zu geben. Funktioniert soweit, allerdings mit dem Problem, dass ich den header immer nur in der default Sprache ausgeben kann (DE). Leider habe ich das Frontend noch in IT und EN. Könnt ihr mir sagen, wie ich den Header entsprechend der Sprache noch ausgeben kann.

    30 = COA
      30 {
        stdWrap.wrap = <li><span class="here" title="{$pfadtxt}"> | </span></li>
        #Schuetzt vor XSS, daher auch ein COA!
        stdWrap.htmlSpecialChars = 1
        20 = TEXT
        20 {
          dataWrap = DB:tt_content:{GP:dceDetailUid}:header
          wrap3 = {|}
          insertData = 1
        }
      }

    Vielen Dank

    • Das cObject CONTENT wird von der TYPO3-Übersetzungslogik automatisch behandelt.
      Probieren Sie es mal mit folgendem:

      30 = COA
      30 {
          stdWrap.wrap = <li><span class="here" title="{$pfadtxt}"> | </span></li>
          #Schuetzt vor XSS, daher auch ein COA!
          stdWrap.htmlSpecialChars = 1
          20 = CONTENT
          20 {
              table = tt_content
              select {
                  #Begrenzt die Abfrage auf die aktuelle Seite
                  pidInList = this
                  uidInList.cObject = TEXT
                  uidInList.cObject.data = GP:dceDetailUid
                  #Stellt sicher, dass nur Zahlen im SQL ankommen
                  uidInList.cObject.intval = 1
              }
              renderObj = TEXT
              renderObj.field = header
          }
      }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Highlighting von Codes ist mit den Tags  [ts], [php], [html], [javascript], [xml] oder [code] möglich.