Login / Status
developer.Resource
Home . Documentation . Document Library . Tutorials
Sponsors
hosted by punkt.deTYPO3 and Open Source MagazineAOE Media

1.2. Die Grundlagen

Einleitung

Dieser Abschnitt wird den Anfänger schnell damit vertraut machen, wie das TYPO3 Frontend (also die Website, die TYPO3 erzeugt) funktioniert. Es erklärt was TypoScript Templates, Content Objects und HTML-Templates sind. Wenn Sie diese Grundlagen schon kennen, können Sie schon zum nächsten Abschnitt übergehen. Auf jeden Fall sollten Sie das dummy package installieren und einige Seiten darin erstellen. Dies wird im folgenden besprochen:

Zielgruppe

Alle Entwickler, für die TYPO3 neu ist, unabhängig von ihren sonstigen Erfahrungen.

Einige Teile beziehen sich auf Technologien wie SQL, HTML, CSS und PHP. Der Inhalt ist im allgemeinen technischer Art, da er Sie durch die Installation des ”dummy”-Paketes führt und die Grundlagen der Templatefunktionaltät in TYPO3 erklärt.

Los geht's - Installation des ”dummy”-Pakets

Um schnell loslegen zu können werden wir ein neues Dateiframework und eine leere Datenbank für TYPO3 installieren. Am einfachsten geht das mit dem ”dummy“-Paket. Ein Paket oder ”package” enthält den allgemeinen TYPO3 Quellcode sowie die lokal benötigten Dateien und ggf. Datenbankinhalte - und somit die komplette Website. Im Falle des dummy-Pakets handelt es sich um eine leere Website ohne Inhalt. Aber dies ist für eine neues Projekt sehr nützlich.

Also laden Sie sich das "dummy”-Paket herunter und installieren Sie es auf Ihrem Webserver. Nach dem Entpacken rufen Sie einfach die Datei index.php auf und Sie werden durch folgende Schritte geführt:

Eingabe der Datenbankinformationen:

Erstellen einer neuen Tabelle:

Import der dummy Datenbank, "database.sql":

Das Backend aufrufen:

(Der Begriff Backend bezeichnet Anwendungen die auf einem Server ausgeführt werden, in diesem Fall das Administrationsinterface von Typo3.)Um diese Schritte erfolgreich durchlaufen zu können muss der Webserver Benutzer für die Datei localconf.php Schreibrechte besitzen (Sie werden darauf hingewiesen, falls dies nicht der Fall sein sollte) und Sie müssen weiterhin den Benutzernamen und das Passwort des Datenbankbenutzers kennen.

Erstellen einer Seitenstruktur

Das erste was jetzt zu tun ist, ist die Seitenstruktur festzulegen. Eine gute Seitenstruktur enthält Seiten auf mindestens zwei Ebenen. Auf jeden Fall müssen wir mit einer Startseite der untersten (root) Ebene beginnen.

Geben Sie einen Seitentitel ein, machen Sie die Seite sichtbar und speichern Sie sie:

Jetzt könnten Sie so weiter machen und die gesamte Seitenstruktur erstellen. Es gibt es aber einen Assistenten, um diese Schritte viel einfacher durchzuführen. Wechseln Sie in das Modul: "Funktionen“, wählen Sie den Assistenten "Erzeuge mehrere Seiten”, geben Sie mehrere Seitentitel ein und klicken Sie anschließend auf die Schaltfläche "Seiten erstellen”.

