Die wahnsinns TS-Eigenschaft: stdWrap

Bitte bedenkt, dass die folgenden Eigenschaften immer in der Reihenfolge ausgeführt werden, wie Sie hier aufgelistet sind. 

setContentToCurrent

Typ: Boolean, stdWrap (seit TYPO3 6.1)

Bei Content handelt es sich um den aktuellen Inhalt eines Elements. Im Beispiel setzen wir diesen Inhalt mit der value-Eigenschaft des TEXT-Objektes. Bei Current handelt es sich um eine Art Zwischenablage. Normalerweise wird diese "Zwischenablage" von außen durch Extensions oder durch andere TypoScript-Eigenschaften gefüllt, aber mit setContentToCurrent, könnt Ihr diese Zwischenablage selber mit Inhalt füllen, um dann später wieder darauf zurückgreifen zu können. Ja, man könnte sagen, es ist eine Art Copy&Paste.

page.123 = TEXT
# Setze Inhalt auf: Kopier mich
page.123.value = Kopier mich
# Kopiere den Inhalt in die Zwischenablage
page.123.setContentToCurrent = 1
# Überschreibe den Inhalt mit: Überschrieben
page.123.override = Überschrieben
# Hole den Wert wieder aus der Zwischenablage und überschreib den Wert von override
page.123.stdWrap.current = 1
# Es wird nun wieder "Kopier mich" ausgegeben

Weiterführende Informationen und Beispiele

addPageCacheTags Seit TYPO3 6.1

Typ: string / stdWrap

Seit der Einführung des CachingFrameworks in TYPO3 4.3, werden allen Cacheeinträgen Tags, eine Art Kategorie, zugeordnet. Für jeden Seitencacheeintrag wird diesem Eintrag der Tag pageId_[SeitenId] zugeordnet. Wenn Ihr den ClearCache-Button im Listenmodul anklickt, dann wird diesem Befehl die ID der aktuellen Seite mitgegeben und damit z.B. der Cache-Tag pageId_24 generiert und damit alle Cacheeinträge der Seite 24 entfernt. Ihr merkt bestimmt selbst, dass die Sinnhaftigkeit etwas fragwürdig ist, wenn jede Seite ihren eigenen individuellen Cache-Tag erhält. Besser wäre es doch, wenn man gleich mehrere Seiten mit einem Cache-Tag versehen könnte. Z.B. alle Seiten, die das News-Plugin beinhalten. Wäre es nicht klasse, wenn ich in dem StorageFolder der News einen Datensatz speichere und im gleichen Zuge der Cache aller News-Seiten geleert würde? Genial. Bisher musste im TSConfig des News-StorageFolders folgende Zeile angegeben werden:

TCEMAIN.clearCacheCmd = 23,54,756,83,234,77,123,47,324

Diese Liste muss natürlich mit jeder weiteren Seite, die das News-Plugin beinhaltet, erweitert werden. Mit addPageCacheTags wird der Spieß nun umgedreht. Auf allen Newsseiten könnt Ihr folgendes TypoScript einbauen:

page.123 = TEXT
page.123.addPageCacheTags = cacheTagForNews

Für der StorageFolder wird nun nur noch folgende Zeile benötigt, um den Cache aller Seiten mit News-Plugin zu leeren, wenn dort ein Datensatz bearbeitet wird:

TCEMAIN.clearCacheCmd = cacheTag:cacheTagForNews

setCurrent

Typ: string, stdWrap

Funktioniert ähnlich wie setContentToCurrent, nur mit dem Unterschied, dass Ihr nicht erst Inhalt erzeugen müsst (z.B. mit der value-Eigenschaft), um diesen dann in die Zwischenablage zu kopieren, sondern, Ihr könnt den Inhalt mit setCurrent direkt setzen. Die beiden folgenden Beispiel kopieren den gleichen Text in die Zwischenablage, jedoch gibt das obere Beispiel den Text "Kopier mich" im Frontend aus, während das untere Beispiel keine Ausgabe produziert.

page.123 = TEXT
page.123.value = Kopier mich
page.123.setContentToCurrent = 1

page.124 = TEXT
page.124.setCurrent = Kopier mich

Weiterführende Informationen und Beispiele

lang

Typ: Array mit ISO2 Einträgen

Bei mehrsprachigen Webseiten könnt Ihr mit dieser Eigenschaft Texte für die jeweilig ausgewählte Sprache erstellen. Es wird dann nicht mehr grundsätzlich der Wert aus der value-Eigenschaft zurückgegeben.

config.language = de
page.123 = TEXT
page.123.value = I am a Berliner
page.123.lang.de = Ich bin ein Berliner
page.123.lang.fr = Was weiß ich, was das auf französisch heißt ;-)

In diesem Beispiel wird nun "Ich bin ein Berliner" anstatt von "I am a Berliner" ausgegeben.

data

Typ: getText

Die data-Eigenschaft ist aus meinem Gesichtspunkt immer noch die mächtigste Eigenschaft des stdWrap-Objektes. Mit getText könnt Ihr auf die Datenbank zugreifen, auf den aktuellen Datensatz, auf den Titel des Elternelementes und/oder auf die Register zugreifen.

field

Typ: Spaltenname der aktuell verwendeten Tabelle

Diese Eigenschaft greift auf die Spaltennamen der Tabelle des aktuellen Kontextes zu. Soll heißen: Wenn ich field im Seiten-Template verwende, dann greife ich mit field auf die Spalten der pages-Tabelle zu. Benutze ich field innerhalb einer Extension, dann erhalte ich Zugriff auf die Spalten der tt_content-Tabelle. Interessant wird es im Bereich TemplaVoila. Denn hier greife ich mit field auf die Felder zu, die ich per TemplaVoila im XML angelegt habe.

page.123 = TEXT
# Gibt im Seitentemplate (pages) den Seitentitel aus
page.123.field = title
# Gibt in Extension-Plugins (tt_content) die Überschrift des Inhaltselementes aus
page.123.field = header
# Cool ist auch, dass Ihr mehrere Feldnamen hintereinander angeben könnt. Falls das erste Feld leer ist, dann wird das Zweite geladen und immer so weiter
page.123.field = title // subtitle // nav_title

current

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Greift auf den Eintrag in der "Zwischenablage" zu und setzt diesen als neuen Inhalt. Schaut Euch dazu auch das Beispiel bei setContentToCurrent an oder folgt diesem Link:

Weiterführende Informationen und Beispiele

cObject

Typ: Content Objekt

Manchmal stolpert man bei einigen Extensions über TypoScript-Eigenschaften, die nur stdWrap-Eigenschaften erlauben. Manchmal will man aber das Content Element CASE verwenden, um je nach Situation dieser TypoScript-Eigenschaft einen anderen Wert zuweisen zu wollen. In diesem Fall hilft die cObject-Eigenschaft. Im Folgenden ein typisches Beispiel:

plugin.tx_myext.settings.pageBrowser.cObject = CASE
plugin.tx_myext.settings.pageBrowser.cObject.key.field = type
plugin.tx_myext.settings.pageBrowser.cObject.event = Veranstaltung
plugin.tx_myext.settings.pageBrowser.cObject.news = Nachrichten

numRows

Typ: numRows, stdWrap (seit TYPO3 6.0)

Die numRows-Eigenschaft gibt die Anzahl der gefundenen Datensätze einer SQL-Abfrage aus. Im folgenden Beispiel lasse ich mir die Anzahl der Unterseiten der Seite mit der UID 5 recursiv bis zur 10ten Ebene ausgeben, die ein "e" im Seitennamen beinhalten.

page.123 = TEXT
page.123.value = Ich bin nur so da
page.123.numRows.table = pages
page.123.numRows.select.where = title LIKE '%e%'
page.123.numRows.select.pidInList = 5
page.123.numRows.select.recursive = 10

filelist

Typ: dir, stdWrap

Diese Eigenschaft kann standardmäßig nur auf das Verzeichnis "fileadmin/" zugreifen, bzw. es kommt auf das Verzeichnis an, das im Installtool für $GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'] eingetragen wurde. Soll der Zugriff auf ein anderes Verzeichnis erfolgen, könnt Ihr dies auch mit der lockFilePath-Eigenschaft im TypoScript config-Array setzen:

config.lockFilePath = t3lib/

Ihr könnt mit dieser Eigenschaft immer nur EIN Verzeichnis angeben. Eine kommaseparierte Liste ist nicht möglich. Das folgende Beispiel greift auf das gewählte Verzeichnis zu und listet nur die Dateien mit den Endungen js und html auf. Diese Dateien sollen nun nach Ihren Erweiterungen ext umgekehrt r sortiert werden. js-Dateien werden also vor den html-Dateien angezeigt. Die 1 gibt an, dass nicht nur die Dateinamen, sondern die Dateinamen inklusive Ihrem absoluten Pfad angezeigt werden sollen.

page.123 = TEXT
page.123.filelist = fileadmin/templates/design/|js,html|ext|r|1

preUserFunc

Typ: Klassen- und Methodenname

Ich habe bereits anfangs erklärt, dass alle TypoScript-Eigenschaften hier in einer ganz bestimmten Reihenfolge abgearbeitet werden. Alle Eigenschaften zuvor waren dazu da, um in irgendeiner Art und Weise Inhalt zu erzeugen. Ab jetzt kümmern sich alle nachfolgenden TypoScript-Eigenschaften eher um die Verarbeitung bzw. die Aufbereitung der zuvor gesammelten Inhalte.

