Eine kleine Einführung in das CONTENT Objekt

 / typo3wizard.com / Artikel / Das CONTENT Objekt

Das CONTENT Objekt wird in TYPO3 zum Auslesen von Daten aus einer Tabelle verwendet. Es erweist sich als besonders nützlich wenn man die eingegebenen Daten in einem untypischen Format benötigt, z.b. als Parameter für Flash Elemente.

 

Im folgenden Artikel wird anhand von Beispielen die Grundfunktionalität des CONTENT Objekts beschrieben, sowie einige erweiterte Einsatzmöglichkeiten behandelt.

 

Fangen wir mit einem einfachen Beispiel für das CONTENT Objekt an:

Einfaches Auslesen von maximal 10 Inhalten aus der rechten Spalte der aktuellen Seite. Falls ein Bild angehängt wurde wird auch dieses angezeigt.

 

temp.right_content=CONTENT
temp.right_content{
    # Die Tabelle aus der gelesen wird (Die einzigen zugelassenen Tabellen sind "pages" oder Tabellen mit dem Präfix "tt_","tx_","ttx_","fe_" oder "user_")
  table=tt_content
    # wrap um das gesamte Element
  wrap=|
    # die eigentliche SQL-Query
  select{
       # Angabe des Feldes für die Sprache
    languageField=sys_language_uid
        # Limitierung auf 10 Einträge
    max=10
        # selectFields muss nicht angegeben werden, der default Wert ist *. Aus perfomance Gründen empfielt es sich aber nur die Felder hier anzugeben die auch benutzt werden
    selectFields=image,header
     
        # Where -Klausel, in diesem fall colPos=2 für die rechte Spalte
    where=colPos=2
  }
  renderObj=COA
  renderObj{
        # ein Image Objekt erstellen
    5=IMAGE
    5{
            # Objekt nur ausgeben wenn nicht leer
      required=1
      wrap=|
      file.import=uploads/pics/
      file.import.field=image
      file.width=100
      file.height=100
    }
        # Den Header des Content Elements ausgeben
    10=TEXT  
    10{
      required=1
      wrap=|
      field=header
    }
        # Folgendes TEXT Element gibt alle verfügbaren Felder aus, d.h. wenn man selectFields nicht setzt sieht man hier alle Felder die in der Datenbank vorhanden sind.
        #20=TEXT
        #20.data = debug:data
  }
}

 

 

Im Wesentlichen besteht das CONTENT Elemten aus 2 Teilen: dem select Teil und dem renderObj. Im select wird die eigentliche SQL Abfrage definiert und im renderObj wird definiert welche Felder wie formatiert ausgegeben werden.

Am flexibelsten ist man wenn man das renderObj als COA definiert, denn dann kann man darin beliebig viele andere cObject wie TEXT,IMAGE etc erstellen.

 

CONTENT Objekte können auch verschachtelt werden. Man definiert im renderObj noch ein CONTENT Objekt, welches dann auf die Felder des "oberen" CONTENT Elements zugreifen kann.

 

Folgendes Beispiel gibt die Überschrift der Seite aus, liest alle Unterseiten der aktuellen Seite aus und giebt das jeweils erste Element auf dieser Seite aus. Falls ein Bild vorhanden ist wird auch dieses ausgegeben, auch wird ein Link auf die entsprechende Seite erstellt und die ersten 20 Zeichen des Textes ausgegeben.

 

