Benutzer-Werkzeuge

Webseiten-Werkzeuge


typo3:about:functions:split

split

Mit split lassen sich Strings anhand frei wählbarer Trennzeichen in ein Array umwandeln, dessen Werte anschließend mit optionSplit und stdWrap weiterverarbeitet werden können. Typisches Szenario ist eine kommaseparierte Liste.

Die erhaltenen Werte werden mit cObjNum einem (oder mehreren) cObj zugewiesen. Mithilfe von current wird der aktuelle Wert übergeben, der für jedes cObject in $this→data[$this→currentValKey] hinterlegt ist.

TYPO3 speichert die Ergebnisse von split zudem im Register SPLIT_COUNT. Weiter unten ist ein Anwendungsbeispiel für dieses Register erklärt.

Eigenschaften von split

EigenschaftDatentypBeschreibung
tokenstring / stdWrapDer Wert dient als Trennzeichen zwischen den einzelnen Werten und kann ein einzelnes Zeichen oder eine Zeichenkette sein. Mit stdWrap.char lassen sich die Dezimalwerte der ASCII-Zeichen verwenden.
10 = TEXT
10.value = eins,zwei,drei
10.split.token = ,
[...]
 
10.value = einsSTOPzweiSTOPdrei
10.split.token = STOP
[...]
 
# 'char = 10' bedeutet einen Zeilenumbruch im ASCII-Code
10 = TEXT
10.value (
  eins
  zwei
  drei
)
10.split.token.char = 10
[...]
maxinteger / stdWrapGibt die maximale Anzahl der ausgegebenen Werte an.
10 = TEXT
10.value = eins,zwei,drei,vier,fünf,sechs
10.split {
  token = ,
  cObjNum = 1
  max = 3
  1.current = 1
  1.wrap = |+
}
# Ausgabe: eins+zwei+drei+
mininteger / stdWrapGibt die Mindestanzahl der ausgegebenen Werte an. Dies bedeutet nicht, dass bei weniger Werten keine Ausgabe erfolgt, sondern, dass bei zu wenig Werten die Anweisungen im cObj trotzdem durchgeführt werden! Die Angaben in min haben Vorzug vor max.
10 = TEXT
10.value = eins,zwei,drei,vier,fünf,sechs
10.split {
  token = ,
  cObjNum = 1
  min = 9
  1.current = 1
  1.wrap = |+
}
# Ausgabe: eins+zwei+drei+vier+fünf+sechs++++
returnKeyinteger / stdWrapWenn diese Eigenschaft benutzt wird, werden nicht alle Werte nacheinander geparst, sondern nur der hier angegebene Wert direkt ausgegeben. cObjNum und ggf. definierte cObjects haben in dem Fall keinerlei Auswirkung und können daher entfallen.
10 = TEXT
10.value = eins,zwei,drei,vier,fünf,sechs
10.split {
  token = ,
  returnKey = 0
}
# Ausgabe: eins
cObjNumcObjNum +optionSplit / stdWrapDient als Pointer auf die zu definierenden cObjects (1,2, …). Mit optionSplit lassen sich die eingehenden Werte beliebig aufteilen, um sie unterschiedlich verarbeiten zu können.
cObjNum = 1||2 |*| 5||3 |*| 4||6
1,2,3,4CARRAY / stdWrapDie Objekte, mit denen die Werte verarbeitet werden; sie müssen unter cObjNum referenziert worden sein. Da sie vom Typ CARRAY sind, müssen sie nicht noch einmal als cObject erzeugt werden (1 = TEXT), sondern können direkt mit stdWrap bearbeitet werden. Es ist möglich, Unterobjekte anzuwenden, die dann als cObject erzeugt werden müssen (1.10 = TEXT).
Die aktuellen Werte werden mit current = 1 aus der Variable ins Array geladen.
10 = TEXT
10.value = eins,zwei,drei,vier
10.split {
  token = ,
  cObjNum = 1
  1.10 = TEXT
  1.10.current = 1
  1.20 = TEXT
  1.20.value = und
  1.20.noTrimWrap = | | |
}
# Ausgabe: eins und zwei und drei und vier und
wrapwrap +optionSplit / stdWrapUmschließt die fertigen cObjects mit einem Wrap. Das Anwenden von optionSplit ist möglich, dieser muss natürlich nicht identisch sein mit dem ggf. unter cObjNum definierten optionSplit.
10 = TEXT
10.value = eins,zwei,drei,vier
10.split {
  token = ,
  cObjNum = 1
  1.current = 1
  wrap = |*| <h1>|</h1>||<p>|</p>|*|
}
# Ausgabe: <h1>eins</h1><p>zwei</p><h1>drei</h1><p>vier</p>

Einfaches Beispiel

10 = TEXT
10.value = eins,zwei,drei,vier,fünf
10.split { 
  token = ,
  cObjNum = 1
  1.current = 1
  1.wrap = |<br>
}

Ergebnis:

eins<br>
zwei<br>
drei<br>
vier<br>
fünf<br>

split mit optionSplit

Eine genaue Beschreibung von optionSplit findet sich hier. Damit lassen sich einzelne Werte auf unterschiedliche Art weiterverarbeiten. Der optionSplit wird bei cObjNum angewendet, die darin enthaltenen Nummern lassen sich als cObjects mit stdWrap-Funktionen modifizieren. Hierzu muss der aktuelle Wert mit current geladen werden.

Alternativ kann auch ein eigener Wert mit value, data oder ähnlichem verwendet werden, um die geladenen Werte zu überschreiben oder zu ergänzen. Es können nur cObjects verwendet werden, die unter cObjNum definiert wurden. Unterobjekte sind aber möglich (1.10, 1.20, …).