(Für diesen Assistenten muss die Extension "Create multiple pages” installiert sein.)

Als Ergebnis sollten Sie einen solchen Seitenbaum erhalten:

Jetzt erstellen Sie weitere Seiten auf der nächsten Ebene, das Ergebnis sollte dann so aussehen:

Seitenbaum und Template Datensätze (template records) erklärt

Klicken Sie auf das Icon einer Seite und wählen Sie dann "Anzeigen” aus:

Das Ergebnis der Ansicht der Seite "Licensing“ sieht wie folgt aus:

Die Seite "Licensing" hat die uid "5” und zum Betrachten des Seiteninhalts muss der Parameter "id=5” an das index.php Skript des Frontends übergeben werden.

Die Ausgabe besagt nun aber, dass kein Template gefunden wurde. Das heißt, dass bei der Erzeugung der Seite kein Template gefunden wurde - ausgehend von der untersten Ebene des Seitenbaums für die Seite mit der id 5. Zum besseren Verständnis hier etwas Theorie zur Erklärung:

TYPO3 ist ein CMS für mehrere Websites. Das bedeutet, dass Sie in einer Seitenstruktur unendlich viele Websites haben können. Jede Site in der Seitenstruktur muss eine Startseite haben, die dadurch gekennzeichnet ist, dass Sie ein Template enthält. Dieses Template muss als "Rootlevel” gekennzeichnet sein. Wenn also ein Template mit dieser "Rootlevel”-Kennzeichnung in einer Seite enthalten ist, heißt das, dass "ab jetzt eine neue Website innerhalb der Seitenstruktur beginnt”.

Die "root line“ (Ursprungspunkt) ist ein Synonym für "Pfad“. Man kann zum Beispiel auch sagen, dass die Seite "License A” in der Seitenstruktur den Pfad "TYPO3 > Root page > Licensing > License A” hat. Wenn wir die id von "License A” an das Skript index.php übergeben, wird bei der Erzeugung der Seite, ausgehend von der Position von "License A“ rückwärts bis zum Ursprungspunkt des Seitenbaumes (dem "page tree root“) nach einem Template Datensatz gesucht, der die Darstellung der Seite definiert.

Erstellen eines Template Datensatzes (template record)

Was wir also machen müssen ist einen Datensatz für ein Template auf der "Root page“ zu erstellen. Der einfachste Weg dafür ist das "Template” Modul zu benutzen.

Die nächste Abbildung zeigt Ihnen diese Ansicht des "Template” Moduls, das Sie später zur Bearbeitung der Vorlage verwenden werden:

Jetzt schauen wir uns aber erst mal die "Root page" mit dem "Liste" Modul an:

Wie Sie sehen gibt es dort ein "Template” auf der "Root page”.

Diese Vorlage enthält die grundlegenden Anweisungen für die Generierung der Website durch die Frontend Engine ab diesem Punkt, welche Funktionen sie enthält, wie sie konfiguriert ist usw. Ein Template wird immer benötigt um mit einer neuen Website in TYPO3 zu beginnen (unter Verwendung der Standard Frontend Engine). Sie können selbstverständlich individuell festlegen, wie viel von Ihrem Webdesign das Template direkt kontrolliert; Sie können eine komplette Website in einem Template programmieren. Sie können das Template aber auch anweisen eine selbst programmierte PHP-Funktion aufzurufen, die Ihre Seite rendert und den gesamten Seiteninhalt liefert (basierend auf XML, XSLT oder anderen Datenbanken - wie immer Sie mögen. Sie können ebenso einen Mittelweg beschreiten, der das beste beider Welten vereinigt. Und genau das ist es, was wir hier beschreiben.

Schauen wir uns den Inhalt des Templates an. Dort gibt es drei Felder von besonderem Interesse:

Der "Template title” ist nur der Titel des Templates und wird sonst nirgendwo angezeigt.

Der "Website title” wird den Seitentiteln vorangestellt, so wie zwischen den <title> Tags jeder herkömmlichen Seite.

Im "Setup” Feld fügen Sie die Anweisungen ein, wie die Seite auf verschiedene Weisen dargestellt werden soll. Diese Anweisungen werden in einer hierarchischen Informationsstrukur eingebunden, die von der TypoScript Syntax vorgegeben wird. Da die Anweisungen des Feldes "Setup” durch die TypoScript-Syntax definiert sind, werden Templates häufig als "TypoScript Templates” bezeichnet.

Die Einstellungen "Clear constants” und "Clear setup” bedeuten, dass kein TypoScript Konfigurationscode, falls vorhanden, von den Templates höher im Baum (näher an der Wurzel) übernommen wird. Diese Checkboxen sollten für die Templates angekreuzt werden, welche als Basistemplate dienen sollen ("Rootlevel”).

Die "Rootlevel” Checkbox sagt nur aus: "diese Vorlage kennzeichnet den Beginn einer neuen Website”.

Nun zurück zur Ansicht der der Seite "Licensing”:

Jetzt erscheint etwas anderes. Folgendes ist passiert:

  • Anfrage der Seite mit der uid "5” ( 1 )

  • Auswahl des ersten Template Datensatzes für diese Seite (pid=5); nicht gefunden!

  • Da für die Seite mit der uid "5“ kein Template gefunden wurde, wird die vorherige Seite in der Hierarchie überprüft ( 2 )

  • Die "Root page” (id=1) hat ein Template. Also wurde ein Template gefunden!

  • Da ein Template für die Seite mit der uid "1” gefunden wurde, wird überprüft, ob "Rootlevel” gesetzt ist ...

  • Ja "Rootlevel” ist gesetzt. Gut, das ist der Anfang der Website, also ...

    • Parsen (Analyse und Verarbeitung) der TypoScript Konfiguration im Feld "Setup”.

    • Führe die Anweisungen im Feld "Setup” aus.

Grundlagen der Anweisungen im Feld "Setup”

Wenn ein Template Datensatz vorhanden ist, liegt das Hauptinteresse beim Feld "Setup” dieses Templates. In dieses Feld tragen Sie einen Satz Anweisungen ein, die festlegen was geschieht, wenn wir eine Seite im Frontend aufrufen.

Die beste Möglichkeit dieses Feld zu bearbeiten ist im "Template” Modul mit der Ansicht "Info/Modify”:

Klicken Sie auf das "Bearbeiten” Symbol und es geht los:

Hier eine kurze Erklärung:

Das PAGE Object ( 1 )

Zuerst definieren wir eine neues Objekt auf oberster Ebene ("Toplevel Object” - TLO), "page” genannt. Objekttyp ist "PAGE” (sie können auch einen Frameset definieren; siehe TSref). Anstatt "page” könnten Sie auch andere Bezeichnungen wählen, mit Ausnahme reservierter TLOs, siehe TSref about Toplevel Objects.Als Eigenschaft für das "page” Objekt definieren wir die vorgeschriebene Eigenschaft "typeNum” und setzen ihren Wert auf 0 (Null).

Das bedeutet jetzt, dass das Toplevel Objekt "page” die Standardbehandlung jedes Seitenaufrufs innerhalb eines Zweiges des Seitenbaums vorgibt, in dem unser Template den Beginn der Website kennzeichnet.

Nun wollen wir dem "page” Objekt Anweisungen geben, was es zu tun hat. Dazu müssen wir einen Blick auf die möglichen Eigenschaften für PAGE Objekte werfen. Einige Eigenschaften sind Metaeigenschaften wie die "Config-" oder "includeLibs" Eigenschaften. Andere dienen dazu, zu definieren, welche HTML-Ausgaben dieses PAGE Objekt erzeugen soll.

Der bedeutendste Satz der Eigenschaften für PAGE Objekte ist die numerische Liste der Inhaltsobjekte (content objects - cObjects). Jedes dieser Content Objects kann eine Zeichenkette mit HTML-Inhalt übertragen, der zusammen den Inhalt zwischen den <body> Tags der Seite bildet.

Das Content Object ( 2 )

Im Beispiel oben ist ein sehr einfaches Content Object - TEXT - definiert, mit dem Index "10” innerhalb der numerischen Liste der Content Objects im PAGE Object "page”. Dieses cObject hat die Eigenschaft "value”, die auf "HELLO WORLD” gesetzt wurde. Dies hat zur Folge, dass dieser Text vom cObject zurückgegeben wird und zum Inhalt auf der Website zwischen den <body> Tags wird:

Die möglichen Eigenschaften für das TEXT cObject finden Sie hier.

TypoScript - keine Programmiersprache

Bevor wir fortfahren, beachten Sie bitte, dass TypoScript keine prozedurale Programmiersprache ist. Sie könnten leicht zu dieser Annahme kommen. Wenn Sie Erfahrung mit anderen Programmiersprachen haben und wissen wie sie arbeiten, kann dies ein gefährlicher Cocktail werden mit dem Ergebnis totaler Verwirrung. TypoScript konfiguriert tatsächlich nur das System, um in einer bestimmten Weise zu agieren.

Um zu wissen, was TypoScript wirklich ist, um den Unterschied zu verdeutlichen und zum Verständnis, wie es in TYPO3 eingesetzt wird, empfiehlt sich ein Blick in dieses Dokument, das die Grundlagen vermittelt.

Weitere Beispiele zu PAGE und cObjects

Dieser Abschnitt stellt Ihnen ein paar weitere Beispiele zu PAGE und cObjects vor, damit Sie das Konzept völlig erfassen. Wenn Sie dies verstehen, dann verstehen Sie auch "TypoScript Templates” wenn die Strukturen komplexer werden.

Zwei cObjects

Was passiert, wenn Sie ein weiteres Content Object einfügen:

# Default PAGE object:
page = PAGE
page.typeNum = 0
# Content object one:
page.10 = TEXT
page.10.value = HELLO WORLD!
# Content object two:
page.20 = TEXT
page.20.value = HELLO UNIVERSE!

(Übrigens, Zeilen die mit ”#” oder ”/” beginnen sind Kommentare.)

Ausgabe:

<body bgcolor="#FFFFFF">
HELLO WORLD!HELLO UNIVERSE!
</body>

So wie erwartet werden mehrere Content Objects einfach aneinander gehängt.

Ändern der Reihenfolge

Was passiert, wenn die Reihenfolge der Definitionen geändert wird?

# Default PAGE object:
page = PAGE
page.typeNum = 0
# Content object two:
page.20 = TEXT
page.20.value = HELLO UNIVERSE!
# Content object one:
page.10 = TEXT
page.10.value = HELLO WORLD!

Ausgabe:

<body bgcolor="#FFFFFF">
HELLO WORLD!HELLO UNIVERSE!
</body>

Das gleiche: die Reihenfolge der Ausgabe entspricht dem Index in der Liste.

Dynamischer Inhalt

Was ist aber nun, wenn wir wollen, dass das TEXT cObject den Seitentitel einfügt?

Schauen Sie dazu in die TSref um festzustellen, ob das TEXT cObject Eigenschaften besitzt, die es Ihnen erlauben, dieses zu realisieren. Sieht ganz so aus. Außer der "value” Eigenschaft hat das TEXT cObject auf der gleichen Ebene auch "stdWrap” Eigenschaften (klicken Sie hier), die benutzt werden können, um Daten dynamisch zu holen und zu verarbeiten.

Da die Übertragung des cObjects TEXT im Hauptbereich des PAGE Objekts erfolgt, wird der aktuelle Datensatz der Datensatz der aktuellen Seite. Wenn sich also die stdWrap Eigenschaft "field” auf einen Feldnamen bezieht, so wird der Inhalt  vom aktuellen Seitendatensatz geholt. An dieser Stelle wird das Feld "title“ den Seitennamen beinhalten (dieses erfordert selbstverständlich Wissen darüber, welche Felder in der Seitentabelle verfügbar sind!)

# Default PAGE object:
page = PAGE
page.typeNum = 0
# Content object outputting current page title:
page.10 = TEXT
page.10.field = title

Ausgabe:

<body bgcolor="#FFFFFF">
Licensing
</body>

Da die aktuelle Seite die "Licensing” Seite war, war das auch der Titel bei der Ausgabe.

stdWrap Eigenschaften

Da wir nun mit den "stdWrap” Eigenschaften experimentieren, können wir den Wert mit weiterem Ausgabetext versehen und in den unterschiedlichen Weisen verarbeiten etc.:

# Default PAGE object:
page = PAGE
page.typeNum = 0
# Content object outputting current page title:
page.10 = TEXT
page.10 {
  field = title
  crop = 8 | ...
  case = upper
  wrap = This is the truncated page title: <b> | </b>
}

(Beachten Sie bitte wie ich die Formatierung in TypoScript verändert habe, so dass die Eigenschaften in geschweifte Klammern gesetzt wurden. Diese Syntax von TypoScript macht es einfacher, viele Eigenschaften auf der gleichen Ebene zuzuweisen. Im Endergebnis macht es aber keinen Unterschied, alle Eigenschaften mit dem vollen Objektpfad "page.10” festzulegen.)

Ausgabe:

<body bgcolor="#FFFFFF">
This is the truncated page title: <b>LICENSIN...</b>
</body>

Beachten Sie auch, wie der Text den Seitentitel einschliesst und desweiteren in Großbuchstaben umgewandelt und auf acht Zeichen begrenzt wurde und wie das "...” angehängt wurde.

Die selbe Ausgabe hätten wir auch mit einem anderen cObject erreichen können, nämlich genannt "HTML” - der einzige Unterschied ist, dass alle stdWrap Eigenschaften zur "value” Eigenschaft des HTML cObjects gehören und nicht Eigenschaften des cObjects selbst sind:

# Default PAGE object:
page = PAGE
page.typeNum = 0
# Content object outputting current page title:
page.10 = HTML
page.10.value {
  field = title
  crop = 8 | ...
  case = upper
  wrap = This is the truncated page title: <b> | </b>
}

Es ist nur eine Frage der persönlichen Vorlieben und Ihres Stils ob Sie TEXT oder HTML cObjects einsetzen.

Inhalt aus PHP Skripten

Wenn Sie möchten können Sie den Inhalt auch sehr einfach über PHP Skripte einfügen. Dies ist eine sehr empfohlene Vorgehensweise, wenn Sie eine programmgesteuerte (bedingte) Ausgaben benötigen, was TypoScript nicht kann, da die cObjects und ihre Eigenschaften keine prozedurale Programmierung erlauben. Sie erinnern sich, dass dies nur vorprogrammierte Objekte sind, die auf die gesetzten Eigenschaften reagieren, und nichts weiter.

Was Sie dazu brauchen ist das cObject USER.

Zuerst erstellen wir eine PHP -Datei in fileadmin/userfunctions.php:

<?php
class user_functions {
/**
 * Multiplies the current page ID with $conf["factor"]
 */
function multiplyTest($content,$conf){
$currentPageUid = $GLOBALS['TSFE']->id;
$factor = intval($conf['factor']);
return $currentPageUid * $factor;
}
}
?>

Dann konfigurieren wir ein cObject vom Typ USER, welches diese Funktion mit einem einfachen Parameter "factor” aufruft:

# Default PAGE object:
page = PAGE
page.typeNum = 0

page.includeLibs.some_random_id_string = fileadmin/userfunctions.php

page.config.admPanel = 1
# Content object outputting current page title:
page.10 = HTML
page.10.value = The page ID, {field:uid}, multiplied with 15 is:
page.10.value.insertData = 1
page.10.value.wrap = <b> |</b> <br />

page.20 = USER

page.20.userFunc = user_functions->multiplyTest

page.20.factor = 15

Und die Ausgabe sollte so aussehen:

Wie Sie sehen, haben wir einige "Metaeigenschaften” definiert, die nicht direkt mit der Inhaltsausgabe in Beziehung stehen:

page.includeLibs.some_random_id_string = fileadmin/userfunctions.php
page.config.admPanel = 1

"includeLibs” ist eine Eigenschaft, die es erlaubt, eine Liste von einzubindenden PHP-Dateien zusammenzustellen (Klassen- und Funktionsbibilotheken!), die eingebunden werden, bevor die Seite erzeugt wird. "config” erlaubt eine Menge an Konfigurationsoptionen für das allgemeine Verhalten dieses PAGE Objekts. In diesem Falle wurde das "Admin Panel” am Seitenende eingefügt.

Für dieses Beispiel sollten Sie sich ein paar Minuten Zeit nehmen. Beachten Sie wie die Eigenschaft "factor” des Objekts USER in der PHP-Funktion verfügbar ist. Beachten Sie, wie sich die PHP-Funktion die Seiten-ID "holt“. Beachten Sie, wie das "Admin Panel” eingebunden wurde. Sie können eine Menge davon lernen, wenn Sie mit diesem kleinen Beispiel spielen. Lassen Sie ihrer Phantasie freien Lauf, da Sie dadurch ein gutes Gefühl der Steuerung bekommen.

Der Object Browser

Der Object Browser im Template Modul ist ein unentbehrliches Werkzeug zum Überprüfen der hierarchischen Struktur Ihrer Template Datensätze.

Wie Sie sehen können, werden die gelesenen TypoScript Werte in dieser wohl organisierten Baumstruktur ausgegeben. Somit können Sie überprüfen, ob jede Eigenschaft, die Sie eingestellt haben, sich an der jeweils korrekten Position befindet und es ist Ihnen sogar erlaubt, einen einzelnen Wert zu bearbeiten, wenn Sie sicherstellen, dass die Option "Enable object links” angewählt ist.

Wenn Sie zu "Info/Modify” zurückgehen sehen Sie, dass der Inhalt des Feldes Template Setup verändert wurde.

Der Object Browser ist nicht intelligent genug die Zeile mit "page.20.factor = 15” abzuändern. Er fügt einfach eine neue Zeile am Ende ein, die den Inhalt des vorher gesetzten Wertes überschreibt. Sie können dies manuell bereinigen. Daraus ergibt sich, dass der Object Browser eine sichere Möglichkeit für zur Einstellung dieser Werte bietet, da immer der richtige Objektpfad genutzt wird.

Eine Bedingung ausprobieren

Wir könnten diese Situation tatsächlich nutzen, um die Anwendung von "Bedingungen” zu demonstrieren. Eine sehr einfache Bedingung soll soll überprüfen, welcher Webbrowser verwendet wird:

# Default PAGE object:
page = PAGE
page.typeNum = 0
page.includeLibs.some_random_id_string = fileadmin/userfunctions.php
page.config.admPanel = 1
# Content object outputting current page title:
page.10 = HTML
page.10.value = The page ID, {field:uid}, multiplied with 15 is:
page.10.value.insertData = 1
page.10.value.wrap = <b> |</b> <br />
page.20 = USER
page.20.userFunc = user_functions->multiplyTest
page.20.factor = 15

[browser = msie]

page.20.factor = 30

page.10.value = The page ID, {field:uid}, multiplied with 30 is:

[global]

Im Microsoft Internet Explorer sieht das dann so aus:

In allen anderen Browsern so:

Nochmals zu PAGE Objekten

OK, dies soll kein allgemeiner Kurs sein um Templates nur mit cObjects zu gestalten - in diesem Handbuch benutzen wir hauptsächlich TEMPLATE, USER und HMENU Objekte und kombinieren sie mit vordefiniertem TypoScript Code in statischen Templates um unsere Ziele zu erreichen. Die eigentliche Beschreibung von Objekten und ihren Eigenschaften finden Sie im TSref. Wenn Sie Beispiele für die Benutzung dieser Objekte suchen, schauen Sie bitte in TypoScript by Example.

Mit diesen zwei Punkten möchte ich dann im Übrigen zum Ende kommen:

Die Relevanz von "&type=”

Im folgenden Beispiel ist nicht nur ein PAGE Objekt definiert. Desweiteren ist noch das TLO "another_page” als PAGE Objekt definiert, aber "typeNum” ist auf "1” gesetzt. Das bedeutet, dass die PAGE "page” als Standardbearbeitung von Seitenanfragen definiert ist, während "another_page” jene Seiten betrifft, welche mit dem Parameter "&type=1” zusätzlich zum id-Parameter aufgerufen werden.

page = PAGE
page.typeNum = 0
page.10 = TEXT
page.10.value = HELLO WORLD!
another_page = PAGE
another_page.typeNum = 1
another_page.10 = TEXT
another_page.10.value = HELLO UNIVERSE

Die Ausgabe ist dann:

Hier der Objektbaum:

Kopieren von Objekten

Es kann schnell sehr praktisch werden, den TypoScript Konfigurationscode Ihres Templates in Einheiten verschiedener Bereiche/Funktionen aufzuteilen um diese dann am Ende des Templates zusammenzufügen, indem sie an die richtige Positionen kopiert werden. Dies schließt ggf. ein Aufspalten der Einheiten in eine Hierarchie von eingebundenen Template Datensätzen ein, die somit eine Wiederverwendung von TypoScript zulässt. Darüber erfahren Sie später mehr.

Die Haupteigenschaft von TypoScript, die dieses erlaubt, ist die Syntax zum Kopieren der Objekte von einem Zweig des Objektbaums in einen anderen. Dazu dieses Beispiel:

# Make temporary version of the first cObject:
temp.world = TEXT
temp.world.value = HELLO WORLD!
# Make temporary version of the second cObject:
temp.universe = TEXT
temp.universe.value = HELLO UNIVERSE!
# Default PAGE object:
page = PAGE
page.typeNum = 0
page.10 < temp.world
page.20 < temp.universe

Das Ergebnis ist - selbstverständlich - dieses:

<body bgcolor="#FFFFFF">
HELLO WORLD!HELLO UNIVERSE!
</body>

Wenn Sie in den Object Browser schauen, werden Sie bemerken, dass die Objekte von "temp. ...” in die Pfade "page.10” und "page.20” kopiert wurden. Wir könnten natürlich erwarten, dass die TLOs von "temp” ebenfalls im Baum zu sehen wären, aber das ist nicht der Fall. Der Grund hierfür ist, dass die TLOs "temp.” und "styles.” gelöscht werden, da sie während des Parsens in einem temporären Objekt-Bereich verfügbar sind, danach aber nicht mehr erreichbar sind.

Wenn wir unsere Objekte innerhalb des Baums sehen möchten, können wir ein anderes TLO benutzen:

# Make temporary version of the first cObject:
MY_TLO.world = TEXT
MY_TLO.world.value = HELLO WORLD!
# Make temporary version of the second cObject:
MY_TLO.universe = TEXT
MY_TLO.universe.value = HELLO UNIVERSE!
# Default PAGE object:
page = PAGE
page.typeNum = 0
page.10 < MY_TLO.world
page.20 < MY_TLO.universe

... und das TLO "MY_TLO" ist noch vorhanden

Referenzen - keine Kopien

Dies bedeutet auch, dass wir eine Referenz auf die Objekte in MY_TLO.* erstellen können, da für Referenzen auf cObjects erforderlich ist, dass sie in der Struktur auch noch nach dem Parsen vorhanden sind (im Gegensatz zu den "temp” und "styles” TLOs). Das Skript kann dazu wie folgt umgeschrieben werden:

# Make temporary version of the first cObject:
MY_TLO.world = TEXT
MY_TLO.world.value = HELLO WORLD!
# Make temporary version of the second cObject:
MY_TLO.universe = TEXT
MY_TLO.universe.value = HELLO UNIVERSE!
# Default PAGE object:
page = PAGE
page.typeNum = 0
page.10 =< MY_TLO.world
page.20 =< MY_TLO.universe

Es sieht nur wie eine kleine Veränderung aus, hat aber eine immense Auswirkungen, da Objekte NICHT kopiert werden, sondern referenziert.

Aus dieser Methode ergeben sich für uns einige praktische Auswirkungen, aber auch Beeinträchtigungen. Das überzeugende Argument für Referenzen ist jedoch, dass ein cObject, welches in einem Baum definiert wird, mehrfach innerhalb einer Struktur ohne weiteren Speicherverbrauch für Duplikate genutzt werden kann. Ebenfalls schwierig zu handhaben wäre auch das Überschreiben der Eigenschaften aller Duplikate in einem Baum. Ein Beispiel zu diesem Problem finden Sie am Ende von Teil 2 in diesem Tutorial.

Hinweis:Referenzen wie diese sind nicht Teil der eigentlichen TypoScript-Syntax. Es handelt sich hierbei um eine Möglichkeit Eigenschaft, die intern von den cObjects bereitgestellt wird. Folglich können Referenzen nur bezogen auf cObjects genutzt werden; in Verbindung mit keinem anderen Objekttyp oder und keiner anderen Objekteigenschaft können Referenzen eingesetzt werden (es sei denn, dies wird ausdrücklich angemerkt).

Löschen des Cache (Zwischenspeichers)

Abschliessend sollten Sie noch wissen, dass wenn Sie Änderungen an einem Template Datensatz vorgenommen haben, der gesamte Zwischenspeicher (cache) gelöscht wird. Dies ist erforderlich da während des Parsens eines TypoScripts durch Typo3 die als Ergebnis zurückgelieferte Struktur im Cache gespeichert wird, so dass sie beim nächsten Seitenaufbau erneut "hervorgeholt“ werden kann. Jedoch bedeutet dies auch, dass Änderungen, die direkt im List-Modul an den Templates vorgenommen werden, den Cache nicht leeren - das müssen Sie manuell tun, über den Link unterhalb des Menüs im linken Frame.

Bevor Sie also ein merkwürdiges Verhalten als Bug melden, vergewissern Sie sich grundsätzlich, dass es nicht an immer noch zwischengespeicherten, inzwischen veränderten Templates oder Extensions liegt.