Das current Durcheinander
In vielen Beispielen/Scripten steht einfach nur
10 = TEXT
10.current = 1
und schon wird irgendein Text ausgegeben oder manchmal auch gar kein Text.
Was hat es mit dem current auf sich?
Ich habe mir dazu mal in der Datei class.tslib_content.php die Eigenschaft current näher angeschaut und Folgendes gefunden:
if ($conf['current']) {$content=$this->data[$this->currentValKey];}
Soll heißen: Wenn current gesetzt ist, dann wird der Wert von $this->data[$this->currentValKey] als der neue Wert für das aktuelle Objekt gesetzt. Um herauszufinden, was in diesem $this->data-Teil drin steht, brauchte ich einfach nur die komplette Datei nach diesem Konstrukt zu durchwühlen und habe festgestellt, dass dieser Wert nur bei bestimmten Funktionen gefüllt wird:
- setCurrentVal
- IMGTEXT
- CASEFUNC
- FORM
- TEMPLATE
- stdWrap
- splitObj
- _parseFunc
Ich habe für Euch ein Beispiel auf Basis der Split-Funktion aufgebaut. Ihr könnt es im Haupttemplate, in meiner Extension sfjquery oder mit Hilfe der Extension ts_cObj sehr einfach nachbauen:
10 = TEXT
10 {
value = blau,grün,weiß,lila
split {
token = ,
cObjNum = 1
1.10 = TEXT
1.10.current = 1
1.20 = TEXT
1.20.current = 1
1.wrap = <b>|</b><br />
}
}
Split geht in diesem Beispiel her und ließt jedes einzelne Element aus dem value aus und stellt es Dank diesem $this->data[]-Dingen allen untergeordneten Objekten (1.10 = TEXT und 1.20 = TEXT) zur Verfügung. Ihr könnt in diesen untergeordneten Objekte nun selbst entscheiden, ob sie mit Ihrer value-Eigenschaft einen eigenen Wert erhalten sollen, oder ob sie mit current=1 auf das Element des Elternelements zugreifen sollen. Probierts mal aus und Ihr werdet folgendes Ergebnis erhalten:
blaublau
grüngrün
weißweiß
lilalila
Value statt current
10 = TEXT
10 {
value = blau,grün,weiß,lila
split {
token = ,
cObjNum = 1
1.10 = TEXT
1.10.current = 1
1.20 = TEXT
1.20.value = Hallo zusammen
1.wrap = <b>|</b><br />
}
}
ergibt:
blauHallo zusammen
grünHallo zusammen
weißHallo zusammen
lilaHallo zusammen
Current und Value gehören nicht zusammen
10 = TEXT
10 {
value = blau,grün,weiß,lila
split {
token = ,
cObjNum = 1
1.10 = TEXT
1.10.current = 1
1.20 = TEXT
1.20.value = Hallo zusammen
1.20.current = 1
1.wrap = <b>|</b><br />
}
}
Sobald current = 1 gesetzt ist, wird der per value übergebene Wert mit dem Wert vom Elternelement überschrieben. Auch wenn das Elternelement nichts zurück gibt, wird value überschrieben. In solchen Fällen bitte die Eigenschaft override verwenden.
Das Ergebnis dieser Funktion:
blaublau
grüngrün
weißweiß
lilalila
Current und setContentToCurrent
10 = TEXT
10 {
value = blau,grün,weiß,lila
split {
token = ,
cObjNum = 1
1.10 = TEXT
1.10.value = Trallala
1.10.setContentToCurrent = 1
1.10.current = 1
1.20 = TEXT
1.20.current = 1
1.wrap = <b>|</b><br />
}
}
Mit setContentToCurrent können wir nun vom untergeordneten Element aus den vom Elternelement zur Verfügung gestellten Wert überschreiben. Diese Änderung wirkt sich dann wiederum auf alle untergeordneten Elemente aus. Deshalb ergibt dieses TS-Konstrukt folgende Ausgabe:
TrallalaTrallala
TrallalaTrallala
TrallalaTrallala
TrallalaTrallala
setCurrent als Abkürzung
10 = TEXT
10 {
value = blau,grün,weiß,lila
split {
token = ,
cObjNum = 1
1.10 = TEXT
1.10.setCurrent = Trallala
1.10.current = 1
1.20 = TEXT
1.20.current = 1
1.wrap = <b>|</b><br />
}
}
Hier das gleiche Beispiel wie oben, nur ohne value und statt setContentToCurrent habe ich diesmal setCurrent verwendet. Das Ergebnis ist das Gleiche. Schön ist auch das setCurrent vom Typ stdWrap ist und somit weitere Modifikationen zur Verfügung stehen.
