Sections und foreach
section war die Schleife und die Bedingung der Template-Sprache, bevor foreach, for und if kamen (siehe
Geschichte). Sie ist weiterhin registriert, ältere Designs und Erweiterungen nutzen sie
überall, und sie kann einige Dinge, die die neueren Funktionen anders lösen. Diese Seite dokumentiert jeden Parameter von
eZTemplateSectionFunction (lib/eztemplate/classes/eztemplatesectionfunction.php) und zeigt neben jedem die moderne Entsprechung. Eine kurze
Anleitung zum Umstellen bietet Section (veraltet).
Inhalt
- Parameter
- Schleife, Namensraum und die Schleifenvariablen
- Zahlen und Zeichenketten
- offset, max, reverse
- show und section-else
- Filter: section-exclude und section-include
- var und last-value
- delimiter und modulo
- Ein Unterschied in kompilierten Templates
- Verwandte Seiten
Parameter
| Parameter | Bedeutung | Moderne Entsprechung |
|---|---|---|
loop | ein Array, eine Zahl oder eine Zeichenkette zum Durchlaufen | foreach (Arrays), for (Zahlen) |
name | der Namensraum für die Schleifenvariablen | nicht nötig: foreach ... as $item |
var | eine einzelne Iteratorvariable statt des Namensraums | foreach ... as $key => $item |
last-value | mit var: $it.last hält den vorigen Iterator | das vorige Element in einer Variablen behalten |
sequence | ein durchgewechseltes Array, $Name:sequence | sequence <array> as $s |
offset, max | überspringen und begrenzen; ein Array zählt als seine Länge | offset, max von foreach |
reverse | rückwärts durchlaufen | reverse |
show | den Rumpf nur verarbeiten, wenn wahr; ohne loop ist es ein if | if |
Kind section-else | was gezeigt wird, wenn show falsch ist | else |
Kind section-exclude match=... | Elemente verwerfen, für die match wahr ist | {if ...}{skip}{/if} |
Kind section-include match=... | Elemente wieder aufnehmen | ein if um den Rumpf |
Kind delimiter [modulo=n] [match=...] | Text zwischen den Durchläufen | delimiter der Schleife |
Schleife, Namensraum und die Schleifenvariablen
Mit name=Loop setzt jeder Durchlauf item, key, index (ab 0), number (ab 1) und, mit einer sequence, sequence im Namensraum
Loop, gelesen als $Loop:item oder, innerhalb der Section, $:item (siehe Namensräume). Ohne Namen landen sie im
aktuellen Namensraum als $item, $key und so weiter und werden nach der Schleife entfernt.
section name=Loop loop=array( 'a', 'b', 'c' ) sequence=array( 'odd', 'even' )[$Loop:item/$Loop:key/$Loop:index/$Loop:number/$Loop:sequence]delimiter,/delimiter/sectionAusgabe:
[a/0/0/1/odd],[b/1/1/2/even],[c/2/2/3/odd]Dasselbe mit foreach:
foreach array( 'a', 'b', 'c' ) as $key => $item sequence array( 'odd', 'even' ) as $seq[$item/$key/$key/$key|inc/$seq]delimiter,/delimiter/foreachAusgabe:
[a/0/0/1/odd],[b/1/1/2/even],[c/2/2/3/odd]Zahlen und Zeichenketten
loop nimmt auch eine Zahl, wobei item von 1 bis n läuft (oder von -1 bis -n bei einer negativen Zahl), und eine Zeichenkette, deren Zeichen
durchlaufen werden. foreach kann beides nicht: Nutzen Sie for, oder teilen Sie die Zeichenkette mit str_split:
[section loop=3$item/section] [section loop=-3$item/section] [section loop='abc' reverse=true()$item/section]
[for 1 to 3 as $i$i/for] [foreach 'abc'|str_split|reverse as $c$c/foreach]Ausgabe:
[123] [-1-2-3] [cba]
[123] [cba]offset, max, reverse
offset verwirft die ersten n Elemente, und max hört nach n verarbeiteten Elementen auf (ein an eines von beiden übergebenes Array zählt als
seine Länge; ein negativer Offset wird mit einer Warnung auf 0 zurückgesetzt). Mit reverse werden die Schlüssel umgekehrt, bevor der Offset
angewendet wird:
[section name=S loop=array( 1, 2, 3, 4, 5, 6 ) offset=1 max=3$S:item/section]
[foreach array( 1, 2, 3, 4, 5, 6 ) as $v offset 1 max 3$v/foreach]
[section name=R loop=array( 1, 2, 3 ) reverse=true()$R:item/section] [foreach array( 1, 2, 3 ) as $v reverse$v/foreach]Ausgabe:
[234]
[234]
[321] [321]show und section-else
show entscheidet, ob der Rumpf überhaupt läuft. Es ist falsch bei false(), 0, einer leeren Zeichenkette und einem leeren Array. Die Kinder
nach {section-else} laufen dann stattdessen. Ohne loop ist section show=... einfach eine Bedingung:
def $results = array()
[section show=$results|countresultssection-elsenothing found/section]
[if $results|countresultselsenothing found/if]Ausgabe:
[nothing found]
[nothing found]def $user = hash( 'name', 'Ada' )
[section show=$user.nameHello $user.name/section]Ausgabe:
[Hello Ada]section-else gehört zu show: Ein leeres loop ohne show gibt überhaupt nichts aus, auch nicht den else-Teil:
[section loop=array()xsection-elseelse part/section]
[section loop=array() show=array()xsection-elseelse part/section]Ausgabe:
[]
[else part]Filter: section-exclude und section-include
Filter-Tags werden für jedes Element im Namensraum der Section ausgewertet, der Reihe nach. Ein exclude, dessen match wahr ist, entfernt das
Element, ein include, dessen match wahr ist, nimmt es wieder auf; der letzte passende Filter entscheidet. Ein ausgeschlossenes Element zählt
nicht für max und bekommt keinen Delimiter. Die Form mit foreach nutzt {skip}:
[section name=F loop=array( 1, 2, 3, 4, 5, 6 )section-exclude match=$:item|mod( 2 )|eq( 0 )$F:item/section]
[section name=G loop=array( 1, 2, 3, 4, 5, 6 )section-exclude match=true()section-include match=$:item|gt( 4 )$G:item/section]
[foreach array( 1, 2, 3, 4, 5, 6 ) as $vif $v|mod( 2 )|eq( 0 )skip/if$v/foreach]Ausgabe:
[135]
[56]
[135]var und last-value
var=it gibt statt eines Namensraums ein einzelnes Iterator-Objekt (eZTemplateSectionIterator). Ausgegeben ist es das aktuelle Element;
seine Attribute sind item, key, index, number, sequence und die eigenen Attribute des Elements. Mit last-value=true() hält das
Attribut last den Iterator des vorigen Durchlaufs:
[section var=it loop=array( 'a', 'b', 'c' ) last-value=true()$itif $it.last (after $it.last)/if; /section]
[section var=it loop=array( 'a', 'b' )$it.item/$it.key/$it.index/$it.number /section]Ausgabe:
[a; b (after a); c (after b); ]
[a/0/0/1 b/1/1/2 ]delimiter und modulo
Wie bei den neueren Schleifen wird delimiter zwischen verarbeiteten Elementen ausgegeben, und modulo=n beschränkt ihn auf jedes n-te. Ein
Delimiter von section akzeptiert außerdem match=<condition>:
[section name=D loop=array( 1, 2, 3, 4 )delimiter modulo=2|/delimiter$D:item/section]
[foreach array( 1, 2, 3, 4 ) as $v$vdelimiter modulo=2|/delimiter/foreach]Ausgabe:
[12|34]
[12|34]Ein Unterschied in kompilierten Templates
Jedes Beispiel auf dieser Seite wurde auch durch den Template-Compiler gerendert. Eines ergibt ein anderes Ergebnis: eine umgekehrte Schleife
über eine Zeichenkette. Interpretiert gibt {section loop='abc' reverse=true()} den Text cba aus; kompiliert gibt es nur c aus,
während die Form mit foreach auf beide Arten cba ergibt:
[section loop=3$item/section] [section loop=-3$item/section] [section loop='abc' reverse=true()$item/section]
[for 1 to 3 as $i$i/for] [foreach 'abc'|str_split|reverse as $c$c/foreach]Ausgabe:
[123] [-1-2-3] [cba]
[123] [cba]Ausgabe mit dem Template-Compiler (in einen Arbeitsordner kompiliert):
[123] [-1-2-3] [c]
[123] [cba]Live-Websites kompilieren ihre Templates (site.ini [TemplateSettings] standardmäßig TemplateCompile=enabled); stellen Sie eine solche
Schleife also auf foreach mit str_split|reverse um.
Verwandte Seiten
- Zurück: Referenz der Kontrollstrukturen
- Section (veraltet)
- section, aus dem Code erzeugt
- Foreach-Schleifen
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.