+49 (0)5323 701868 info(at)coders(dot)care
Shadow

Wie man Inhalte mit Gridelements und TYPO3 CMS 8 ins Frontend bekommt

Gridelements werden in Kürze für TYPO3 CMS 8 im TER erscheinen. Sie sind bereits jetzt im Git-Master auf git.typo3.org verfügbar und funktionieren weitgehend mit der aktuellen TYPO3-Version. Dieses Tutorial beschäftigt sich mit Neuheiten bei der Frontend-Ausgabe unter CMS 8.

Geschätzte Lesezeit: 4 Minuten

Aus gegebenem Anlaß

und wie beim TYPO3-Camp Stuttgart versprochen ...

... gibt es hier nun ein kurzes Tutorial, wie man die Frontend-Ausgabe von Gridelements für TYPO3 CMS 8 anpasst. Es scheint aktuell das ein oder andere Mißverständnis hinsichtlich der Änderungen in der neuen TYPO3-Version zu geben. Zudem kursieren verschiedene Code-Snippets in Foren und Social-Media-Gruppen, mit deren Hilfe man Probleme, die sich angeblich mit CMS 8 ergeben sollen, beheben können soll.

Dieses Tutorial erklärt kurz und knapp, was man tun - oder ggf. auch nicht tun - sollte, wenn man Gridelements mit CMS 8 und CSS-Styled-Content, Fluid-Styled-Content oder einem komplett eigenen TypoScript-Setup im Frontend ausgeben will.

Die gute Nachricht: Es ändert sich (fast) nichts

Wer CSS-Styled-Content oder Fluid-Styled-Content benutzt, benötigt keinerlei Änderungen

Wenn man sich den folgenden Code aus dem Default-Grid-Setup von Gridelements anschaut, wird schnell klar, daß es zunächst nicht auf die verwendete Ausgabe-Methode ankommt. Unabhängig von CSS-Styled-Content, Fluid-Styled-Content oder eigenem TypoScript für die Frontendausgabe, verwendet Gridelements ein relativ minimalistisches Setup.

lib.gridelements.defaultGridSetup {
  columns {
    default {
      renderObj = COA
      renderObj {
        20 =< tt_content
      }
    }
  }
}

plugin.tx_gridelements_pi1 >
tt_content.gridelements_pi1 >
tt_content.gridelements_pi1 = COA
tt_content.gridelements_pi1 {
  #10 =< lib.stdheader
  20 = COA
  20 {
    10 = USER
    10 {
      userFunc = GridElementsTeam\Gridelements\Plugin\Gridelements->main
      setup {
        default < lib.gridelements.defaultGridSetup
      }
    }
  }
}

Die Referenz auf tt_content sorgt für Unabhängigkeit

Wie man in Zeile 6 sieht, wird für die eigentliche Ausgabe der Kind-Elemente durch den Operator =< eine Referenz auf tt_content gesetzt. Das bedeutet, daß sämtliche Definitionen von tt_content exakt so übernommen werden, wie vom verwendeten Setup vorgegeben. Gridelements nimmt dabei keinerlei zusätzliche Änderungen vor.

In Zeile 12 und 13 werden zunächst möglicherweise vorhandene andere Setups für Gridelements gelöscht, um sicherzustellen, daß keine Reste einer Plugin-Registrierung oder ähnlicher Aktionen übrig bleiben. Danach erfolgt ein minimales Setup als COA mit einem darin enthaltenen weiteren COA sowie einem USER-Objekt. Darin befindet sich die essentiell wichtige Funktion Gridelements->main, mit deren Hilfe die Kinder geholt und das für die einzelnen Container-Varianten vorgesehen Setup angewendet wird.

Das zuvor definierte Default-Setup wird dann in Zeile 23 zugewiesen und damit funktioniert Gridelements wie gewohnt und zwar unabhängig vom verwendeten Basis-Setup.

Die Überschrift mit lib.stdheader

Wer Fluid-Styled-Content oder ein eigenes Setup benutzt, benötigt hier ggf. Änderungen

Die Ausgabe einer eigenen Überschrift für Gridelements-Container ist per Default nicht vorgesehen, kann aber relativ einfach aktiviert werden. Man muß lediglich in Zeile 16 das # vor 10 =< lib.stdheader entfernen, um eine Referenz auf die Header-Definition von CSS-Styled-Content zu aktivieren. Innerhalb einer eigenen Definition für das Frontend-Setup kann man sich zur Vereinfachung eine Library mit identischem Namen anlegen und genauso auf diese referenzieren.

Das Setup von lib.stdheader dient hier nur als Beispiel für eine mögliche Eigendefinition und ist keinesfalls als maßgebliche Empfehlung zu betrachten!