Bevor es mit der Verarbeitung der Daten losgeht, könnt Ihr mit Hilfe von preUserFunc eine eigene PHP Klasse und Methode angeben, die den zuvor gesammelten Inhalt komplett ersetzt oder, bevor es mit den nächsten TypoScript-Eigenschaften losgeht, zuvor aufbereitet. Im Beispiel seht Ihr, dass der Klassenname und der Methodenname mit einem -> getrennt angegeben werden müssen. Der Methode könnt Ihr beliebig viele Parameter mitgeben. Im Beispiel übergebe ich nur den Parameter wrap mit dem Wert ### an meine Methode.

page.123 = TEXT
page.123.value = Hallo
page.123.preUserFunc = StefanFroemken\MyExt\UserFunc\Prepare->wrapText
page.123.preUserFunc.wrap = ###

Die Methode erhält als ersten Parameter den aktuellen Inhalt Eures Content-Objektes und als zweiten Parameter alle Parameter, die Ihr per TypoScript oben angegeben habt als Array:

<?php
namespace StefanFroemken\MyExt\UserFunc;
class Prepare {
  public function wrapText($text, $conf)
  {
    return $conf['wrap'] . $text . $conf['wrap'];
  }
}

Das Ergebnis im Frontend ist: ###Hallo###

override

Typ: string, stdWrap

Die override-Eigenschaft überschreibt den Wert des Inhaltselementes sofern override selbst einen Inhalt generiert hat. OK, nochmal. Diesmal mit Beispiel. Wir haben das Inhaltselement TEXT mit dem Wert Hallo. Die override-Eigenschaft holt sich nun mittels field die Spalte subtitle aus der pages-Tabelle und prüft, ob subtitle gefüllt ist oder nicht. Wenn nicht, dann wird weiterhin Hallo ausgegeben, wenn ja, dann wird der Wert aus subtitle ausgegeben.

page.123 = TEXT
page.123.value = Hallo
page.123.override.field = subtitle

Override überschreibt nur dann den Inhalt, wenn override einen Wert hat. Es findet kein Überschreiben statt, wenn der Wert leer oder 0 ist.

Häufige Fallgrube

page.123 = TEXT
page.123.value = Hallo
page.123.override.field = subtitle
page.123.override.wrap = <h2>Untertitel: |</h2>

Egal wie, dieses Beispiel wird immer den Wert aus override ausgeben. Selbst, wenn subtitle leer ist, so wird das wrap trotzdem ausgeführt, was zu dem Inhalt <h2>Untertitel: </h2> führt. Damit ist override gefüllt und überschreibt somit den Wert Hallo. Meine Lösung dazu: Arbeitet in Kombination von if.isTrue:

page.123 = TEXT
page.123.value = Hallo
page.123.override.field = subtitle
page.123.override.if.isTrue.field = subtitle
page.123.override.wrap = <h2>Untertitel: |</h2>

override wird mit dem Wert aus subtitle gefüllt. In meinem Beispiel gehe ich mal davon aus, dass er leer ist. if.isTrue prüft nun, ob ein Wert in subtitle enthalten ist. Es ist kein Wert enthalten, also bricht if.isTrue nun alle nachfolgenden stdWrap-Eigenschaften ab und liefert sofort den leeren Wert zurück. Das wrap wird also gar nicht erst ausgeführt. Somit bleibt override leer und überschreibt nicht den Wert Hallo.

preIfEmptyListNum

Typ: int

Mit der preIfEmptyListNum-Eigenschaft könnt Ihr eine Positionsangebe machen, welcher Wert aus einer kommaseparierten Liste zurückzugeben ist. Dabei beginnt die Positionsangabe bei 0. 0 ist der erste Wert, 1 der Zweite und so weiter. Aber was hat es mit diesem ifEmpty im Namen auf sich? Dazu folgende Theorie: Alle TypoScript-Eigenschaften werden in vorgegebener Reihenfolge abgearbeitet. Dabei ist früher die gleich arbeitende listNum-Eigenschaft hinter der ifEmpty-Eigenschaft eingebaut worden. Was aber, wenn nun, wie im folgenden Beispiel, ein benötigter Wert leer ist? Dadurch, dass listNum nach ifEmpty ausgeführt wird, gab es keine Möglichkeit mehr einen alternativen Wert anzugeben. TYPO3 besitzt eine stabile API, dann kann man nicht mal eben die Reihenfolge von TypoScript-Eigenschaften verändern. Es musste eine neue Eigenschaft her, mit derselben Funktionalität und zwar vor ifEmpty und deshalb der Name preIfEmptyListNum. Zu gut deutsch: Ein vor ifEmpty ausgeführtes listNum.

page.123 = TEXT
page.123.value = blau, grün, , rot  ,weiß
page.123.preIfEmptyListNum = 2
page.123.ifEmpty = pink

Positionsangabe 2 greift auf den dritten Wert zu. Zwischen grün und rot gibt es aber keinen Wert. Also bleibt der Inhalt leer. Da preIfEmptyListNum vor ifEmpty ausgeführt wird, kann nun mittels ifEmpty der alternative Wert pink gesetzt werden.

Weitere Informationen und Beispiele

ifNull Seit TYPO3 6.0

Typ: string, stdWrap

Mit Einführung von FAL wurden ein paar Felder in TYPO3 mit einem Standardwert von NULL implementiert. Auch in der Tabelle pages wurden ein paar Spalten wie TsConfig und description initial auf NULL gesetzt. Blöd ist hier jedoch, dass, wenn ich in description nun einen Wert speichere und ihn danach wieder entferne, der Wert nun nicht wieder NULL ist, sondern als leerer Text abgelegt wurde. Eine Prüfung auf NULL funktioniert also nur, solange dieses Feld noch nie verwendet wurde.

Ein besseres Beispiel haben wir im Bereich von Datei-Referenzen. Wenn Ihr ein neuen Bild in einem Inhaltselement hinzufügt, dann erscheinen ein paar Checkboxen, mit denen Ihr entscheiden könnt, ob der Bildtitel und die Beschreibung vom Originalbild übernommen werden sollen, oder ob Ihr lieber einen individuellen Titel und Beschreibung hier in der Referenz hinterlegen wollt. Wenn Ihr diese Checkbox abhackt, dann wird in der Tabelle sys_file_reference für dieses Feld der Wert NULL hinterlegt. Und nur in diesem Fall, wird der Wert vom Originalbild ausgegeben.

page.123 = CONTENT
page.123.table = sys_file_reference
page.123.select.uidInList = 2
page.123.renderObj = TEXT
page.123.renderObj.field = title
page.123.renderObj.ifNull = Bildtitel wird vom Originalbild ausgelesen

ifEmpty

Typ: string, stdWrap

Wenn der Wert des Inhaltselementes leer oder 0 ist, dann wird der leere Inhalt mit dem Wert aus ifEmpty überschrieben. Bezogen auf das Beispiel: Wenn für die Seite kein Untertitel gesetzt ist, wird Alternativer Seitentitel im Frontend ausgegeben.

page.123 = TEXT
page.123.field = subtitle
page.123.ifEmpty = Alternativer Untertitel

ifEmpty entfernt vor der Prüfung, ob ein Wert leer ist oder nicht, alle Leerzeichen und Tabs vor und nach dem Wert.

ifBlank

Typ: string, stdWrap

Im Gegensatz zu ifEmpty, wird bei ifBlank mit Hilfe von PHP:strlen geprüft, ob ein Wert leer ist oder nicht. Bei ifBlank werden überflüssige Leerzeichen und Tabs sehr wohl mit berücksichtigt. Somit sind 2 Leerzeichen als Wert auch weiterhin 2 Zeichen. Und solange die Anzahl Zeichen in einem Wert nicht exakt 0 ist, solange ist der Wert für ifBlank schlicht nicht true.

page.123 = TEXT
page.123.value = blau, grün, , rot,,weiß
page.123.preIfEmptyListNum = 2
page.123.ifBlank = pink

Hier das gleiche Beispiel wie bei ifEmpty. Allerdings wird hier mit PHP:strlen überprüft, ob Werte enthalten sind. Im Gegensatz zu ifEmpty erhalten wir Folgendes im Frontend: pink.

Aber warum? Der dritte Wert besteht doch aus einem Leerzeichen und PHP:strlen müsste demnach doch in 1 resultieren und im Frontend ein Leerzeichen angezeigt werden. Stimmt, aber in TYPO3 7 wurde PHP:strlen insgeheim durch ein trim ersetzt.

Aktuell unterscheiden sich ifEmpty und ifBlank nur durch eine andere Interpretation von 0. Während bei ifEmpty ein leerer Text und die 0 true zurückliefern, liefert ifBlank aktuell nur bei einem leeren Text true zurück. Es gibt diesbzgl. auch einen Patch auf Forge. Ab TYPO3 8.7.12 und TYPO3 9.1.1 funktioniert diese Eigenschaft wieder mit PHP:strlen.

listNum

Typ: int

Mit der listNum-Eigenschaft könnt Ihr eine Positionsangebe machen, welcher Wert aus einer kommaseparierten Liste zurückzugeben ist. Dabei beginnt die Positionsangabe bei 0. 0 ist der erste Wert, 1 der Zweite und so weiter.