temp.sectionMenu=COA
temp.sectionMenu{
  5=TEXT
    # Titel der Übergeordneten Seite
  5.data=leveltitle:-2
  5.wrap=
  <h1>|</h1>
    # erstes CONTENT Objekt zum Auslesen der Unterseiten.
  10=CONTENT
  10{
    stdWrap.wrap=|
    table=pages
    select.orderBy=sorting
           # falls dieses Element als Sitemap eingefügt wird, den Startpunkt berücksichtigen
    select.pidInList.if.isTrue.field=pages
    select.pidInList.field=pages
    renderObj=COA
    renderObj{
      stdWrap.wrap=|
       
        		# Titel (und link auf die) Seite
      5=TEXT
      5.wrap=<b>|</b>
      5.field=title
      5.typolink.parameter.field=uid
        		# 2. CONTENT Objekt zum Auslesen des erstes Content Element der Seite
      10=CONTENT
      10{
        table=tt_content
        select.pidInList.field=uid
        select.where=colPos=0
        select.orderBy=sorting
        select.max=1
        renderObj=COA
         
          			#Bild auslesen 
        renderObj.2=IMAGE
        renderObj.2{
          wrap=|
            				# nur anzeigen wenn auch ein Bild vorhanden
          stdWrap.if.isTrue.field=image
          stdWrap.typolink.parameter.field=pid
          file.import=uploads/pics/
          file.import.field=image
            				# Höhe und Breite des Bilds
          file.width=100
          file.height=100
        }
         
          			#auslesen des bodytext
        renderObj.10=TEXT
        renderObj.10{
          field=bodytext
            				#bodytext nach 20 zeichen abschneiden, wenn möglich ganze wörter
          crop=20 | ... |1
        }
      }
        		# mehr link
      20=TEXT
      20.wrap=<b>|</b>
      20.value=[mehr]
      20.typolink.parameter.field=uid
    }	
  }
}

 

 

 

 

OptionSplit bei CONTENT Objekten

OptionSplit kennt man ja schon von Menüs, aber wie wendet man das ganze auf CONTENT Objekte an?

 

Wenn man in der TSREF nachliest, sieht man, dass viele Eigenschaften der Menü Objekte +opionSplit haben, jedoch keine anderen Objekte haben einen dementsprechenden Vermerk.

Lösen kan man das ganze indem man die split Funktion verwendet.

Prinzipiell funktioniert das ganze so, das man nach jedem Elemente das danach mit optionSplit ausgegeben werden soll einen Platzhalter setzt und diesen dann danach mit split zu ersetzt.

 

Folgendes Beispiel gibt die Überschrift und den Text der Inhaltselemente der aktuellen Seite aus und das in folgender Form :

 

<div class="first">Erstes </div>
<div class="second">zweites</div>
<div class="third">drittes</div>
<div class="middle1">mittleres farbe 1</div>
<div class="middle2">mittleres farbe 2</div>
<div class="middle1">mittleres farbe 1</div>
<div class="middle2">mittleres farbe 2</div>
<div class="last">letztes Element</div>

 

 

Typoscript:

 

#CONTENT Objekt erstellen
temp.contentToSplit=CONTENT
temp.contentToSplit{
  table=tt_content
  renderObj=COA
  renderObj{
        # An jedes ausgelesene Elemen am Ende ###SPLITTER### anhängen
    stdWrap.outerWrap = |###SPLITTER###
    10=TEXT
    10.field=header
    10.wrap=|<br>
    20=TEXT
    20.field=bodytext
    20.wrap=|<br>
  }
}

temp.content = COA
temp.content {
     # Den ausgelesenen Inhalt hierhin kopieren
  10 < temp.contentToSplit
  stdWrap.split {
        # mit hilfe der split funktion ###SPLITTER### ersetzen.
    token = ###SPLITTER###
        # die Reihenfolge im gewohnen optionSplit Stiel festlegen
    cObjNum = 1 || 2 || 3 |*| 4 || 5 |*| 6 || 7
        # Definieren wie genau an welcher position "gewrapt" wird
    1.current = 1
    1.wrap = <div class="first">|</div>
    2.current = 1
    2.wrap = <div class="second">|</div>
    3.current = 1
    3.wrap = <div class="third">|</div>
    4.current = 1
    4.wrap = <div class="middle1">|</div>
    5.current = 1
    5.wrap = <div class="middle2">|</div>
    6.wrap = <div class="last">|</div>
    6.current = 1
        # letzten splitter leer lassen, da ist ja dann nichtsmehr
    7.current = 1
  }
}

 

 

