Namensräume
Jede Template-Variable lebt in einem Namensraum, einem Namen wie '' (die oberste Ebene der Seite), box oder Outer:Inner. Die Engine
speichert Variablen als $this->Variables[<namespace>][<name>] (lib/eztemplate/classes/eztemplate.php), und jedes Template wird mit zwei
Namensräumen zur Hand verarbeitet: dem Wurzel-Namensraum der Datei und dem aktuellen Namensraum, den ein section oder let mit
einem Namen innerhalb der Datei ändern kann. Namensräume sorgen dafür, dass die Variablen eingebundener Templates und verschachtelter
Schleifen einander nicht überschreiben.
Inhalt
- Vier Arten, eine Variable zu benennen
- include ohne und mit Namen
- Namensräume von section und let
- Eine Variable im falschen Namensraum
- Regeln für die Praxis
- Verwandte Seiten
Vier Arten, eine Variable zu benennen
Der Variablenparser (variableEndPos() in lib/eztemplate/classes/eztemplateelementparser.php) liest ein wahlweise vorhandenes Zeichen für
den Gültigkeitsbereich, beliebig viele Präfixe name: und den Variablennamen. elementValue() in eztemplate.php findet dann den
Namensraum:
| Geschrieben | Gültigkeitsbereich | Durchsuchter Namensraum |
|---|---|---|
$title | lokal | der Wurzel-Namensraum der Datei |
$box:title | lokal | Wurzel-Namensraum + :box (oder box ganz oben) |
$:title | relativ | der aktuelle Namensraum |
$#title | global | genau der geschriebene Namensraum, hier '', die oberste Ebene der Seite |
$#box:title | global | genau box |
Auf der obersten Ebene einer Seite sind all das derselbe Namensraum ''. Sie unterscheiden sich in eingebundenen Templates, Sections und
let-Blöcken.
include ohne und mit Namen
eZTemplateIncludeFunction::process() entscheidet über den Namensraum der eingebundenen Datei:
- Ohne
nameläuft die Datei im aktuellen Namensraum des Aufrufers. Sie sieht jede Variable des Aufrufers, und die Parameter, die sie bekommt, werden für die Dauer des include in diesem Namensraum gesetzt. - Mit
name='box'läuft die Datei im Namensraumbox(oder<current>:box). Ihr$titlebedeutetbox:title, sie sieht also nur ihre Parameter; die Variablen des Aufrufers bleiben mit$#nameerreichbar.
Diese Datei wird unten zweimal eingebunden:
title=[$title] local=[if is_set( $node )$node.nameelseno $node/if] global=[$#node.name] relative=[$:title]Ohne Namen sieht sie $node des Aufrufers:
def $node = fetch( 'content', 'node', hash( 'node_id', 89 ) )
include uri='file:var/tmp/examples/tl-ns/parts/show.tpl' title='A'Ausgabe:
title=[A] local=[Fit & Healthy] global=[Fit & Healthy] relative=[A]Mit name='box' fehlt das lokale $node, das globale $#node.name funktioniert weiterhin, und der Parameter $title wird nach dem include
wieder entfernt:
def $node = fetch( 'content', 'node', hash( 'node_id', 89 ) )
include uri='file:var/tmp/examples/tl-ns/parts/show.tpl' title='B' name='box'
after: [if is_set( $title )title leakedelseno $title here/if]Ausgabe:
title=[B] local=[no $node] global=[Fit & Healthy] relative=[B]
after: [no $title here]Beide Formen kommen in ausgelieferten Designs vor. Ohne Namen ist bequem, bindet den Teil aber an seine Aufrufer; ein Name macht den Teil eigenständig.
Namensräume von section und let
section mit name= verarbeitet seinen Rumpf im Namensraum <current>:<name> und setzt dort item, key, index, number (und
sequence) (eZTemplateSectionFunction::process()). Verschachtelte Sections verschachteln die Namen, und $:item meint immer die innerste:
section name=Outer loop=array( 'x', 'y' )section name=Inner loop=array( 1, 2 )[$Outer:item$Outer:Inner:item|$:item]/section/sectionAusgabe:
[x1|1][x2|2][y1|1][y2|2]let und default mit name= tun dasselbe für ihre Variablen:
let name=Box width=3[$Box:width] [$:width]/letAusgabe:
[3] [3]foreach, for, while und def legen keine Namensräume an; ihre Variablen sind gewöhnliche Variablen der Datei.
Eine Variable im falschen Namensraum
Ein fehlgeschlagener Zugriff nennt den durchsuchten Namensraum; daran sehen Sie, ob die Variable fehlt oder nur außer Reichweite ist:
def $title = 'root'
[$Box:title]Ausgabe:
[]Von der Template-Engine protokolliert:
ERROR : Unknown template variable 'title' in namespace 'Box'Regeln für die Praxis
- Nutzen Sie in neuen Templates
defundforeach; sie brauchen überhaupt keine Namensräume. - Geben Sie einem wiederverwendbaren Teil beim Einbinden einen
name, und übergeben Sie alles, was er braucht, als Parameter. - Greifen Sie zu
$#varnur, um seitenweite Werte aus einem benannten Teil heraus zu lesen; um Werte nach oben zu geben, siehe set mit einem Gültigkeitsbereich. - Beim Lesen alter Templates ist
$Name:itemein Namensraum vonsectionoderlet: siehe Sections und foreach.
Verwandte Seiten
- Zurück: Variablen im Detail
- Weiter: Zugriff auf Attribute
- Include
- Section (veraltet)
- 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.