page.123 = TEXT
page.123.value = blau, grün, gelb, rot
page.123.listNum = 2

Mit der Positionsangabe von 2 wird im Beispiel oben demnach der dritte Wert gelb zurückgegeben.

Weitere Informationen und Beispiele

trim

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Mit trim löscht Ihr alle Arten von Leerzeichen und Tabs vor und hinter einem Text weg. Ein Seitentitel wie " Hallo zusammen " wird mittels trim zu "Hallo zusammen"

page.123 = TEXT
page.123.field = title
page.123.trim = 1

stdWrap

Typ: stdWrap

Die stdWrap-Eigenschaft kann rekursiv verwendet werden. Immer dann, wenn die fest vorgegebene Reihenfolge jemandem ein Problem bereitet, kann man oftmals auf stdWrap ausweichen. Beispiel: Wir haben eine H1 Überschrift und brauchen jetzt die Zahl aus der Überschrift. Sowas kann man mit intval erreichen, jedoch müssen zunächst die HTML-Tags weg. Problem ist jetzt: intval wird vor stripHtml ausgeführt. Da die Reihenfolge der Eigenschaften von stdWrap nicht geändert werden können, rufen wir stdWrap einfach erneut auf. Nun wandert der Text durch stripHtml, die HTML-Tags werden entfernt und dann wandert der Text 1. Überschrift in intval, wo nur noch die Zahl 1 übrig bleibt.

page.123 = TEXT
page.123.value = <h1>1. Überschrift</h1>
page.123.stdWrap.stripHtml = 1
page.123.intval = 1

Auif diese Weise können sehr komplexe Strukturen mit TypoScript realisiert werden.

required

Typ: Boolean

Auch bei der required-Eigenschaft ist die Reihenfolge der Eigenschaften von stdWrap wieder wichtig. Sämtliche Eigenschaften zuvor waren für die Inhaltsgenerierung zuständig. Haben also in irgendeiner Form Inhalt geholt oder erzeugt. Wir sind jetzt an den Punkt angekommen, zu entscheiden, ob es überhaupt Sinn macht, die weiteren TypoScript-Eigenschaften auszuführen oder nicht. Im Folgenden Beispiel holen wir uns den Untertitel der aktuellen Seite. Ohne das require würde das wrap auch dann ausgeführt, wenn der Untertitel leer ist. Ihr hättet dann ein leeres <h1></h1> im Frontend, was evtl. zu kuriosen Design- und Abstandsproblemen im Frontend führen kann. Die require-Eigenschaft prüft, ob der aktuelle Inhalt leer ist. Wenn ja, dann werden alle nachfolgenden TypoScript-Eigenschaften übersprungen und somit im Frontend nichts ausgegeben.

page.123 = TEXT
page.123.field = subtitle
page.123.required = 1
page.123.wrap = <h1>|</h1>

if

Typ: if

WENN->DANN->(SONST) für TypoScript. Ähnlich wie bei require wird hier entschieden, ob die nachfolgenden TypoScript-Eigenschaften ausgeführt werden oder nicht. Jedoch könnt Ihr mit if sehr viel detailliertere Abfragen machen als mit require, das nur zwischen leerem und gefülltem Text unterscheiden kann. Alle if-Abfragen können immer nur: WENN->DANN, deshalb habe ich das SONST in Klammern gesetzt. Um trotzdem eine Art WENN->DANN->SONST-Abfrage hinzubekommen verwendet bitte ein COA und dreht den Wahrheitswert im 2ten Inhaltselement mit negate = 1 um.

page.123 = COA
page.123.10 = TEXT
page.123.10.value = Diese Seite liegt auf Seite mit der PID 12
page.123.10.if.value.field = pid
page.123.10.if.equals = 12
page.123.20 = TEXT
page.123.20.value = Diese Seite liegt woanders
page.123.20.if.value.field = pid
page.123.20.if.equals = 12
page.123.20.if.negate = 1

Beachtet bitte, dass ihr hier nicht den aktuellen Wert des Inhaltselementes, sondern immer nur die Werte überprüfen könnt, die Ihr den if-Eigenschaften direkt zugewiesen habt. Ihr könnt also nicht den value des TEXT-Objektes auf 123 setzen und dann erwarten, dass Ihr diesen Wert mit if.equals vergleichen könnt. Das geht nicht. equals vergleicht immer nur den Wert aus if.value.

fieldRequired

Typ: string, stdWrap (seit TYPO3 6.0)

Mit fieldRequired könnt Ihr ein Feld aus der aktuell verwendeten Tabelle setzen, das zwingend gesetzt sein muss. Ist das Feld nicht gesetzt, wird der aktuell gesetzte Inhalt "Hallo zusammen" gelöscht und somit nichts im Frontend angezeigt. Auch alle nachfolgenden TypoScript-Eigenschaften wie hier das wrap, werden nicht mehr ausgeführt.

page.123 = TEXT
page.123.value = Hallo zusammen
page.123.fieldRequired = subtitle
page.123.wrap = <h1>|</h1>

Bitte schaut Euch auch die Erklärung bei der field-Eigenschaft an, damit Ihr versteht, was ich mit "aktuell verwendeter Tabelle" meine.

csConv

Typ: string, stdWrap (seit TYPO3 6.0)

Wer diese Funktion wirklich braucht, der hat seine TYPO3-Installation ziemlich zerschossen. Ich hab ne Ewigkeit gebraucht um ein Beispiel zu finden. Diese Funktion wird z.B. dann verwendet, wenn alle Daten in der Datenbank im UTF-8-Format abgespeichert wurden, aber das Frontend in einem völlig anderen Zeichensatz ausgegeben wird wie z.B. iso-8859-1. csConv gibt an in welchem Format die Daten ankommen. Diese Daten werden dann in das Format, welchen im INSTALL_TOOL unter forceCharset angegeben wurde konvertiert. Wenn dort nichts hinterlegt wurde, dann wird der Standardcharset iso-8859-1 verwendet.

page.123 = TEXT
page.123.data = DB:tt_content:51:bodytext
page.123​​​.csConv = utf-8

parseFunc

Typ: Objektpfad, parseFunc, stdWrap (seit TYPO3 6.0)

Mit dieser Funktion könnt Ihr den Wert eines Inhaltselementes bearbeiten. Wie in meinem Beispiel, habe ich einen lokalen Marker (short) angelegt mit dem Namen "brauner". Immer wenn jetzt irgendwo im Inhaltselement das Wort "brauner" vorkommt, wird dieses Wort durch "blauer" ersetzt. ParseFunc bietet aber noch eine ganze Menge mehr an Funktionen als dieses short.

page.123 = TEXT
page.12310.value = Ich bin ein brauner Bär
page.123.parseFunc.short.brauner = blauer

Weitere Informationen und Beispiele

HTMLparser

Typ: Boolean, HTMLparser, stdWrap (seit TYPO3 6.0)

Der HTMLparser überprüft die HTML-Tags im aktuellen Inhalt und kann diese anhand von Eigenschaften komplett verbieten, um weitere Attribute erweitern und sogar verändern.

Damit die Verarbeitung durch den HTMLparser überhaupt funktioniert, nuss dieser mit HTMLparser = 1 zunächst aktiviert werden. In meinem Beispiel hier habe ich einen Inhalt mit 5 verschiedenen HTML-Tag. Ich erlaube aber nur den b-Tag. Das Ergebnis schaut demnach so aus:

page.123 = TEXT
page.123.value = <table><tr><td>Ich bin ein <b>fetter</b> und <i>kursiver</i> Text</td></tr></table>
page.123.HTMLparser = 1
page.123.HTMLparser.allowTags = b

Als Resultat erhaltet Ihr einen Text in dem das Wort "kursive" nun nicht mehr kursive dargestellt wird: Ich bin ein fetter und kursiver Text

Weitere Infomationen und Beispiele

split

Typ: split, stdWrap (seit TYPO3 6.0)

Split arbeitet nach dem gleichen Prinzip wie PHP:explode. So wird der Wert eines Inhaltselementes anhand von einem Zeichen wie dem Komma oder auch einem Wort in Einzelteile zerlegt, die dann mit cObjNum entsprechend weiter verarbeitet werden können.

In diesem Beispiel hier werden die Farben anhand einem Komma getrennt. Dann wird jede Farbe fett dargestellt und mit einem Zeilenumbruch versehen.

page.123 = TEXT
page.123.value = grün, grün, blau, gelb, rot, grün
page.123.split.token = ,
page.123.split.token.noTrimWrap = || |
page.123.split.cObjNum = 1
page.123.split.1.current = 1
page.123.split.1.wrap = <b>|</b><br />

Weitere Informationen und Beispiele

replacement Seit TYPO3 4.6

Typ: replacement, stdWrap (seit TYPO3 6.0)

Eine sehr mächtige Eigenschaft, die seit TYPO3 4.6 mit an Board ist. Ihr könnt mit ihr Teile eines Textes mit etwas anderem ersetzen. Sei es einfach Textzeichen, ganze Worte oder sogar das Ersetzen von Worten mit Hilfe von Regulären Ausdrücken.