Dieser Ansatz lasst sich auch recht einfach auf das normale styles.content.get anwenden.

Beispiel:

 

#setzen des Platzhalters für alle tt_content elemente
tt_content.stdWrap.outerWrap = |###SPLITTER###
temp.content = COA
temp.content {
  10 < styles.content.get
  stdWrap.split {
    token = ###SPLITTER###
    cObjNum = 1 || 2 || 3 |*| 4 || 5 |*| 6 || 7
    1.current = 1
    1.wrap = <div class="first">|</div>
    2.current = 1
    2.wrap = <div class="second">|</div>
    3.current = 1
    3.wrap = <div class="third">|</div>
    4.current = 1
    4.wrap = <div class="middle1">|</div>
    5.current = 1
    5.wrap = <div class="middle2">|</div>
    6.wrap = <div class="last">|</div>
    6.current = 1
    7.current = 1
  }
}

 

 

Beispiele:

Content Element Navigation

Content Element die die Elemente einzeln anzeigt

10 letzten geänderten Inhaltselemente ausgeben

Random Content

 

Offizielle Dokumentation:

TSREF CONTENT

TSREF select

TSREF split

 



Comments


Klaus, 23-04-08 05:11:
Hallo,
danke fuer den Artikel.
Eine Frage: Sehe ich es richtig, dass dies NICHT bei Verwendung von TemplaVoila bzw. FCEs funktioniert?

Gibt es dafuer evtl. Loesungen?

