| 
11.03.2008
 | 
11:19

TYPO3: tt_content rendern (nach Layout, Spaltenposition, etc.)

Oft kommt es vor, dass man Content per TS-Skript speziell rendern will. Beispiele sind: Alle Elemente der linken Spalte bekommen einen schönen Rahmen und einen “Mehr”-Link am Ende, Elemente im Text sollen unterschiedlich dargestellt werden mit Hilfe der Option “Layout”, etc.

Variante 1: Layout-Feld nutzen

Sowohl Seiten als auch Textelemente besitzen das Feld “Layout”, mit denen dieses festgelegt werden kann.

Layout-Feld der Seite

Will man verschiedene Seiten darstellen, beispielsweise mit zwei oder drei Spalten, dann kann man das Layout-Feld der Seite verwenden. Im Setup kann man das folgendermaßen festlegen:

[globalVar=TSFE:page|layout=1]
page.10.template.file= fileadmin/templates/templateB.html
[global]
[globalVar=TSFE:page|layout=2]
page.10.template.file= fileadmin/templates/templateC.html
[global]

Damit werden neben dem Grundtemplate (nennen wir es templateA.html zwei weitere Templates festgelegt. Man kann dem Template auch noch Namen geben, indem man im Page (!) TSConfig die Labels ändert:

TCEFORM.pages {
  layout.altLabels.0 = Template A
  layout.altLabels.1 = Template B
  layout.altLabels.2 = Template C
}

Layout-Feld im Content

Normalerweise bestimmt das Layout-Feld in Content-Elementen die Art der Überschrift. Mann kann mit Hilfe dieses Feldes jedoch auch das Layout des gesamten Contents anpassen, indem man z.B. diesen mit einem wrap umgibt. Das Vorgehen ist folgendes (aus www.typo3wizard.com):

page.10=TEMPLATE
page.10{
  template = FILE
  # einbinden des templates (html datei mit marker)
  template.file = fileadmin/templates/template.html
  # subpart auf den gearbeitet wird
  workOnSubpart = DOCUMENT
  subparts{
    CONTENT < styles .content.get
    CONTENT.renderObj.stdWrap.innerWrap.cObject = CASE
    CONTENT.renderObj.stdWrap.innerWrap.cObject {
      key.field = header_layout
      default = TEXT
      default.value = <div class="weiss">|</div>
      1 = TEXT
      1.value = <div class="gruen">|</div>
      2 = TEXT
      2.value = <div class="grau">|</div>
    }
  }
}

Hier werden drei Layouts definiert: das Standard-Layout und zwei weitere. Jedes Contentelement wird beim Rendern mit den entsprechenden div-Tags komplett umgeben, je nach Layout. Auch hier kann man im Page TSConfig die Labels anpassen:

TCEFORM.tt_content {
  header_layout.altLabels.2 = Grauer Hintergrund
  header_layout.altLabels.1 = Gruener Hintergrund
  header_layout.altLabels.0 = Normal(weiss)
}

Es geht jedoch noch flexibler…

Variante 2: tt_content selbst rendern

Will man den Content noch weiter anpassen, kann man mit Hilfe von renderObj das Layout selbst anpassen. Hier ein Snippet zur Demonstration:

    LEFTSIDEBAR = CONTENT
    LEFTSIDEBAR.table = tt_content
    LEFTSIDEBAR.select {
      pidInList = this
      orderBy = sorting
      where = colPos=1
      languageField = sys_language_uid
    }
    LEFTSIDEBAR.renderObj = COA
    LEFTSIDEBAR.renderObj {
      5 = HTML
      5.value = <div class="box"><img src="fileadmin/images/template/ecken_oben.gif" width="190" height="4"><div class="boxheader"><h3>
      10 = TEXT
      10.field = header
      15 = HTML
      15.value =</h3></div><div class="boxcontent">
      20 = TEXT
      20.field = bodytext
      30 = HTML
      30.value = <br /><a href="http://www.google.de">Zu Google!</a>
      35 = HTML
      35.value = </div><img src="fileadmin/images/template/ecken_unten.gif" width="190" height="4"></div>
    }

Mit wraps wäre das Beispiel wahrscheinlich etwas schöner, aber es geht hier ja nur um die Demonstration: Knackpunkt hier ist der Aufbau des Contents: Die Überschrift wird in durch eigene Elemente komplett eigenständig gerendert, der Text kommt in eine Box darunter und am Ende wird noch ein Link zu Google angehängt. Umgeben werden die einzelnen Felder von entsprechenden HTML-Befehlen. Das Ergebnis könnte dann ungefähr folgendermaßen aussehen:

Links

  •  
  • 0 Kommentare
  •  
Mein Kommentar
Ich möchte über jeden weiteren Kommentar benachrichtigt werden.

Zurück