page.123 = TEXT
page.123.value = Lorem ipsum dolor sit amet, consetetur sadipscing elitr
page.123.replacement.10.search = ,
page.123.replacement.10.replace.char = 59
page.123.replacement.20.search = ipsum
page.123.replacement.20.replace = trallala
page.123.replacement.30.search = /(dolor|amet)/
page.123.replacement.30.replace = what
page.123.replacement.30.useRegExp = 1

Das Beispiel resultiert in: Lorem trallala what sit what; consetetur sadipscing elitr

prioriCalc

Typ: Boolean, stdWrap (seit TYPO3 6.0)

prioriCalc interpretiert den aktuellen Inhalt als eine Berechnung. Dabei wird sogar Punktrechnung vor Strichrechnung berücksichtigt. Auch Klammersetzungen sind erlaubt. Folgende Operatoren können interpretiert werden: +-*/%^.

10 = TEXT
10.value = 6 + 12 * 12
10.prioriCalc = 1

Hier ein paar Beispiele aus der TYPO3-Doku:

100%7 = 2
-5*-4 = 20
+6^2 = 36
6 ^(1+1) = 36
-5*-4+6^2-100%7  = 54
-5 * (-4+6) ^ 2 - 100%7 = 98
-5 * ((-4+6) ^ 2) - 100%7 = -22

Ein paar Bedingungen müsst Ihr berücksichtigen: Bei Dezimalzahlen wird der Punkt als Trenner verwendet. prioriCalc enthält keine Fehlerabfangroutinen. Wenn Ihr also in diese Berechnung Text einfügt erhaltet Ihr einfach einen Wert 0 oder 1. Auch Berechnungen wie Division durch 0 werden nicht beanstandet...da müsst Ihr schon selbst drauf achten.

char

Typ: int, stdWrap (seit TYPO3 6.0)

Die char-Eigenschaft erwartet einen integer Wert, der dann mit folgendem PHP-Konstrukt in einen Buchstaben oder einem anderen Zeichen umgewandelt wird:

chr(intval($conf['char']))

In unserem Beispiel wird einfach nur ein "E" ausgegeben.

10 = TEXT
10.value = Ich spiele keine Rolle
10.char = 69

Sinnvoll wird diese Eigenschaft, wenn Ihr mal ein Leerzeichen braucht (z.B. für die replacement-Eigenschaft). Dann könnt Ihr einfach den Wert 32 nehmen und erspart Euch ein noTrimWrap mit diesen ganzen Pipes.

intval

Typ: Boolean, stdWrap (seit TYPO3 6.0)

intval wandelt einen Wert in eine Zahl um. Wenn es sich dabei um einen Text handelt, dann wird 0 zurückgegeben. Ausnahme: Wenn der Text mit einer Zahl beginnt, dann wird diese zurückgegeben. In unserem Beispiel landet demnach die 12 im Frontend:

10 = TEXT
10.value = 12: Ich werde in eine Zahl umgewandelt
10.intval = 1

Wenn Ihr mit Zahlen aus der Adressleiste des Browsers arbeitet und diese weiter verwenden wollt, dann solltet Ihr auf jeden Fall immer auch intval verwenden, um sicherzustellen, dass keine Sicherheitslücke oder SQL-Injection ausgenutzt werden kann:

10 = TEXT
10.data = GP:tx_myext_myplugin|pid
10.intval = 1

hash Seit TYPO3 4.6

Typ: string, stdWrap

Mit der hash-Eigenschaft könnt Ihr den aktuellen Wert eines Inhaltselementes verschlüsseln. Naja, verschlüsseln ist jetzt nicht unbedingt der richtige Begriff, weil man beim Verschlüsseln erwartet, dass man den verschlüsselten Wert auch wieder entschlüsseln kann. Das ist beim Hashen aber nicht der Fall. Etwas zu hashen ist immer eine Einbahnstraße, klappt also immer nur in eine Richtung. In so einem Hash befinden sich nur noch zerstreute Fragmente des Originalwertes. Selbst wenn man eine Möglichkeit finden würde einen solchen Hash-Algorithmus rückwärts laufen zu lassen, so würde man niemals mehr den vollständigen Wert erhalten.

Diese Einbahnpolitik des Hashens ist hervoragend für das Speichern von Passwörtern. Auch ist das Ergebnis des Hashens meist nur 25-40 Zeichen lang. Eine gute Möglichkeit, um zum Beispiel zwei längere Texte auf Ihre Gleichheit zu prüfen. Man erkennt zwar nicht welche Unterschiede diese beiden Texte haben, man würde erkennen, dass einer der Texte einen Unterschied aufweist.

page.123 = TEXT
page.123.value = Lorem ipsum dolor
page.123.hash = md5

TYPO3 unterstützt derzeit über 40 Hashing-Algorithmen. Unteranderen sind dabei: md5, sha1, sha256, sha512, crc32 und viele mehr.

round Seit TYPO3 4.6

Typ: round

Mit dieser Eigenschaft könnt Ihr Zahlen auf Ihre nächste Ganzzahl aufrunden (ceil) und abrunden (floor), aber auch Kommazahlen auf eine bestimmte Anzahl Nachkommastellen aufrunden (round). Dieses Feature muss mir round = 1 erst aktiviert werden.

page.123 = COA
page.123.10 = TEXT
page.123.10.value = 2.315
page.123.10.round = 1
page.123.10.round.roundType = ceil
page.123.10.wrap = |<br>
page.123.20 = TEXT
page.123.20.value = 2.315
page.123.20.round = 1
page.123.20.round.roundType = floor
page.123.20.wrap = |<br>
page.123.30 = TEXT
page.123.30.value = 2.315
page.123.30.round = 1
page.123.30.round.roundType = round
page.123.30.round.decimals = 2
page.123.30.wrap = |<br>

numberFormat Seit TYPO3 4.5

Typ: numberFormat

Oftmals werden Beträge und andere Fließkommazahlen, also Zahlen mit Nachkommastellen getrennt durch einen Punkt, in der Datenbank abgespeichert. Dabei verlieren diese Zahlen jegliche Formatierung. Ein Betrag wie 23.849,30 landet in der Datenbank als 23849.3. Natürlich kann man mit diesen Zahlen in der Datenbank nun hervoragend rechnen, aber beim Wiederanzeigen, muss die Formatierung wiederhergestellt werden und dabei hilft uns die TypoScript-Eigenschaft numberFormat.

page.123 = TEXT
page.123.value = 23849.3
page.123.numberFormat.decimals = 2
page.123.numberFormat.dec_point = ,
page.123.numberFormat.thousands_sep = .

Mit decimals gebt Ihr die Anzahl der Nachkommastellen an. Der dec_point leitet die Nachkommastellen ein und thousands_sep trennt die 1000er Stellen. Das Ergebnis ist nun wieder: 23.849,30

date

Typ: date-conf

Wenn date einen Wert hat, wird der aktuelle Inhalt als Timestamp interpretiert. Ein Timestamp schaut zum Beispiel so aus: 1266404014 und repräsentiert die Sekunden ab dem 01.01.1970 00:00:00. In unserem Beispiel greife ich mit data auf das Feld crdate des aktuellen Datensatzes (hier: pages) zu und wandel den Timestamp in ein "lesbares" Format um (01.03.2010)

Wenn das Contentelement keinen gültigen Timestamp enthält, dann erhaltet Ihr eine leere Ausgabe im Frontend.

page.123 = TEXT
page.123.data = field:crdate
page.123.date = d.m.Y

Weitere Informationen zur PHP-Funktion date und den zur Verfügung stehenden Optionen.

strftime

Typ: strftime-date

Auch mit strfdate lässt sich, wie schon mit date, ein Timestamp in ein lesbares Format umwandeln. Ich habe hier extra 2 Beispiele erstellt, einmal mit date und einmal mit strfdate, um Euch den Unterschied zu zeigen. Während date immer die englischen Wochentage ausgibt, gibt strftime die Wochentage in der eingestellten Landessprache aus (locale_all)

page.123 = TEXT
page.123.field = crdate
page.123.date = l \d\e\n d.m.Y
page.123.wrap = |<br />
page.124 = TEXT
page.124.field = crdate
page.124.strftime = %A den %d.%m.%Y
page.124.wrap = |<br />

Weitere Informationen zu strftime und seinen Optionen

strtotime Seit TYPO3 7.3

Typ: string

Mit strtotime kann ein Datum in ein Timestamp konvertiert werden. Außerdem können kleinere Intervalle auf das Datum angewendet werden. Im ersten Beispiel wird einfach nur das Datum an strtotime gesendet und der resultierende Timestamp als neuer Inhalt gesetzt. Im zweiten Beispiel füge ich noch eine Woche drauf, womit ein Timestamp für den 24.01.2020 als neuer Inhalt gesetzt wird.

page.123 = TEXT
page.123.value = 17.01.2020
page.123.strtotime = 1
page.124 = TEXT
page.124.value = 17.01.2020
page.124.strtotime = +1 week

age

Typ: boolean, string

Wenn age auf 1 gesetzt wird, dann interpretiert es den Inhalt als Timestamp und zieht diesen Wert von dem Timestamp der aktuellen Uhrzeit ab. Es wird also das Alter berechnet. In der Standardkonfiguration werden die Alterswerte in min, hrs, days ODER yrs ausgegeben. Ich habe "oder" extra großgeschrieben, weil diese Funktion immer nur EINEN dieser Werte zurückliefern kann.

