Lexikalische Struktur
Bevor irgendetwas ausgewertet wird, zerlegt der Parser in lib/eztemplate/classes/eztemplatemultipassparser.php das Template in drei Durchgängen:
Textelemente und Tags (parseIntoTextElements()), Entfernen von Leerraum um Tags (parseWhitespaceRemoval()) und der Knotenbaum
(parseIntoTree()). Diese Seite beschreibt die ersten beiden, die entscheiden, was Text ist, was ein Tag ist und welche Zeilenumbrüche die
Ausgabe erreichen.
Inhalt
- Begrenzer
- Arten von Tags
- Kommentare
- Wörtlicher Text, ldelim und rdelim
- Eine Klammer in einem Tag
- Leerraum um Tags
- Einzel-Tags mit Schrägstrich
- Parserfehler: Zeile und Spalte
- Unbekannte Funktions-Tags
- Verwandte Seiten
Begrenzer
Ein Tag beginnt bei { und endet bei der nächsten }. Die Begrenzer werden im Konstruktor von eZTemplate gesetzt ($this->LDelim = "{",
$this->RDelim = "}"); es gibt keine Einstellung, um sie zu ändern.
Arten von Tags
Der Parser sieht sich die ersten Zeichen innerhalb der Klammern an:
| Das Tag beginnt mit | Es ist | Beispiel |
|---|---|---|
$ | ein Ausgabe-Tag: eine Variable, wahlweise mit Attributen und Operatoren | {$node.name|wash} |
' oder " | ein Ausgabe-Tag mit einer Zeichenkette | {'text'|upcase} |
einer Ziffer, oder - und einer Ziffer | ein Ausgabe-Tag mit einer Zahl | {42}, {-7} |
Kleinbuchstaben, Ziffern, _ oder -, gefolgt von ( | ein Ausgabe-Tag mit einem Operatoraufruf | {concat( 'a', 'b' )} |
* | ein Kommentar, bis *} | {* note *} |
/ | ein End-Tag | {/if} |
| allem anderen | ein Funktions-Tag; es ist ein Einzel-Tag, wenn es mit / endet | {if ...}, {include ... /} |
Jede Art in einem Template:
def $who = 'world'
text | $who | 'literal string' | {42} | $who|upcase | concat( 'a', 'b' ) | if true()block/ifAusgabe:
text | world | literal string | 42 | WORLD | ab | blockKommentare
{* ... *} darf über mehrere Zeilen gehen. Der Kommentar selbst wird verworfen, der Text um ihn herum bleibt aber unberührt: Die
Zeilenumbrüche vor und nach einem Kommentar bleiben, anders als die um Funktions-Tags.
line 1
{* a comment
over two lines *}
line 3 {* inline *} still line 3Ausgabe:
line 1
line 3 still line 3Wörtlicher Text, ldelim und rdelim
{literal} ist als literal-Tag registriert (registerLiteral( 'literal' ) im Konstruktor). Alles bis {/literal} ist reiner Text,
Klammern eingeschlossen. {ldelim} und {rdelim} (eZTemplateDelimitFunction) geben eine einzelne Klammer aus. Beides wird auf
der Seite zu den Unterschieden gezeigt, die auch zeigt, was eine ungeschützte
CSS-Regel mit einem Template macht.
Eine Klammer in einem Tag
Das Tag endet bei der ersten }, vor der kein Backslash steht. Innerhalb eines Tags ist \} eine wörtliche Klammer. Ohne den Backslash wird
die Zeichenkette abgeschnitten, das Tag endet zu früh und der Rest wird als Text ausgegeben:
['a\}b']
['a}b']Ausgabe:
[a}b]
[ab'}]Leerraum um Tags
Der zweite Durchgang entfernt einen Zeilenumbruch direkt vor einem Funktions-Tag (normales Tag, Einzel-Tag oder End-Tag) und einen
Zeilenumbruch direkt danach. Text und Ausgabe-Tags ({$x}, {'...'}) bleiben unberührt. In diesem Template steht jedes Funktions-Tag in
einer eigenen Zeile, also verschwinden die Zeilenumbrüche um {def}, {if} und {/if}, während die um {$x} bleiben:
def $x = 'X'
A
if true()
B
/if
C
$x
DAusgabe:
ABC
X
DAuf jeder Seite wird nur ein Zeilenumbruch entfernt. Eine Leerzeile vor oder nach einem Funktions-Tag hinterlässt daher noch einen Zeilenumbruch:
A
if true()
B
/if
CAusgabe:
A
B
CLeerzeichen und Tabulatoren werden nie entfernt. Eine Einrückung vor einem Funktions-Tag bleibt in der Ausgabe.
Einzel-Tags mit Schrägstrich
Ein Tag, das mit / endet, ist ein Einzel-Tag: Es hat kein End-Tag. Funktionen mit einer besonderen Syntax (if, elseif, foreach,
def, undef, set, let, default, set-block, append-block, section, while, for) werden nur in der normalen Form mit ihrer
eigenen Grammatik gelesen. Mit Schrägstrich geschrieben, geht {set $n = 2 /} an den allgemeinen Parameterparser, der es nicht annimmt, und
die Variable behält ihren Wert:
def $n = 1[set $n = 2 /$n]Ausgabe:
[1]Von der Template-Engine protokolliert:
ERROR : parser error @ tl-lex/08-single-tag-slash.tpl:1[15]
Invalid parameter characters in function 'set': '$n = 2'Schreiben Sie diese Funktionen ohne Schrägstrich. Der Schrägstrich funktioniert bei Funktionen, die einfache Parameter name=value nehmen,
etwa include:
[include uri='file:var/tmp/examples/tl-smarty/parts/greeting.tpl' who='single tag' /]Ausgabe:
[<p>Hello, single tag!</p>
]Parserfehler: Zeile und Spalte
Parserfehler nennen das Template, die Zeile und in eckigen Klammern die Spalte, dann das Problem. Ein nicht abgeschlossenes Tag:
first line
second {$brokenAusgabe:
first line
second {$brokenVon der Template-Engine protokolliert:
ERROR : parser error @ tl-lex/06-unterminated-tag.tpl:1[0]
Unterminated tag, needs a } to end the tag.
{$brokenDer Text vom kaputten Tag bis zum Ende der Datei wird so ausgegeben, wie er ist. Die Position ist die, an der der Parser aufgegeben hat, was bei einem nicht abgeschlossenen Tag der Anfang des Texts davor ist; sehen Sie sich das zitierte Tag nach der Meldung an.
Unbekannte Funktions-Tags
Ein Funktions-Tag mit einem Namen, den die Engine nicht kennt, erzeugt eine Warnung (Function ... is not registered) und keine Ausgabe. Weil
ein normales Tag einen Block öffnet, gehört alles bis zu seinem End-Tag, oder bis zum Ende der Datei, wenn es keines gibt, zu diesem Block und
geht mit ihm verloren:
[before nosuchfunction param=1 after]Ausgabe:
[beforeVon der Template-Engine protokolliert:
WARNING : Function "nosuchfunction" is not registeredEin falsch geschriebenes {fi} oder {foreahc ...} verschluckt daher den Rest des Templates. Wenn eine Seite zu früh endet, suchen Sie in
der Debug-Ausgabe nach einer solchen Warnung.
Verwandte Seiten
- Zurück: Von .tpl zu .stpl umziehen
- Weiter: Werte und Literale
- Grundlagen der TPL-Syntax
- Kommentare
- Literal und Begrenzer
- Fehlersuche in Templates
- 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.