Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung |
typo3:about:functions:split [2014/03/06 21:34] – [Eigenschaften von split] admin | typo3:about:functions:split [2015/12/03 19:32] (aktuell) – Externe Bearbeitung 127.0.0.1 |
---|
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. | 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. 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 ===== |
# Ausgabe: eins | # Ausgabe: eins |
</code>| | </code>| |
^cObjNum|//cObjNum// +optionSplit / stdWrap| | | ^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> |
^1,2,3,4|CARRAY / stdWrap|Die Objekte, mit denen die Werte verarbeitet werden; müssen unter ''cObjNum'' definiert 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''). <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 = TEXT |
10.value = eins,zwei,drei,vier | 10.value = eins,zwei,drei,vier |
# Ausgabe: eins und zwei und drei und vier und | # Ausgabe: eins und zwei und drei und vier und |
</code>| | </code>| |
^wrap|wrap +optionSplit / stdWrap|Umschließt die fertigen cObjects mit einem Wrap. Das Anwenden von ''optionSplit'' ist möglich. <code typoscript> | ^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 = TEXT |
10.value = eins,zwei,drei,vier | 10.value = eins,zwei,drei,vier |
# Ausgabe: <h1>eins</h1><p>zwei</p><h1>drei</h1><p>vier</p> | # Ausgabe: <h1>eins</h1><p>zwei</p><h1>drei</h1><p>vier</p> |
</code>| | </code>| |
===== Beispiele ===== | ===== Einfaches Beispiel ===== |
| |
<code typoscript> | <code typoscript> |
<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> | <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> |