Wenn Euch diese englischen Kürzel nicht gefallen, könnt Ihr die Werte auch selbst definieren. Siehe 2tes Beispiel.

page.123 = TEXT
page.123.field = tstamp
page.123.age = 1
page.124 = TEXT
page.124.field = tstamp
page.124.age = Minuten | Stunden | Tage | Jahre

case

Typ: case, stdWrap (seit TYPO3 6.0)

Mit case kann bestimmt werden, ob der enthaltene Inhalt komplett groß- oder kleingeschrieben werden soll.

page.123 = TEXT
page.123.value = Hallo alle miteinander
page.123.case = upper
page.123.wrap = |<br />
page.124 = TEXT
page.124.value = Hallo alle miteinander
page.124.case = lower

Ergebnis:

HALLO ALLE MITEINANDER
hallo alle miteinander

bytes

Typ: boolean, stdWrap (seit TYPO3 6.0)

bytes interpretiert den enthaltenen Inhalt als Bytes und konvertiert diese in eine entsprechende Größe wie KiloBytes, MegaBytes und GigaBytes um. Ist ein Wert also kleiner als ein MegaByte, dann wird dieser nicht als 0.05 MB angezeigt, sondern der Wert in KiloByte ausgegeben.

page.123 = TEXT
page.123.value = 9600
page.123.bytes = 1
page.123.wrap = |<br />
page.124 = TEXT
page.124.value = 9600
page.124.bytes = 1
page.124.bytes.labels = Bytes | KiloBytes | MegaBytes | GigaBytes
page.124.bytes.labels.base = 1024
page.124.wrap = |<br />
page.125 = TEXT
page.125.value = 9600
page.125.bytes = 1
page.125.bytes.labels = iec
page.125.wrap = |<br />
page.126 = TEXT
page.126.value = 9600
page.126.bytes = 1
page.126.bytes.labels = si

In unserem Beispiel erhalten wir diese Ausgabe:

9,38 Ki
9,38 KiloBytes 
9,38 Ki
9,60 k

Eigene Werte mit Pipe anzugeben, wie im zweiten Beispiel, gilt seit TYPO3 7.4 als veraltet und wird evtl. irgendwann entfernt.

Mit TYPO3 7.4 wurden die beiden neuen Labels iec und si eingeführt. Während iec mit einem Teiler von 1024 arbeitet, arbeitet si mit einem Teiler von 1000.

Mit TYPO3 7.5 kam die neue Eigenschaft base für labels hinzu, damit Ihr den Teiler 1000 oder 1024 selbst definieren könnt. Siehe zweites Beispiel.

substring

Typ: Part1, Part2, stdWrap (seit TYPO3 6.0)

Die Eigenschaft substring ist ähnlich der Funktion PHP:substr. Ich sage deshalb ähnlich, weil TYPO3 hier derzeit 7 verschiedene substr-Funktionen verwenden kann. Da bekommt der User zwar nichts von mit, aber je nach Zeichensatz/Codierung/Einstellungen im INSTALL_TOOL werden verschiedenen substr-Funktionen aufgerufen, die genau für diese Einstellung programmiert wurden. So gibt es zum Beispiel ein substr, das nur für UTF-8-Kodierte Texte da ist. Weitere Informationen dazu findet Ihr in der Klasse \TYPO3\CMS\Core\Charset\CharsetConverter.

page.123 = TEXT
page.123.value = Nimm Dir was Du brauchst!
page.123.substring = 16, 8

Das Ergebnis unseres Scriptes gibt einfach nur das Wort "brauchst" im Frontend aus.

removeBadHTML Veraltet seit TYPO3 8.2. Entfernt mit TYPO3 9.0

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Laut den Kommentaren im Quellcode ist diese Funktion für die Überprüfung von Benutzereingaben zuständig. Damit Frontendbesucher nicht in irgendeine Eingabemaske böswilligen Code reinbasteln, kann man ihn vorher mit dieser Funktion durchleuchten und alle Tags, mit denen böswilliger Code implementiert werden kann, rauslöschen.

So bleibt von dem Wert aus page.123 überhaupt nichts mehr übrig und auch der Wert aus page.124 wurde sicherer gemacht und gekürzt. Es bleibt nur noch dieses Fragment im Quellcode übrig: Klick mich </div></form>

page.123 = TEXT
page.123.value = <script language="text/javascript">Ich bin ein böses Script</script>
page.123.removeBadHTML = 1
page.124 = TEXT
page.124.value = <form action="/?id=1" method="post"><div onclick="boeserCode();">Klick mich </div></form>
page.124.removeBadHTML = 1

Die Erwartungen an removeBadHTML wurden nicht zu 100% erfüllt, weswegen diese Eigenschaft mit TYPO3 9.0 entfernt wurde. Bitte verwendet stattdessen htmlSpecialChars oder encodeForJavaScriptValue

cropHTML

Typ: string, stdWrap (seit TYPO3 6.0)

crob heißt soviel wie abschneiden und genau das macht diese Funktion hier mit der Berücksichtigung NICHT innerhalb von HTML-Tags rumzuschnibbeln. Während Ihr beim ersten Beispiel denkt, dass cropHTML in der Nähe von color einen Schnitt macht, wird trotzdem der vollständige Text im Frontend angezeigt. Das liegt daran, dass der reine Text, also ohne alle HTML-Tags, nur 23 Zeichen lang ist. Das zweite Beispiel macht es besser. Der reine Text wird nach 16 Zeichen abgeschnitten: "Ich bin ein blau". Im dritten Beispiel verwende ich eine negative Zahl (-10) und kann damit den Text vom Ende her abschneiden: "lauer Text". Das 4te Beispiel ist ein Text der hinten bzw. vorne angefügt wird: "Ich bin ein blau..." bzw. "...lauer Text". Im fünften Beispiel habe ich die Punkte mal durch völlig andere Zeichen ersetzt und gebe mit dem dritten Parameter an, dass erst beim nächsten Leerzeichen abgeschnitten werden soll: "Ich bin ein blauer*+#"

page.123 = TEXT
page.123.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.123.cropHTML = 30
page.124 = TEXT
page.124.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.124.cropHTML = 16
page.125 = TEXT
page.125.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.125.cropHTML = -10
page.126 = TEXT
page.126.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.126.cropHTML = 16|...
page.127 = TEXT
page.127.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.127.cropHTML = 16|*+#|1

stripHtml

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Mit dieser Eigenschaft könnt Ihr alle HTML-Tags aus dem Text entfernen.

page.123 = TEXT
page.123.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.123.stripHtml = 1

Ergebnis: Ich bin ein blauer Text

crop

Typ: string

crop arbeitet wie cropHTML. Allerdings kann crop die HTML-Tags nicht berücksichtigen und sollte somit nur für reinen Text verwendet werden.

page.123 = TEXT
page.123.value = Ich bin ein einfacher Text
page.123.crop = 10|...
page.124 = TEXT
page.124.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.124.crop = 32|...
page.125 = TEXT
page.125.value = <div>Ich bin ein <span style="color: blue;">blauer</span> Text</div>
page.125.crop = -10|...|1

Beispiel page.123: "ich bin ei..."

Beispiel page.124: Eine absolute Katastrophe, denn nun wird innerhalb des HTML-Tags einfach abgeschnitten. Das zweite Anführungszeichen ist nicht mehr vorhanden und die komplette Webseite kann von jetzt auf gleich völlig schräg aussehen. Ergebnis: <div>Ich bin ein <span style="co...

Beispiel page.125: ...Text</div>

rawUrlEncode

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Zu aller erst dient dieses Beispiel nur als Beispiel. Denn diese Art der Linkgestaltung gehört verboten. Für sowas hat TYPO3 viel bessere Eigenschaften wie typolink.

In unserem Beispiel möchte ich der GET-Variable den Pfad media/pics/bild1.png übergeben. Da aber die Schrägstriche von Browsern schnell als Trenner für tiefere Verzeichnisstrukturen auf dem Server interpretiert werden, kann man solche Pfade mit Hilfe der PHP-Funktion rawurlencode maskieren.

page.123 = COA
page.123.10 = TEXT
page.123.10.value = Ich bin ein <a href="index.php?id=2&pfad=
page.123.20 = TEXT
page.123.20.value = media/pics/bild1.png
page.123.20.rawUrlEncode = 1
page.123.30 = TEXT
page.123.30.value = ">Link</a>

Als Ergebnis erhalten wir einen Link mit dem wirklich jeder Browser klarkommt:

Ich bin ein <a href="index.php?id=2&pfad=media%2Fpics%2Fbild1.png">Link</a>

htmlSpecialChars

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Damit HTML-Tags im Frontend nicht von Browsern interpretiert werden, können diese Tags mit htmlSpecialChars entsprechend maskiert werden.

page.123 = TEXT
page.123.value = <div>Müller & Breuer</div>
page.123.htmlSpecialChars = 1
page.124 = TEXT
page.124.value = <div>Müller & Breuer</div>
page.124.stdWrap.htmlSpecialChars = 1
page.124.htmlSpecialChars = 1
page.125 = TEXT
page.125.value = <div>Müller & Breuer</div>
page.125.stdWrap.htmlSpecialChars = 1
page.125.htmlSpecialChars = 1
page.125.htmlSpecialChars.preserveEntities = 1