mfg. klaus.
Michael, 12-09-08 17:52:
Hi,
Das Beispiel ist prima, aber einen kleinen Schönheitsfehler hat es leider trotzdem. Die Seiten die mit dem Seitentyp "Abstand" erstellt worden, werden auch angezeigt! Das macht nicht wirklich Sinn da dieses ja keine Seiten sind. Ich versuche schon ne zeitlang eine Lösung zu finden, aber leider bin ich noch nicht zu einer Lösung gekommen :(
Grüsse, michael
Seniore T, 11-05-09 15:57:
Tausend Dank! Konnte ich gut für alternierende Hintergrundfarben eine Tabellenabfrage ohne css_styled_content gebrauchen!
Michael, 12-04-10 19:23:
Hi, super vielen Dank für das tolle Skript. Ich habe nur ein Problem mit dem Anzeigen eines Bildes. Der Code dafür steht ja oben, aber woher nimmt der das Bild. Wenn ich unter den Seiteneigenschaften unter Ressources ein Bild hochlade, passiert jedenfalls nichts. Wäre super, wenn mir jemand helfen kann, vielen Dank!

Gruß

Michael
Sebastian, 14-04-10 18:42:
Hey du,

Crop finde ich ja ganz nett, aber wenn ich nen Crop anwende verliere ich alle Zeilenumbrüche, hast du vielleicht ne Möglichkeit die dennoch zu benutzen?

Sebastian
Zey, 11-07-11 08:23:
HI,
also ich hab das mal auf meiner Seite angewendet (hab aber eine Seite mit TemplaVoila). Bei mir wird im Teil:
..
renderObj.10{
field=bodytext
....
der bodytext nicht ausgegeben.
Woran könnte das liegen?
Björn, 02-03-12 22:46:
Anlehnend an dein Beispiel habe ich ein Snippet erstellt. Dieses funktioniert auch soweit ganz gut. Allerdings werden die Bilder im Inhaltselement "Text mit Bild" nicht angezeigt und die Formatierungen zerstört. Woran könnte dies liegen? Anbei das Snippet:

--
# Override part 20 of the setup that has been created by the core
tt_content.announcements_pi3.20 >
# make it a Content Object Array (COA)
tt_content.announcements_pi3.20 = COA
tt_content.announcements_pi3.20 {
# wrap the whole content with a div container
wrap = <div class="announcements_archive">|</div>
# set the rest to be uncached (COA_INT instead of COA)
10 = COA_INT
10 {
# wrap the output into a list
wrap = <ul class="recordlist">|</ul>
# get the records for this list
10 = CONTENT
10 {
# set the table
table = tt_content
select {
# set the pages containing the records
pidInList.field = pages
# set the recursion level
recursive = 250
# set the sorting for the DB query
orderBy = crdate DESC
}
# make the renderObj a COA to be able to add stuff before and after it
renderObj = COA
renderObj {
# use rendering of the default element "Text" AND "Text mit Bild" for the output
10 < tt_content.textpic
# and wrap each record as a list item
wrap = <li class="record">|</li>

#stdWrap.required = 1
#stdWrap.wrap = <li class="record">|</li>
10 = TEXT
10 {
field = header
dataWrap = <div class="csc-header" onclick="document.getElementById('content_{field:uid}').style.display='block';" style="cursor: pointer;"><h2>|</h2></div>
required = 1
}
20 = TEXT
20 {
field = bodytext
dataWrap = <div class="csc-textpic-text" id="content_{field:uid}" style="display: none; padding-top: 10px;">|</div>
required = 1
}
}
}
}
}
--
Sacha, 27-10-14 14:42:
Ab TYPO3 6.2 gibt es eine replace Funktion mit optionSplit, die bei CONTENT/renderObj nützlich sein kann. Hier ein Beispiel, bei dem Inhaltselemente mit jeweils einem Bild ausgegeben werden. Die Bilder bekommen dann je nach Position/Reihenfolge verschiedene CSS-Klassen zugewiesen:

lib.logo = COA
lib.logo {
10 < styles.content.get
10 {
select.pidInList = {$portal.pid.logos}
renderObj = COA
renderObj {
10 = TEXT
10 {
field = image
wrap = <img css_class src="|" />
}
}
stdWrap {
replacement.10 {
search = css_class
replace = || class="right" |*| class="right"
useOptionSplitReplace = 1
}
}
}
stdWrap {
stdWrap.wrap = <h1 class="clearfix">|</h1>
typolink {
parameter = {$portal.pid.root}
addQueryString = 1
ATagParams = class="startLink"
}
}
}

Kommentar hinzufügen

* - Pflichtfeld

*



*
*

Top 10 Updates

Nützliche Links geändert am  24-Apr-2013 06:31:02
Login geändert am  09-Sep-2010 09:31:35
Schöne Schriften mit Google Font API geändert am  20-Mai-2010 14:36:59
TS basierte Searchbox für Indexed Search geändert am  18-Mai-2010 16:26:54
TYPO3 SEO geändert am  30-Apr-2010 07:43:20
Suchmaschinenfreundliche grafische Überschriften in TYPO3 geändert am  30-Apr-2010 07:33:56
Erstellen eines einfachen Infocenters mit TYPO3  geändert am  17-Nov-2009 11:11:22
Funktionierendes Section Menu mit TemplaVoila geändert am  05-Mai-2009 10:42:40
"Nicht im Menü" in Sitemap anzeigen geändert am  05-Mai-2009 10:12:24
Implementation des DHTML Menüs von brainjar.com  geändert am  01-Feb-2009 13:01:36

Latest comments

22-Apr-2016 07:20:42
Stephan schrieb: Perfekt wäre es, wenn man dieses Beispiel für TYPO3 7.x ummünzen könnte.
Einfache Bildergalerie aus dem media Feld
12-Apr-2016 17:05:49
Peter schrieb: habs... Einfach noch 10.renderObj.header.10 = 10.renderObj.textpic.10 = ...
Andere Formatierung für erstes Element in TYPO3
12-Apr-2016 16:36:46
Peter schrieb: Wunderbar, auch wenn der Eintrag schon nen bisschen älter ist... .. klappt soweit T3...
Andere Formatierung für erstes Element in TYPO3
English
Suche: