Benutzer-Werkzeuge

Webseiten-Werkzeuge


typo3:about:functions:split

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
typo3:about:functions:split [2014/03/04 21:41] admintypo3:about:functions:split [2015/12/03 19:32] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 ====== split ====== ====== split ======
  
-Mit ''split'' lassen sich Strings anhand frei wählbarer Trennzeichen in einzelne Objekte aufteilen und anschließend verarbeiten. Typisches Szenario ist eine kommaseparierte Liste mit Werten.+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, siehe optionSplit) cObj zugewiesen. Mithilfe von ''current'' wird der aktuelle Wert übergeben. TYPO3 speichert die Ergebnisse von split im Register //SPLIT_COUNT//.+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 ===== ===== Eigenschaften von split =====
Zeile 28: Zeile 30:
 [...] [...]
 </code>| </code>|
-^max|string / stdWrap| | +^max|integer / stdWrap|Gibt die maximale Anzahl der ausgegebenen Werte an. <code typoscript> 
-^min|string / stdWrap| | +10 = TEXT 
-^returnKey|integer / stdWrap| | +10.value = eins,zwei,drei,vier,fünf,sechs 
-^cObjNum|//cObjNum// +optionSplit / stdWrap| | +10.split { 
-^1,2,3,4|CARRAY / stdWrap| | +  token = , 
-^wrap|wrap +optionSplit / stdWrap| | +  cObjNum = 1 
- +  max = 3 
-===== Beispiele =====+  1.current = 1 
 +  1.wrap = |+ 
 +
 +# Ausgabe: eins+zwei+drei+ 
 +</code>
 +^min|integer / stdWrap|Gibt 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''. <code typoscript> 
 +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++++ 
 +</code>
 +^returnKey|integer / stdWrap|Wenn 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. <code typoscript> 
 +10 = TEXT 
 +10.value = eins,zwei,drei,vier,fünf,sechs 
 +10.split { 
 +  token = , 
 +  returnKey = 0 
 +
 +# Ausgabe: eins 
 +</code>
 +^cObjNum|//cObjNum// +optionSplit / stdWrap|Dient 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. <code typoscript> 
 +cObjNum = 1||2 |*| 5||3 |*| 4||6 
 +</code>
 +^1,2,3,4|CARRAY / stdWrap|Die 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. <code typoscript> 
 +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 
 +</code>
 +^wrap|wrap +optionSplit / stdWrap|Umschließ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''. <code typoscript> 
 +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> 
 +</code>| 
 +===== Einfaches Beispiel =====
  
 <code typoscript> <code typoscript>
Zeile 60: Zeile 116:
 ===== split mit optionSplit ===== ===== split mit optionSplit =====
  
-Eine genaue Beschreibung von optionSplit findet sich [[typo3:about:functions:optionsplit|hier]]. Damit lassen sich Werte auf unterschiedliche Art weiterverarbeiten. Der optionSplit wird auf cObjNum angewendet, die darin enthaltenen Nummern lassen sich mit stdWrap-Funktionen +Eine genaue Beschreibung von optionSplit findet sich [[typo3:about:functions:optionsplit|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, ...).
  
 <code typoscript> <code typoscript>
-page = PAGE +10 = TEXT 
-page { +10.value = eins+zwei+drei+vier+fünf 
-  10 = TEXT +10.split { 
-  10.value = eins,zwei,drei,vier,fünf +  token = + 
-  10.split { +  cObjNum = 1 |*| 2 |*| 3 
-    token = , +  1.current = 1 
-    cObjNum = 1 |*| 2 |*| 3 +  1.wrap = <span style="color:red">|,</span> 
-    1.current = 1 +  2.current = 1 
-    1.wrap = <span style="color:red">|,</span> +  2.wrap = <span style="color:orange">|,</span> 
-    2.current = 1 +  3.10 = TEXT 
-    2.wrap = <span style="color:orange">|,</span> +  3.10.current = 1 
-    3.current = 1 +  3.10.wrap = <span style="color:blue">|,</span> 
-    3.wrap = <span style="color:blue">|</span> +  3.20 = TEXT 
-   +  3.20.value = sechs 
-}+  3.20.wrap = <span style="color:green">|</span> 
 +
 </code> </code>
 <html> <html>
 Ergebnis: Ergebnis:
-<span style="color:red;">eins,</span><span style="color:orange;">zwei,</span><span style="color:orange;">drei,</span><span style="color:orange;">vier,</span><span style="color:blue;">fünf</span>+<span style="color:red;">eins,</span><span style="color:orange;">zwei,</span><span style="color:orange;">drei,</span><span style="color:orange;">vier,</span><span style="color:blue;">fünf,</span><span style="color:green">sechs</span>
 </html> </html>
 +
 +----
 +
 +===== register:SPLIT_COUNT =====
 +
 +Die Ergebnisse von ''split'' werden im Register //SPLIT_COUNT// gespeichert. Mit den [[typo3:about:datentypen&s[]=gettext#gettext|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.
 +
 +
 +<code typoscript>
 +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>
 +}
 +</code>
 +
 +Ausgabe:
 +<code html>
 +<p>1 = eins</p>
 +<p>2 = zwei</p>
 +<p>3 = drei</p>
 +<p>4 = vier</p>
 +</code>
 +
 +----
 +
 +===== 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:** 
 +    - Aus der Datenbanktabelle //tt_content// wird ganz normal das Feld //header// ausgelesen.
 +    - 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.
 +    - 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.
 +    - 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.
 +    - Mit ''stdWrap.substring = 4'' wird das Ergebnis der gesamten Abfrage um 4 Zeichen beschnitten, da sonst //STOP// auch am Beginn des Strings steht.
 +    - Das Gesamtergebnis des cObjects CONTENT wird als String in ''temp.headlines'' geladen.
 +
 +__Das Ergebnis bis hierhin:__ Überschrift**STOP**Headline mit Stop als Wert**STOP**Schlagzeile\\
 +(zur besseren Lesbarkeit sind die Trennzeichen fett gesetzt)
 +
 +  * **page.10:**
 +    - Der Inhalt von ''temp.headlines'' wird ins cObject ''10'' geladen.
 +    - ''split'' wird mit dem Trennzeichen //STOP// angewendet. Dies passiert case-sensitive, das Wort //Stop// in der zweiten Überschrift wird also nicht als Trennzeichen behandelt!
 +    - Wie im oberen Beispiel wird der Wert von SPLIT_COUNT um eins erhöht und anschließend mit ''dataWrap'' dem aktuellen Wert hinzugefügt.
 +    - 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.
 +
 +<code typoscript>
 +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
 +}
 +</code>
 +
 +Ausgabe:
 +<code html>
 +<p>1 = Überschrift</p>
 +<p>2 = Headline mit Stop als Wert</p>
 +<p>3 = Schlagzeile</p>
 +</code>
typo3/about/functions/split.1393965679.txt.gz · Zuletzt geändert: 2015/12/03 19:30 (Externe Bearbeitung)