lib.stdheader = COA
lib.stdheader {
  10 = TEXT
  10 {
    field = header
    htmlspecialChars = 1
    typolink.parameter.field = header_link
    dataWrap = <h{field:header_layout}>|</h{field:header_layout}>
    dataWrap {
      override = <h{$content.defaultHeaderType}>|</h{$content.defaultHeaderType}>
      override.if.isFalse.field = header_layout
    }
  }
}

tt_content.gridelements_pi1 {
  10 =< lib.stdheader
  20 = COA
  20 {
    10 = USER
    10 {
      userFunc = GridElementsTeam\Gridelements\Plugin\Gridelements->main
      setup {
        default < lib.gridelements.defaultGridSetup
      }
    }
  }
}

Die Kür: Fluid-Templates für Grid-Container

Wer lib.contentElement von Fluid-Styled-Content benutzen will, benötigt einige Änderungen

Mit CMS 8 wurde für Fluid-Styled-Content eine vereinheitlichte Ausgabe über die Library lib.contentElement eingebaut. Selbstverständlich kann man diese Vereinheitlichung auch auf Gridelemente anwenden, jedoch braucht man dafür ein geringfügig modifiziertes Default-Setup, um die Inhalte der Kindelemente an das Fluid-Template zu übergeben.

lib.gridelements.defaultGridSetup {
  columns {
    default {
      renderObj = COA
      renderObj {
        20 =< tt_content
      }
    }
  }
  cObject =< lib.contentElement
}

plugin.tx_gridelements_pi1 >
tt_content.gridelements_pi1 >
tt_content.gridelements_pi1 =< lib.contentElement
tt_content.gridelements_pi1 {
    # Fluid Styled Content liefert aktuell nur Default
    # Stattdessen muß Generic verwendet werden, weil es kein Default Template gibt
    templateName = Generic
    variables {
        content = COA
        content {
            10 = USER
            10 {
                userFunc = GridElementsTeam\Gridelements\Plugin\Gridelements->main
                setup {
                    default < lib.gridelements.defaultGridSetup
                    1 < lib.gridelements.defaultGridSetup
                    1 {
                        cObject {
                            templateName = OneColumn
                            templateRootPaths {
                                20 = EXT:EXTNAME/Resources/Private/Templates/MyTemplatePath/
                            }
                        }
                    }
                }
            }
        }
    }
}

Das cObject liefert weiterhin das FLUIDTEMPLATE

Es gibt im Grund nur minimale Unterschiede zum Original-Setup, nämlich in den Zeilen 10, 15 und 20, sowie im Block ab Zeile 30.

Da Gridelements auch schon vor CMS 8 problemlos mit FLUIDTEMPLATE als Ausgabe arbeiten konnte, muß man lediglich wie gewohnt das in Zeile 10 eingebundene cObject verwenden. In diesem Fall wird dort eine Referenz auf lib.contentElement gesetzt, weil darin bereits ein vollständiges Setup für ein FLUIDTEMPLATE vorhanden ist. In Zeile 15 wird nun dasselbe lib.contentElement für die Ausgabe des umschließenden Containers referenziert.

Edit: Fluid Styled Content verwendet templateName = Default innerhalb von lib.contentElement, allerdings fehlt das dazugehörige Template, weswegen es zu Exceptions kommen kann. Als Workaround kann man stattdessen templateName = Generic verwenden.

Damit nun die Ausgabe weiterhin wie gewohnt funktioniert, muß das bisherige Setup inklusive USER-Objekt wie in Zeile 20 zu sehen in eine Variable namens content verschoben werden. Diese Variable kann dann im Fluid selbst verwendet werden, um den eigentlichen Inhalt zu platzieren.

im Block ab Zeile 30 ist ein Beispiel für die Ausgabe eines einspaltigen Containers zu sehen, der aus einer eigenen Extension heraus über ein eigenes Template mit dem Namen OneColumn verfügt. Sämtliche weiteren Möglichkeiten der Ausgabe von FLUIDTEMPLATE sind natürlich ebenfalls verwendbar. Beispiele dafür gibt es in der TypoScript-Referenz.

TL;DR - Fazit

Wer Gridelements mit CMS 8 nutzen will, muß nicht zwingend etwas ändern.

Wer mit Gridelements unter CMS 8 schnell zu einer Ausgabe im Frontend kommen will, sollte das Default-Setup in jedem Fall unverändert lassen.

Wer dabei außerhalb von CSS-Styled-Content mit lib.stdheader für die Überschriftenausgabe arbeiten möchte, muß sich dafür ggf. eine eigene Library namens stdheader anlegen.

Wer meint, auf die neue Library lib.contentElement von Fluid-Styled-Content zurückgreifen zu müssen, benötig mindestens ein zusätzliches cObject und einige Modifikationen am Default-Setup.

Jo Hasenau
botMessage_toctoc_comments_9210