De:TSref/split
TypoScriptTSref TypoScript Functions
Contents |
split
Diese Funktion wird verwendet, um den Inhalt (z.B. eine Zeichenkette) anhand eines bestimmten Zeichens zu teilen (splitten) und die dadurch entstehenden Teile durch weitere Funktionen zu bearbeiten. PHP-Programmierer werden eine gewisse Ähnlichkeit in der explode()-Funktion wieder finden.
| Eigenschaft: | Datentyp: | Beschreibung: | Standardwert: |
| token | str /stdWrap | String oder ASCII-Wert (token) der den Inhalt aufsplitten soll (use decimal ascii code of the char) | |
| max | int /stdWrap | Maximale Anzahl an Aufsplittungen | |
| min | int /stdWrap | Minimale Anzahl an Aufsplittungen | |
| returnKey | int /stdWrap | Anstatt jedes Einzelteil zu verarbeiten, soll einfach und SOFORT nur der enthaltene Wert des gewünschten Indexes zurückgegeben werden. | |
| cObjNum | cObjNum | This is a pointer the array of this object ("1,2,3,4"), that should treat the items, resulting from the split. | |
| 1,2,3,4 | CARRAY /stdWrap | The object that should treat the value.
NOTE: The "current"-value is set to the value of current item, when the objects are called. See "stdWrap" / current. Example (stdWrap used): 1.current = 1 1.wrap = <B> | </B> Example (CARRAY used):
1 {
10 = TEXT
10.current = 1
10.wrap = <B> | </B>
20 = CLEARGIF
20.height = 20
}
| |
| wrap | wrap | Definiert einen wrap für jedes Teil. |
[tsref:->split]
Ein sehr schlichtes Beispiel
Wir wollen folgenden Text anhand der enthaltenen Kommas aufsplitten:
grün, grün, gelb, blau, rot, grün
Dazu benötigen wir diesen Code:
page.10 = TEXT page.10.value = grün, grün, gelb, blau, rot, grün page.10.split.token = ,
Auf der Webseite erhalten wir dann diese Ausgabe:
grün grün gelb blau rot grün
Das Beispiel zeigt nur die rudimentäre Funktionsweise von Split und beinhaltet auch gleichzeitig ein kleines Problem: Das Leerzeichen. In erster Linie haben wir Glück, denn Typo3 speichert solche kommagetrennten Listen immer OHNE Leerzeichen in die Datenbank. Um trotzdem Leerzeichen zu berücksichtigen, greifen wir auf die stdWrap-Funktion noTrimWrap zurück:
page.10 = TEXT page.10.value = grün, grün, gelb, blau, rot, grün page.10.split.token = , page.10.split.noTrimWrap = || |
Damit erhalten wir nun folgende richtige Ausgabe im Browser:
grüngrüngelbblaurotgrün
cObjNum und seine Arrays (Teil 1)
Wie im einleitenden Text schon erwähnt, können wir die einzelnen Teile durch weitere Funktionen bearbeiten. Dazu sei gesagt: Wenn wir ein cObjNum angeben, MUSS auch immer ein entsprechendes Array dazu vorhanden sein. Diese beiden Werte arbeiten immer zusammen. Hat cObjNum den Wert 1, dann MUSS es auch ein Array mit der 1 geben.
Beispiel
page.10 = TEXT
page.10.value = grün, grün, gelb, blau, rot, grün
page.10.split {
token = ,
token.noTrimWrap = || |
cObjNum = 1
wrap = <br />
1.current = 1
1.wrap = |
}
Das Ergebnis schaut wie folgt aus:
grün grün gelb blau rot grün
cObjNum = 1
Damit geben wir an, dass unsere Einzelteile an Hand der Informationen in Array 1 verarbeitet werden sollen
wrap
Die Funktion split besitzt die wrap-Eigenschaft. Damit wird JEDES Einzelteil gewrappt, unabhängig davon, durch welches CARRAY das Einzelteil verarbeitet wird. Dazu später mehr.
current = 1
Damit greifen wir auf den aktuellen Datensatz zu. Ja...man könnte es als eine Art "Schleife" bezeichnen, denn in ersten Durchlauf erhalten wir damit "grün", im Zweiten nochmal "grün", im dritten "gelb" und so weiter...
Warum klappt das mit dem current=1?
Dieses Array 1 ist nicht wie erwartet vom Typ COA sondern vom Typ CARRAY. Der große Unterschied ist, dass CARRAY die stdWrap-Funktionalitäten direkt enthalten.
cObjNum und seine Arrays (Teil 2)
Wir können jedes einzelne Teil mit einer beliebigen Funktion bearbeiten. So können wir sogar angeben, dass das erste Teil fett, das Zweite kursiv uns alle anderen Teile unterstrichen sind.
Beispiel
page.10 = TEXT
page.10.value = grün, grün, gelb, blau, rot, grün
page.10.split {
token = ,
token.noTrimWrap = || |
cObjNum = 1 || 2 || 3
wrap = <br />
1.current = 1
1.wrap = <strong>|</strong>
2.current = 1
2.wrap = <em>|</em>
3.current = 1
3.wrap = <u>|</u>
}
Das Ergebnis schaut wie folgt aus:
grün grün gelb blau rot grün
cObjNum und seine Arrays (Teil 3)
Die Eigenschaft cObjNum ist nicht nur ein String, sondern besitzt auch die Eigenschaften des OptionSplit. Ein einfaches Beispiel habt Ihr schon im letzten Kapitel gesehen, deshalb hier ein etwas Komplexeres.
Beispiel
page.10 = TEXT
page.10.value = grün, grün, gelb, blau, rot, grün
page.10.split {
token = ,
token.noTrimWrap = || |
cObjNum = 1 |*| 2 || 3 |*| 1
1.current = 1
1.wrap = <div style="color: #FF0000;">|</div>
2.current = 1
2.wrap = <div style="color: #00FF00;">|</div>
3.current = 1
3.wrap = <div style="color: #0000FF;">|</div>
}
Das Ergebnis schaut wie folgt aus:
grün grün gelb blau rot grün
min und max
Mit diesen Werten können wir angeben, wie viele Werte min oder max angezeigt werden sollen. Auch hier wieder ein kleines Beispiel, indem nur die ersten VIER unserer Wörter in rot angezeigt werden:
Beispiel (max)
page.10 = TEXT
page.10.value = grün,grün,blau,gelb,rot,grün
page.10.split {
token = ,
cObjNum = 1
max = 4
1.current = 1
1.wrap = <div style="color: #FF0000;">|</div>
}
Ergebnis:
grün grün blau gelb rot grün
Ich habe mir die split-Funktion mal näher angeschaut und festgestellt, das es keinen Sinn macht einen max-Wert anzugeben, der größer ist als die Anzahl in unserem value. Das Script arbeitet dann einfach mit der Anzahl Wörter weiter und interessiert sich nicht für den max-Wert. Dasselbe auch bei min. Min wird nur dann verarbeitet, wenn min größer ist als die Anzahl in unserem value. Deshalb setze ich min in unserem nächsten Beispiel auf 10:
Beispiel (min)
page.10 = TEXT
page.10.value = grün,grün,blau,gelb,rot,grün
page.10.split {
token = ,
cObjNum = 1
min = 10
1.current = 1
1.wrap = <div style="color: #FF0000;">|</div>
}
Ergebnis:
grün grün blau gelb rot grün
Wofür das min gut ist, obwohl wir doch nur 6 Einzelteile haben? Seht Ihr die 4 Leerzeilen unterhalb der sechs Wörter im oberen Kasten? Das Array 1 wird also noch 4 weitere Male ausgeführt, allerdings OHNE Inhalt. Ich habe nur EINE relativ "sinnvolle" Idee, wofür diese Funktion evtl. genutzt werden könnte. Dazu in den nächsten Kapiteln mehr.
Register SPLIT_COUNT
Mit jedem Durchlauf der Einzelteile, wird ein Wert im TYPO3 internen Register um 1 erhöht. Im folgenden Beispiel werden wir auf diesen Wert zugreifen und mitsamt dem Inhalt ausgeben lassen:
Beispiel
page.10 = TEXT
page.10.value = grün,grün,blau,gelb,rot,grün
page.10.split {
token = ,
cObjNum = 1
1.current = 1
1.dataWrap = <div style="color: #FF0000;">{register:SPLIT_COUNT} = |</div>
}
Ergebnis:
0 = grün 1 = grün 2 = blau 3 = gelb 4 = rot 5 = grün
Hier noch ein Beispiel mit min aus unserem letzten Kapitel
Beispiel mit min
page.10 = TEXT
page.10.value = grün,grün,blau,gelb,rot,grün
page.10.split {
token = ,
cObjNum = 1
min = 10
1.current = 1
1.dataWrap = <div style="color: #FF0000;">{register:SPLIT_COUNT} = |</div>
}
Ergebnis:
0 = grün 1 = grün 2 = blau 3 = gelb 4 = rot 5 = grün 6 = 7 = 8 = 9 =
Hier könnt Ihr schon etwas besser erkennen, wozu min fähig ist.
ReturnKey
Das Thema ist sehr simpel. Kurz: Wollt Ihr nicht, dass split die kompletten Einzelteile durchgeht, sondern direkt ein bestimmtes Wort anspringt, dann setzt returnKey einfach auf den entsprechenden Durchlaufswert. Bei unseren 6 Wörter zählt split folgendermaßen: 0,1,2,3,4,5. Wenn wir also das Wort blau haben wollen, dann müssen wir returnKey auf 2 setzen. Wenn ihr mit den Zahlen nicht klarkommt, dann könnt Ihr ja einfach das Script aus dem vorigen Kapitel nehmen, dort werden Euch die Zahlen angezeigt.
Beispiel
page.10 = TEXT
page.10.value = grün,grün,blau,gelb,rot,grün
page.10.split {
token = ,
cObjNum = 1
returnKey = 2
1.current = 1
1.dataWrap = <div style="color: #FF0000;">{register:SPLIT_COUNT} = |</div>
}
Ergebnis:
blau
Alle anderen Werte werden nicht berücksichtigt.
Warum ist das Wort nicht rot?
In der Doku steht soviel wie "SOFORT". Soll heißen: Mit returnKey greife ich SOFORT und OHNE Umwege auf das gewünschte Wort zu. Für unser Script heißt das, es würde reichen wenn wir es entsprechend abspecken:
Beispiel
page.10 = TEXT
page.10.value = grün, grün, blau, gelb, rot, grün
page.10.split {
token = ,
token.noTrimWrap = || |
returnKey = 2
}
Ordered List mit split
In diesem Kapitel habe ich für Euch noch eine Idee, wie man die Wörter beginnend mit 1 durchnummerieren kann:
Beispiel
page.10 = TEXT
page.10.value = grün,grün,blau,gelb,rot,grün
page.10.wrap = <ol>|</ol>
page.10.split {
token = ,
cObjNum = 1
wrap = <li>|</li>
1.current = 1
}
Ergebnis:
- grün
- grün
- gelb
- blau
- rot
- grün
Split und Datenbank
In diesem Kapitel kommt das zusammen, was auch zusammen gehört. In dem nächsten Beispiel wollen wir uns alle FE-User in einer geordneten Liste anzeigen lassen:
Beispiel
page.10 = TEXT
page.10 {
cObject = CONTENT
cObject {
table = fe_users
select {
pidInList = 12
}
renderObj = TEXT
renderObj {
field = name
required = 1
wrap = ###SPLITTER###|
}
stdWrap.substring = 14
}
wrap = <ol>|</ol>
split {
token = ###SPLITTER###
cObjNum = 1
wrap = <li>|</li>
1.current = 1
}
}
Mit dem cObject CONTENT greifen wir auf die Tabelle fe_users zu und zwar nur auf die User, die sich auf der Seite mit der ID 12 befinden. Mit renderObj können wir den Datensätzen ein gewünschtes Format zuweisen und mitteilen, welches Feld wir für unsere Ausgabe verwenden wollen. In diesem Fall "name".
Was hat das mit dem ###SPLITTER### auf sich? Die ganze Zeit haben wir das Komma als Separator (token) verwendet, aber im Bereich von Datenbanken könnte es ja durchaus sein, das sich auch mal ein Komma in einen Datensatz verirrt hat und schon haben wir einen Trenner zuviel. Deshalb rate ich: Greift Ihr mit split auf Datenbankeinträge zu, dann verwendet bitte einen eindeutigen Token!
Weitere Beispiele
# Beispiel
20 = TEXT
# Der Inhalt des Feldes "bodytext" wird importiert (aus $cObj->data-array)
20.field = bodytext
20.split {
# Das Trennzeichen (char = 10 ist der Zeilenumbruch) wird definiert
token.char = 10
# Es wird festgelegt, welches Element verwendet werden soll
# Über optionSplit kann hier zwischen unterschiedlichen Elementen
# unterschieden werden. Ein Entsprechendes Element mit der Nummer muss definiert sein!
# An dieser Stelle wird die optionSplit Eigenschaft verwendet,
# es wird immer abwechselnd das Element 1 und dann das Element 2 zum Render verwendet
# dadurch kann z.B. die Hintergrundfarbe abwechselnd eingefärbt werden.
cObjNum = 1 || 2
# Das Element 1 wird definiert (das, auf welches sich cObjNum bezieht!)
# Und der Inhalt wird importiert.
1.current = 1
# Das Element wird gewrapt
1.wrap = <TR><TD valign="top"><IMG src="dot1.gif"></TD><TD valign="top"> | </TD></TR>
2.current = 1
2.wrap = <TR><TD valign="top"><IMG src="dot2.gif"></TD><TD valign="top"> | </TD></TR>
}
20.wrap = <TABLE border="0" cellpadding="0" cellspacing="3" width="368"> | </TABLE><BR>
# Dateien aus einem bestimmten Verzeichnis auslesen, anzeigen und verlinken page.100 = HTML # Verzeichnis, Dateityp usw. auswählen page.100.value.filelist = fileadmin/dateien/|jpg,jpeg|name| |1 # Wir bekommen eine komma-getrennte Liste mit den Dateinamen # wir benötigen die Split-Funktion um diese Elemente einzeln zu bearbeiten. page.100.value.split { token = , cObjNum = 1 1 { 10 = IMAGE # wir importieren den aktuellen Dateinamen (current) 10.file.import.current=1 # Anzeige nur mit 250px Breite 10.file.width = 250px # Zusätzlich wird ein Link erstellt, der auf die richtige Datei verlinkt. 10.stdWrap.typolink.parameter.current = 1 10.wrap = <div style="padding:10px;">|</div> } }