10 = TEXT
10.value = eins+zwei+drei+vier+fünf
10.split {
  token = +
  cObjNum = 1 |*| 2 |*| 3
  1.current = 1
  1.wrap = <span style="color:red">|,</span>
  2.current = 1
  2.wrap = <span style="color:orange">|,</span>
  3.10 = TEXT
  3.10.current = 1
  3.10.wrap = <span style="color:blue">|,</span>
  3.20 = TEXT
  3.20.value = sechs
  3.20.wrap = <span style="color:green">|</span>
} 

<html> Ergebnis: eins,zwei,drei,vier,fünf,sechs </html>


register:SPLIT_COUNT

Die Ergebnisse von split werden im Register SPLIT_COUNT gespeichert. Mit den getText-Funktionen kann hierauf zugegriffen werden. Im folgenden Beispiel wird mit diesem Register eine Aufzählung realisiert.

Da immer bei Null angefangen wird zu zählen, müssen im ersten Schritt die Werte von SPLIT_COUNT um eins erhöht werden. Dazu wird mit LOAD_REGISTER das Register SPLIT_COUNT überschrieben: Mit stdWrap wird in einem cObject das aktuelle Register geladen, um dem jeweils aktuellen Wert mit einem Wrap die Angabe +1 hinzuzufügen. Anschließend wird mit prioriCalc der jeweilige Wert berechnet.
Im zweiten Schritt werden die so berechneten Werte mit einem dataWrap ausgegeben.

10 = TEXT
10.value = eins,zwei,drei,vier
10.split {
  token = ,
  cObjNum = 1
  1.10 = LOAD_REGISTER
  1.10.SPLIT_COUNT {
    cObject = TEXT
    cObject.data = register:SPLIT_COUNT
    cObject.wrap = |+1
    prioriCalc = intval
  }
  1.20 = TEXT
  1.20.current = 1
  1.20.noTrimWrap = | ||
  1.20.dataWrap = <p>{register:SPLIT_COUNT} = |</p>
}

Ausgabe:

<p>1 = eins</p>
<p>2 = zwei</p>
<p>3 = drei</p>
<p>4 = vier</p>

Inhalte aus der Datenbank mit split verarbeiten

Im folgenden Beispiel werden die Überschriften aller Inhaltselemente einer Seite nummeriert ausgegeben. Auf der Seite enthalten sind Inhaltselemente mit den Überschriften „Überschrift“, „Headline mit Stop als Wert“ und „Schlagzeile“.

  • temp.headlines:
    1. Aus der Datenbanktabelle tt_content wird ganz normal das Feld header ausgelesen.
    2. Unter select wird Sortierung und Spalte angegeben. Mit pidInList kann eine bestimmte Seite angegeben werden. Fehlt die Angabe, bezieht sich die Ausgabe immer auf die aktuelle Seite.
    3. Unter renderObj wird mit required festgelegt, dass eine Überschrift vorhanden sein muss; sonst würden auch Inhaltselemente mitgerechnet, die ein leeres header-Feld besitzen. Die Ausgabe wäre dann eine Nummerierung ohne weiteren Inhalt.
    4. Außerdem wird im renderObj ein wrap hinzugefügt, falls ein Wert vorhanden ist. Hiermit wird der string STOP vor jede Überschrift gesetzt, was später als Trennzeichen von split dienen soll.
    5. Mit stdWrap.substring = 4 wird das Ergebnis der gesamten Abfrage um 4 Zeichen beschnitten, da sonst STOP auch am Beginn des Strings steht.
    6. Das Gesamtergebnis des cObjects CONTENT wird als String in temp.headlines geladen.

Das Ergebnis bis hierhin: ÜberschriftSTOPHeadline mit Stop als WertSTOPSchlagzeile
(zur besseren Lesbarkeit sind die Trennzeichen fett gesetzt)

  • page.10:
    1. Der Inhalt von temp.headlines wird ins cObject 10 geladen.
    2. split wird mit dem Trennzeichen STOP angewendet. Dies passiert case-sensitive, das Wort Stop in der zweiten Überschrift wird also nicht als Trennzeichen behandelt!
    3. Wie im oberen Beispiel wird der Wert von SPLIT_COUNT um eins erhöht und anschließend mit dataWrap dem aktuellen Wert hinzugefügt.
    4. Mit 1.20.required = 1 wird sichergestellt, dass ein Wert vorhanden ist. Sind auf einer Seite keine Inhaltselemente mit Überschrift vorhanden, wird so auch die Ausgabe der ersten Nummerierung verhindert.
temp.headlines = TEXT
temp.headlines.cObject = CONTENT
temp.headlines.cObject {
  table = tt_content
  select {
    orderBy = sorting
    where = colPos=0
    #pidInList = 28
  }
  renderObj = TEXT
  renderObj {
    field = header
    required = 1
    wrap = STOP|
  }
  stdWrap.substring = 4
}
 
page = PAGE
page.10 < temp.headlines
page.10.split {
  token = STOP
  cObjNum = 1
  1.10 = LOAD_REGISTER
  1.10.SPLIT_COUNT {
    cObject = TEXT
    cObject.data = register:SPLIT_COUNT
    cObject.wrap = |+1
    prioriCalc = intval
  }
  1.20 = TEXT
  1.20.current = 1
  1.20.noTrimWrap = | ||
  1.20.dataWrap = <p>{register:SPLIT_COUNT} = |</p>
  1.20.required = 1
}

Ausgabe:

<p>1 = Überschrift</p>
<p>2 = Headline mit Stop als Wert</p>
<p>3 = Schlagzeile</p>
typo3/about/functions/split.txt · Zuletzt geändert: 2015/12/03 19:32 von 127.0.0.1