Beispiel page.123: Wie Ihr erkennen könnt, werden nicht nur die eckigen Klammern, sondern auch das &-Zeichen maskiert: &lt;div&gt;Müller &amp; Breuer&lt;/div&gt;

Beispiel page.124: Je größer die Scripte und TS werden, desto schneller kann es mal vorkommen, dass ein Inhalt auch 2fach maskiert wird: &amp;lt;div&amp;gt;Müller &amp;amp; Breuer&amp;lt;/div&amp;gt;

Beispiel page.125: Im Beispiel 2 haben wir gesehen, dass das &-Zeichen doppelt maskiert wurde. Um diesen Fehler wieder zu bereinigen, könnt Ihr noch die Unter-Eigenschaft preserveEntities aktivieren, um wieder eine sauber Ausgabe zu erhalten wie in Beispiel 1: &lt;div&gt;Müller &amp; Breuer&lt;/div&g;

encodeForJavaScriptValue

Typ: boolean, stdWrap

Falls es sich bei dem Wert des Inhaltselements um JavaScript handelt, kann die encodeForJavaScriptValue-Eigenschaft bestimmte Zeichen im Text maskieren, sodass das JavaScript sicher ausgeführt werden kann.

page.123 = TEXT
page.123.value = alert('Hallo zusammen')
page.123.encodeForJavaScriptValue = 1

Ergebnis: 'alert(\u0027Hallo\u0020zusammen\u0027)'

doubleBrTag

Typ: string, stdWrap (seit TYPO3 6.0)

doubleBrTag sucht im Inhalt nach mindestens 2 Zeilenumbrüchen hintereinander und bietet Euch an diese Zeilenumbrüche durch eigenen Text zu ersetzen.

10 = TEXT
10.value (
    <div>Ein Absatz
    
    Noch ein Absatz
    
    und noch ein Absatz</div>
)
10.doubleBrTag = ###TEST###
20 < 10
20.doubleBrTag = <br />
30 < 10
30.doubleBrTag = </div><div>

Beispiel 1: Macht wenig Sinn aber es zeigt die grundsätzliche Funktionsweise

<div>Ein Absatz###TEST###	Noch ein Absatz###TEST###	und noch ein Absatz</div>

Beispiel 2:

<div>Ein Absatz<br />	Noch ein Absatz<br />	und noch ein Absatz</div>

Beispiel 3:

<div>Ein Absatz</div><div>	Noch ein Absatz</div><div>	und noch ein Absatz</div>

br

Typ = Boolean, stdWrpa (seit TYPO3 6.0)

Jeder Zeilenumbruch wird mit Hilfe der PHP-Funktion nl2br in <br /> umgewandelt:

page.123 = TEXT
page.123.value (
    <div>Ein Absatz
    
    Noch ein Absatz
    
    und noch ein Absatz</div>
)
page.123.br = 1

Ergebnis:

<div>Ein Absatz<br />
<br />
Noch ein Absatz<br />
<br />
und noch ein Absatz</div>

brTag

Typ: string, stdWrap (seit TYPO3 6.0)

brTag ersetzt alle Zeilenumbrüche (CHR(10)) mit dem Inhalt von brTag. So wird aus diesem Inhalt folgende Ausgabe:

page.123 = TEXT
page.123.value (
    <div>Ein Absatz
    
    Noch ein Absatz
    
    und noch ein Absatz</div>
)
page.123.brTag = </div><div>

Ergebnis:

<div>Ein Absatz</div><div> </div><div> Noch ein Absatz</div><div> </div><div> und noch ein Absatz</div>

encapsLines

Typ: encapsLines

encapseLines sucht im Inhalt nach Zeilenumbrüchen CHR(10) und bietet Euch an bestimmte Eigenschaften für alle Zeilen zu setzen. So findet encapsLines in unserem Beispiel die erste Zeile "<div>Ein Absatz</div>" und wandelt die vorhandenen div-Tags Dank remapTag in p-Tags um. Die leeren Zeilen werden Dank wrapNonWrappedLines mit <p>|</p> gefüllt. Da solche leeren Tags nicht XHTML-kompatibel sind, gibt es noch die Eigenschaft innerStdWrap_all, die sich darum kümmert, leere Tags mit einem Inhalt wie &nbsp; zu füllen.

page.123 = TEXT
page.123.value (
<div>Ein Absatz</div>

<div>Noch ein Absatz</div>

<b>und noch ein Absatz</b>
)
page.123.encapsLines {
    encapsTagList = div
    remapTag.DIV = P
    wrapNonWrappedLines = <p>|</p>
    innerStdWrap_all.ifEmpty = &nbsp;
}

keywords

Typ: Boolean, stdWrap (seit TYPO3 6.0)

keywords splittet den Inhalt an Hand von Komma, Semikolon und einfachen Zeilenumbrüchen CHR(10) auf, löscht alle Leerzeichen vor und hinter jeden Abschnitt und listet alle Abschnitte sauber durch Komma getrennt hintereinander wieder auf. TYPO3 arbeitet sehr häufig mit kommaseparierten Listen. Falls also mal eine Liste etwas durcheinander gekommen sein sollte, dann ist das hier die richtige Eigenschaft, um sie wieder aufzuräumen.

page.123 = TEXT
page.123.value (
  Apfel, Birne, Pfirsich; Banane
  Kirche;Traube
  Kirsche;Erdbeere
)
page.123.keywords = 1

Ergebnis:

Apfel,Birne,Pfirsich,Banane,Kirche,Traube,Kirsche,Erdbeere 	

innerWrap

Typ: wrap, stdWrap

innerWrap umwickelt einen Text und arbeitet genauso wie die wrap-Eigenschaft. Die Bedeutung von innerWrap ist einfach nur, dass es vor der wrap-Eigenschaft ausgeführt wird.

page.123 = TEXT
page.123.value = Ich werde ein fetter Text
page.123.innerWrap = <b>|</b>
page.123.wrap = <div>|</div>

Ergebnis:

<div><b>Ich werde ein fetter Text</b></div>

innerWrap2

Typ: wrap, stdWrap

Ein weiteres wrap, das genau wie die wrap-Eigenschaft arbeitet. Das Besondere an innerWrap2 ist, dass es nach innerWrap und vor der eigentlichen wrap-Eigenschaft ausgeführt wird.

page.123 = TEXT
page.123.value = Ich werde ein Listeneintrag
page.123.innerWrap = <li>|</li>
page.123.innerWrap2 = <ul>|</ul>
page.123.wrap = <div>|</div>

Ergebnis:

<div><ul><li>Ich werde ein Listeneintrag</li></ul></div>

fontTag Veraltet seit TYPO3 8.2. Entfernt seit TYPO3 9.0

Typ: wrap

und noch ein ganz wrap. Er hätte auch innerWrap3 heißen können oder sowas. Bin ganz glücklich, dass er mit TYPO3 9.0 rausgeflogen ist.

page.123 = TEXT
page.123.value = Ich bin ein fetter Satz
page.123.fontTag = <b>|</b>

addParams

Typ: addParams, stdWrap (seit TYPO3 6.0)

addParams fügt einem HTML-Tag einen weiteren Parameter hinzu. Welcher Tag den gewünschten Parameter erhalten soll, gebt Ihr mit der Angabe von _offset an. 1 bedeutet erster Tag, 2 bedeutet 2ter Tag wie hier in meinem Beispiel (span). Diese _offset-Angaben können auch negative Werte enthalten. So würde ein _offset=-2 bedeuten, dass das vorletzte Tag diese zusätzlichen Parameter erhalten soll.

page.123 = TEXT
page.123.value = <div>Ich bin ein <span>blaues</span> Wort</div>
page.123.value.addParams.style = color: blue
page.123.value.addParams._offset = 2

Ergebnis:

<div>Ich bin ein <span style="color: blue">blaues</span> Wort</div>

textStyle Veraltet seit TYPO3 7.1. Entfernt mit TYPO3 8.0

Typ: textStyle

Dieses Beispiel ist zwar richtig, aber es hat auf dem Frontend überhaupt keine Auswirkung. Ich hab den "Fehler" zwar gefunden, aber noch weiß ich nicht, ob es sich dabei wirklich um einen Fehler handelt, denn immerhin sind font-Tags outdated und sollen durch CSS ersetzt werden. Evtl. liegt hier das Problem begraben und TYPO3 hat die Funktion einfach "unbrauchbar" gemacht.

10 = TEXT
10.value = Ich werde in ein font-Tag gewrapped
10.textStyle.face.field = 1

tableStyle Veraltet seit TYPO3 7.1. Entfernt mit TYPO3 8.0

Typ: tableStyle

tableStyle umschließt einen Content nur mit dem table-Tag. Mehr nicht! Um die td und th-Tags müsst Ihr Euch schon selber kümmern. Im oberen Beispiel könnt Ihr zwar Angaben zu border, cellpadding und cellspacing machen, aber die Angaben über die Farbe klappe wie schon bei textStyle auch nicht.

page.123 = TEXT
page.123.value = <td>Spalte 1</td><td>Spalte 2</td>
page.123.tableStyle.border = 3
page.123.tableStyle.color.field = 1

Ergebnis:

<table border="3" cellspacing="0" cellpadding="0"><td>Spalte 1</td><td>Spalte 2</td></table>

filelink

Typ: filelink, stdWrap (seit TYPO3 6.0)

