Translations
Info
All page names need to be in English.
en da  de  fr  it  ja  km  nl  ru  zh

De:TSref/split

From TYPO3Wiki
Jump to: navigation, search

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

+optionSplit

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

+optionSplit

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:

  1. grün
  2. grün
  3. gelb
  4. blau
  5. rot
  6. 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>
}
}
Go to: typo3.org    
Login, and you can edit.
Personal tools
Namespaces

Variants
Actions