Auf dem TYPO3-Camp München (t3cm11) habe ich einige Tricks zum Thema „Datenbankabfragen mit TypoScript” vorgestellt. Schwerpunkt war die Darstellung einzelner Felder aus der Datenbank. Im Folgenden stelle ich eine kurze Zusammenfassung des Vortrags mit Beispielen vor.

TypoScript ermöglicht den Zugriff auf Datenbankfelder. Man kann sich deshalb in vielen Fällen den Import (oder das Erstellen) von Extensions sparen, wenn man TypoScript nutzt. Als Beispiel wird tt_news verwendet, da diese Extension eine ganze Reihe interessanter Datenbankfelder mit sich bringt.

Es gibt im Wesentlichen drei Elemente, die Datenbankabfragen ermöglichen:

  • RECORDS
  • CONTENT
  • stdWrap-Funktionen: field und data

RECORDS-Objekt

Das RECORDS-Objekt ist relativ einfach, bietet jedoch relativ wenige Möglichkeiten. Eine Beispielabfrage wäre folgende:

Das Listing zeigt wie mit dem RECORDS-Objekt die Überschrift der News mit der ID 1 ausgegeben wird. Die Angabe von sources ist dabei zwingend notwendig. conf definiert die Art der Ausgabe, d.h. welche Felder ausgegeben werden sollen. Statt eines TEXT-Objekts könnte man hier beispielsweise ein COA-Objekt verwenden, um komplexere Ausgaben zu erzeugen.

Hier ein Beispiel dazu:

In diesem Beispiel werden die drei News mit den IDs 1, 2 und 3 ausgegeben. Die Ausgabe beschränkt sich auf den Titel und den Anfang des eigentlichen News-Textes.

RECORDS eignet sich also zur Ausgabe einzelner Datensätze oder einer Liste. Allerdings bietet es deutlich weniger Möglichkeiten als CONTENT.

Datenbankabfragen mit CONTENT

CONTENT kennt man normalerweise aus dem klassischen Templating. Allerdings erlaubt CONTENT, ähnlich wie RECORDS, die Ausgabe und das Zusammenstellen einzelner Felder. Außerdem erlaubt CONTENT über die select-Funktion wesentlich ausgefeiltere Datenbankabfragen mit JOINs u.ä. Ich empfehle daher die Verwendung von CONTENT, wenn man sich nicht sicher ist, ob man CONTENT oder RECORDS verwenden will.

Das Beispiel der letzten Listing würde mit dem CONTENT-Objekt folgendermaßen aussehen:

Knackpunkt bei CONTENT ist die Verwendung der wenig bekannten Funktion renderObj. Diese erwartet ein cObject, z.B. ein COA, das die Ausgabe steuert.

Es gibt bei CONTENT jedoch auch Einschränkungen. So wird lediglich der Zugriff auf Tabellen mit den Präfixen „tt_”, „tx_”, „ttx_”, „fe_” oder „user_”. Auch die pages-Tabelle ist abgedeckt. Damit sind praktisch alle Standardtabellen und Extensions abgedeckt, es gibt jedoch hin und wieder Fälle, in denen diese Einschränkung greift. Außerdem muss in der select-Funktion zwingend das Feld pidInList gesetzt werden. Diese Seiten-Id ist im obigen Beispiel 64 und muss in der Regel per Hand gesetzt werden, was beim Kopieren von TS-Code auf andere Seite lästig sein kann (Man könnte freilich eine Konstante definieren…).

Das CONTENT-Objekt bietet also ebenfalls schöne Möglichkeiten zur Darstellung einzelner Datenfelder an.

stdWrap-Funktionen data und field

data und field bieten bekanntermaßen in TEXT-Objekten die Möglichkeit, Datenfelder darzustellen. In den obigen Listings befinden sich bereits Beispiele für field. data bietet darüber hinaus eine sehr direkte Möglichkeit, einzelne Daten anzuzeigen:

In diesem Fall wird der Titel der News mit der ID 1 direkt ausgegeben. Die Handhabung ist also einfach und kurz und ermöglicht einen einfachen Zugriff auf einzelne Datenfelder.

Wenn man die ID dynamisch übermittelt bekommt, z.B. über Get/Post-Variablen, kann man die Überschrift ebenfalls mit dieser Methode erzeugen. Die Get-Variable in der URL sei beispielsweise tt_news[uid]=2. Folgendes Listing verwendet diese Variable und zeigt die Überschrift je nach übergebener ID an:

Hier wird ein wenig data und wrap-Magie angewendet.

Zunächst wird der Wert per GP (=Get/Post) aus der übergebenen Variable geholt. In unserem Fall wäre der Wert des Feldes dann 2. Dieser Wert wird gewrapped, und zwar mit einer Datenbank-Feld-Abfrage in geschweiften Klammern. Als Ergebnis enthielte das Feld nun {DB:tt_news:2:title}. Dieser Inhalt wird nun per insertData nochmals geparst und alle Werte zwischen geschweiften Klammern mit Dateninhalten ersetzt. Mit anderen Worten: Die Datenbankabfrage wird gestartet und der Titel der News mit der Id 2 geholt und dargestellt.

Fazit

Man könnte noch viele weitere Beispiele vorstellen. Ziel war es an dieser Stelle, eine kurze Einführung in die verschiedenen Möglichkeiten von TypoScript zu geben. Tatsächlich kann man mit wenigen weiteren Zeilen Inhalte dynamisch gestalten, indem man z.B. per typolink Parameter in die URL schreibt und diese auf einer anderen Seite ausliest, um Datenfelder dynamisch anzeigen zu lassen. Dies sind aber fortgeschrittene Themen, die ich vielleicht beim nächsten Camp zeigen werde.

Links