filelink erzeugt direkte Links zu Dateien im TYPO3-Verzeichnis. filelink kopiert die Dateien also nicht erst nach uploads/irgendwas, sondern lässt die Dateien da wo sie sind und können so auch mehrfach verlinkt werden OHNE diese [Dateiname]_1-Dateien zu erzeugen.

Im Beispiel habe ich neben dem Dateilink noch angegeben, dass die Dateigröße angezeigt werden soll. Damit sie nicht so dicht am Link klebt, habe ich mit dem wrap noch einen Abstand eingebaut und angegeben, dass die Größe in KB dargestellt werden soll.

page.123 = TEXT
page.123.value = headerblue.jpg
page.123.filelink {
    path = uploads/media/
    size = 1
    size.wrap = <span style="padding-left: 10px; font-size: 10px;">|</span>
    size.bytes = 1
}

Ergebnis:

<a href="uploads/media/headerblue.jpg" >headerblue.jpg</a><span style="padding-left: 10px; font-size: 10px;">78 K</span>

preCObject

Typ: cObject

Mit preCObject könnt Ihr dem Inhaltselement ein weiteres Inhaltselement voranstellen. Im Beispiel füge ich ein weiteres TEXT-Objekt voran mit dem Text "Download:". Aber natürlich könnt Ihr auch ein Bild oder ein anderes Inhaltselement wählen.

page.123 = TEXT
page.123.value = headerblue.jpg
page.123.filelink {
    path = uploads/media/
}
page.123.preCObject = TEXT
page.123.preCObject.value = Download:

Als Ausgabe erhaltet Ihr "Download: " gefolgt von einem Dateiverweis

postCObject

Typ: cObject

Genau das gleiche Prinzip wie bei preCObject. Nur das hier das Inhaltselement an unser aktuelles Element hinten angehangen wird.

page.123 = TEXT
page.123.value = headerblue.jpg
page.123.filelink {
    path = uploads/media/
}
page.123.postCObject = TEXT
page.123.postCObject.value = <--: Coole Datei...unbedingt runterladen!!!

wrapAlign

Typ: align, stdWrap

wrapAlign erzeugt einen neuen DIV-Tag mit dem Inhalt vom TEXT-Element und fügt dem DIV-Tag gleich ein StyleSheet hinzu, das unseren Inhalt an die gewünschte Position setzt. Erlaubt ist right, left oder center.

page.123 = TEXT
page.123.value = Setz mich an die rechte Seite
page.123.wrapAlign = right

Ergebnis:

<div style="text-align:right;">Setz mich an die rechte Seite</div>

typolink

Typ: typolink, stdWrap (seit TYPO3 6.0)

typolink ist das Allroundtool für Links. Hiermit können nicht nur Links zu Dateien erzeugt werden, sondern auch Links zu internen und extenen Seiten als auch Dateien und Emailadressen. Im Beispiel erstelle ich einen Link zur internen Seite mit der Seiten UID 32 und habe angegeben, dass sich diese Seite in einem neuen Fenster öffnen soll.

page.123 = TEXT
page.123.value = Ich werde ein Link
page.123.typolink.target = _blank
page.123.typolink.parameter = 32

TCAselectItem Wurde nie als veraltet deklariert und mit TYPO3 9.0 direkt entfernt

Typ: Array, stdWrap (seit TYPO3 6.0)

TCAselectItem greift Dank der TCA auf die gewählte Tabelle zu und sucht nach dem angegebenen Feld. Dieses Feld MUSS vom Typ "select" sein und die Optionen dort MÜSSEN manuell eingetragen worden bzw. mit Hilfe des Arrays "items" erreichbar sein. Ob das bei Euch der Fall ist könnt Ihr nachprüfen über Konfiguration->Selectbox $TCA->Tabelle auswählen->Columns->Feld->Config->items.

Innerhalb dieser Items wird nun nach dem Key aus der Eigenschaft value gesucht und der Text diesen Arrayeintrages wird zurückgegeben. Ihr könnt auch mehrere values abfragen in dem Ihr die Werte mit Kommas trennt. Die Daten werden dann mit dem Wert in delimiter getrennt im Frontend ausgegeben.

Erschwerend kommt hinzu, dass die Funktion mit includeTCA arbeitet. Bei selbst programmierten Extensions mit dem kickstarter werden die Werte für columns nicht ausgelesen und stehen somit für diese Funktion nicht zur Verfügung.

Also: Entweder Ihr greift wie im 2ten Beispiel nur auf Systemtabellen zu und erhaltet als Ausgabe: "Link zu externer URL"

Oder Ihr müsst Eure Extension so umkonfigurieren, dass die column-Einträge aus der tca.php ausgeschnitten werden und in der ext_tables.php wieder eingefügt werden. So ist es auch mit den meisten Systemextensions der Fall. Diese wurde nicht mit der tca.php definiert, sondern mit der ext_tables.php. Kurz: Nur alle Arrays, die in der ext_tables definiert wurden, stehen auch nach einem includeTCA zur Verfügung.

page.123 = TEXT
page.123.value = 1
page.123.TCAselectItem {
    table = tx_sfstdwrap_select
    field = selecttest
    delimiter = ,
}

page.123 = TEXT
page.123.value = 3
page.123.TCAselectItem {
    table = pages
    field = doktype
    delimiter = ,
}

Beispiel 1: Ich hab meine Extension entsprechend geändert und erhalte "Kirsche" als Ausgabe. Alle anderen erhalten einfach nur den Wert aus value wieder zurück.

Diese Problematik wurde auch hier schon besprochen:

http://bugs.typo3.org/view.php?id=8785

space Wurde nie als veraltet deklariert und mit TYPO3 9.0 direkt entfernt

Typ: space, stdWrap

space kann über und unter einem Element zusätzlichen Platz schaffen. Die Angaben werden als Pixel interpretiert.

page.123 = TEXT
page.123.value = Viel Platz oben und unten (clear.gif)
page.123.space = 20 | 20
page.124 = TEXT
page.124.value = Viel Platz oben und unten (div mit height)
page.124.space = 20 | 20
page.124.space.useDiv = 1

Beispiel 1 ist der Standard und fügt ein clear.gif ein, um den Abstand zu realisieren.

Beispiel 2 ist eine Möglichkeit, um den Abstand mit Hilfe eines div-Tags zu realisieren. Die Höhe wird dann über height: Pixelangabe realisiert.

spaceBefore Wurde nie als veraltet deklariert und mit TYPO3 9.0 direkt entfernt

Typ: int, stdWrap

spaceBefore fügt nur über dem Contentelement einen Zwischenraum wie hier im Beispiel von 20 Pixeln ein.

page.123 = TEXT
page.123.value = Viel Platz oben (clear.gif)
page.123.spaceBefore = 20
page.124 = TEXT
page.124.value = Viel Platz oben (div mit height)
page.124.spaceBefore = 20
page.124.space.useDiv = 1

Beispiel 1 erzeugt den Abstand mit Hilfe von clear.gif während Beispiel 2 mit einem div-Tag arbeitet.

spaceAfter Wurde nie als veraltet deklariert und mit TYPO3 9.0 direkt entfernt

Typ: int, stdWrap

spaceAfter fügt nur unter dem Contentelement einen Zwischenraum wie hier im Beispiel von 20 Pixeln ein.

page.123 = TEXT
page.123.value = Viel Platz unten (clear.gif)
page.123.spaceAfter = 20
page.124 = TEXT
page.124.value = Viel Platz unten (div mit height)
page.124.spaceAfter = 20
page.124.space.useDiv = 1

Beispiel 1 erzeugt den Abstand mit Hilfe von clear.gif während Beispiel 2 mit einem div-Tag arbeitet.

Bug: Wenn die aktuelle Zeile 12 Pixel groß ist, dann fügt das erste Beispiel nur einen Abstand von 8 Pixeln ein, weil hier das Bild hinter dem Inhaltselement eingefügt wird, anstatt erst mal ein <br /> zu machen.

http://bugs.typo3.org/view.php?id=13866

wrap

Typ: wrap

wrap umwickelt den aktuellen Inhalt mit den Angaben die vor und hinter der Tilde "|" stehen. 

page.123 = TEXT
page.123.value = Ich werde jetzt fett
page.123.wrap = <b>|</b>

Ergebnis:

<b>Ich werde jetzt fett</b>

noTrimWrap

Typ: spezieller wrap

Während page.123 und page.124 direkt aneinander gesetzt werden und somit ein "Hallozusammen" entsteht, so ergibt oage.125 und page.126 zusammen ein "Hallo zusammen" aus. noTrimWrap umwickelt also den Inhalt wie auch schon bei wrap. Allerdings werden hier die Leerzeichen berücksichtigt. Damit das sauber funktioniert, muss hier der wrap mit | begonnen und auch wieder abgeschlossen werden. Nur die mittlere Tilde | wird mit dem aktuellen Inhalt ersetzt.

page.123 = TEXT
page.123.value = Hallo
page.124 = TEXT
page.124.value = zusammen
page.125 = TEXT
page.125.value = Hallo
page.125.noTrimWrap = || |
page.126 = TEXT
page.126.value = zusammen

wrap2

Typ: wrap

Ist genau das gleiche wie wrap. Einzigster Unterschied: Dieses wrap2 wird nach der wrap-Eigenschaft ausgeführt.

page.123 = TEXT
page.123.value = Ich werde jetzt 2mal gewickelt
page.123.wrap = <b>|</b>
page.123.wrap2 = <i>|</i>

Ergebnis:

<i><b>Ich werde jetzt 2mal gewickelt</b></i>

dataWrap

Typ: string mit getText

dataWrap ist eine extreme Erleichterung, um Inhalte mit Variablen aus dem TYPO3-System zu mischen. Ich weiß nicht seit wann, aber Ihr könnt auch mehrere Variablen im dataWrap definieren, wie hier im Beispiel. Ich meine die Angabe von mehreren Variablen im Text war damals noch nicht möglich. Naja...es geht jetzt auf jeden Fall. schick schick :-)

Alle Variablen sind vom Typ getText. Alle Angaben, die Ihr also in der data-Eigenschaft machen könnt haben auch hier Ihre Gültigkeit.

page.123 = TEXT
page.123.value = Ich werde noch hinter dem dataWrap angezeigt. Mich kann man aber auch weglassen
page.123.dataWrap = Seitenname: {LEVELTITLE:1}; Seiten-ID: {TSFE:id}

prepend

Ist genau das Gleiche wie preCObject, mit dem einzigen Unterschied das prepend nach preCObject ausgeführt wird.

append

Ist genau das Gleiche wie postCObject, mit dem einzigen Unterschied das append nach postCObject ausgeführt wird.

wrap3

Ist genau das Gleiche wie wrap, mit dem einzigen Unterschied das wrap3 nach wrap und wrap2 ausgeführt wird.

orderedStdWrap Seit TYPO3 4.7

Typ: numerisches Array mit stdWrap

Mit orderedStdWrap könnt Ihr Euch Eure eigene stdWrap Reihenfolge zusammen bauen. Die Numerischen Arrays werden aufsteigend abgearbeitet. Innerhalb eines jeden Arrays gilt jedoch wieder die offizielle stdWrap Reihenfolge.

page.123 = TEXT
page.123.value = 123Hallo
page.123.orderedStdWrap.10.intval = 1
page.123.orderedStdWrap.20.setContentToCurrent = 1
page.123.orderedStdWrap.30.if.value.current = 1
page.123.orderedStdWrap.30.if.equals = 123
page.123.orderedStdWrap.30.wrap = <h1>Zahl: |</h1>

Der Text wird erstmal durch intval geschleust und dann in die Zwischenablage current abgelegt und das, obwohl intval eigentlich erst nach setContentToCurrent kommt. Wahnsinn. Ist das schräg. Dann hole ich den Wert aus der Zwischenablage wieder heraus und vergleiche ihn mit der Zahl 123. Wenn das übereinstimmt, wird die Zahl in h1 gewickelt.

outerWrap

Typ: wrap, stdWrap

und noch eine wrap-Eigenschaft, die nach dem offiziellen wrap ausgeführt wird.

insertData

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Beide Beispiele machen exakt das Gleiche. Der Inhalt mit Variablen wird durchsucht und die Variablen werden dann in den enthaltenen Text eingefügt. Auch hier gilt wieder: Alle Variablen aus getText sind erlaubt.

page.123 = TEXT
page.123.value = Seitenname: {LEVELTITLE:1}; Seiten-ID: {TSFE:id}
page.123.insertData = 1
page.124 = TEXT
page.124.dataWrap = Seitenname: {LEVELTITLE:1}; Seiten-ID: {TSFE:id}

offsetWrap Wurde nie als veraltet deklariert und mit TYPO3 8.0 direkt entfernt

Typ: x,y

Mit offsetWrap wird der Inhalt in eine Tabelle gewickelt. Die Angaben zu x und y werden als Pixel interpretiert und geben an, wo in der Tabelle von oben links der Inhalt angezeigt werden soll. Das Resultat ist eine Tabelle mit 2 Spalten und 2 Zeilen. Die Zelle 1-1 spiegelt ein clear.gif mit den Maßen aus x und y wieder. Zellen 1-2 und 2-2 bleiben leer. Zelle 2-2 enthält dann unseren Inhalt.

page.123 = TEXT
page.123.value = versetzter Eintrag in einem Tabellenfeld
page.123.offsetWrap = 20,30

Grobe Ausgabe im Quellcode:

<table>
  <tr>
    <td>clear.gif mit Maßen aus x, y</td>
    <td>leer</td>
  </tr>
  <tr>
     <td>leer</td>
    <td>Inhalt</td>
   </tr>
</table>

Mit Hilfe der Untereigenschaften tableParams und tdParams kann die Tabelle näher definiert werden (border, cellpadding, cellspacing).

postUserFunc

Ist genau das Gleiche wie preUserFunc, mit dem einzigen Unterschied das postUserFunc nach preUserFunc ausgeführt wird.

postUserFuncInt

Ist das gleiche wie postUserFunc, jedoch mit dem Unterschied, dass postUserFuncInt nicht gecacht wird.

prefixComment

Typ: string

Dieses Beispiel ummantelt den kompletten Inhalt mit einem Kommentar davor und dahinter. Auch hier sind wieder alle Variablen aus getText vergügbar.

page.123 = TEXT
page.123.value = Ich bin ein kommentierter Inhalt
page.123.prefixComment = |Hier steht der Inhalt aus Seite {TSFE:id}

Ergebnis:

<!-- Hier steht der Inhalt aus Seite 34 [begin] -->
	Ich bin ein kommentierter Inhalt
<!-- Hier steht der Inhalt aus Seite 34 [end] -->

Dieses Beispiel erzeugt die gleiche Ausgabe, nur wird hier alles um 3 Tabs nach rechts eingerückt:

page.123 = TEXT
page.123.value = Ich bin ein kommentierter Inhalt
page.123.prefixComment = 3|Hier steht der Inhalt aus Seite {TSFE:id}

prefixComment funktioniert nur, wenn es im page-TSConfig nicht deaktiviert wurde.

editIcons

Sobald ich diese Option setze kachelt mir meine komplette Seite mit einer riesen Fehlermeldung ab. Werd wohl genauer analysieren müssen woran das liegt.

editPanel

Da das AdminPanel über die User-TSConfig konfiguriert wird, weiß ich noch nicht ganz wozu hier nochmal auf das ContentElement ADMPANEL verwiesen wird.

cache Seit TYPO3 4.7

Typ: cache

Mit dieser Eigenschaft könnt Ihr den erzeugten Inhalt in TYPO3s CachingFramework ablegen. Eine wunderbare Möglichkeit, um generierte Inhalte, die lange zum Rendern benötigt haben, wiederzuverwenden. Die Daten landen in der Standardkonfiguration in der Tabelle cf_cache_hash. Der Tag in der Tabelle cf_hash_hash_tags. Schön ist auch, dass dieser Eintrag auch nach Leeren des Caches dieser einen Seiten (Listenmodul) weiterhin erhalten bleibt. Mit dem FlushFrontendCache-Button ist der Eintrag dann wieder verschwunden.

page.123 = TEXT
page.123.value = versetzter Eintrag in einem Tabellenfeld
page.123.field = title
page.123.override.data = PAGE:cache_tags
# Ein eindeutiger Identifizierer, mit dem mein Cache wiedergefunden werden kann
page.123.cache.key = meinSpeziellerCacheEintrag
# Gültigkeit des Cacheeintrages in Sekunden. Hier: 1 Tag
page.123.cache.lifetime = 86400
# Eine Art Kategorie, die ich meinem Cacheeintrag zuweisen kann
# Falls ich diesen Tag mehrfach verwende, kann ich mit
# TCEMAIN.clearCacheCmd = cacheTag:meinSeitenTitel
# alle Cacheeinträge löschen, die diesem Tag zugeordnet sind
page.123.cache.tags = meinSeitenTitel

debug

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Grade bei einem solch Durcheinander von Daten generierenden Eigenschaften, kann man schonmal schnell den Überblick darüber verlieren, welchen Wert das Inhaltselement nun schlussendlich hat. Hier hilft es debug auf 1 zu setzen und es wird der aktuelle Inhalt im Frontend ausgegeben.

page.123 = TEXT
page.123.value = versetzter Eintrag in einem Tabellenfeld
page.123.field = title // subtitle // nav_title
page.123.override.data = PAGE:cache_tags
page.123.debug = 1

debugFunc

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Arbeitet wie debug. Mit dem Unterschied, dass der Inhalt nicht irgendwo im Contentbereich der Seite angezeigt wird und evtl. von irgendwelchen Elementen verdeckt wird, sondern ganz oben auf der Seite.

debugFunc=2 erzeugt eine Tabelle mit weißen Hintergrund und enthaltenem Inhalt. Hier kann man den Text gleich viel besser lesen.

page.123 = TEXT
page.123.value = Hallo zusammen
page.123.debugFunc = 1

debugData

Typ: Boolean, stdWrap (seit TYPO3 6.0)

Die debugData-Eigenschaft gibt das komplette Array des aktuellen Datensatzes aus. Heißt: Wenn wir unser TypoScript in einem Inhaltselement von tt_content eingetragen haben, dann wird der komplette Inhalt dieser tt_content-Tabelle ausgegeben. Dasselbe mit pages, sofern sich unser TypoScript im Haupttemplate befindet:

page.123 = TEXT
page.123.value = Hallo zusammen
page.123.debugData = 1