TALES - Ausdrücke in TaL
Summary: Die Sprache/Syntax, die in
TaL-Attributen in
PageTemplates zum Einsatz kommt
Einführung
TaLes ist die Syntax, der die Werte der TAL-Attribute in den Tags eines
PageTemplates genügen müssen. Sie wird benutzt, um die in einem
PageTemplate auf Methoden und Daten von Python-Objekten zuzugreifen und verbindet damit das Markup des
PageTemplate mit Daten (meist, jedoch nicht ausschliesslich aus der
ZodB).
Ausdruckstypen
TaLes kennt verschiedene Ausdruckstypen, die hier näher erläutert werden sollen.
Per default wird text, der von einem
TaLes -Ausdruck zurückgeliefert wird immer HTML-gequotet. Will man das nicht, muß es explizit mit dem
TaL-Modifier structure unterbunden werden.
Path-Ausdrücke
Solche Ausdrücke referenzieren Objekte um mit diesen verbundene Methoden aufzurufen oder Attribute der Objekte auszulesen. Ein solcher Pfad kann sich z.B. an vielen ineinandergehängten Dictionaries entlanghangeln:
<span tal:define="dict context/get_dictionary_tree"
tal:content="dict/first_level/second_level/even_more/value_i_want"
/>
Diese Ausdrücke greifen dabei immer auf Unterobjekte der
TaLes benutzbaren Standard-Variablen (siehe weiter unten im Text) oder auf selbstdefiniert Variablen zurück .
Path-Ausdrücke
traversieren durch Bäume von Objekten. Dieser Prozess läßt sich auf verschiedene Weisen beeinflussen:
- durch die ++ -Notation (z.B.
++resource++ )
- durch andere Namensräume (siehe weiter unten, z.B.
zope:title )
- durch die @@ -Notation - on-the-fly gebildete VieWs (z.B.
@@absolute_url )
String-Ausdrücke
String Expressions (
string: ): Diese Ausdrücke sind wie Makros, die sich hauptsächlich aus Text zusammensetzen, in die man jedoch mit
${} auch Path-Expressions beliebiger Komplexität einbetten kann.
Beispiel:
<h1 tal:content="string: ${context/lastname}, ${context/firstname}"></h1>
Python-Kommandos
Python-Expressions (
python: ): hier kann man kleine Python-Skripte einbauen, wobei jedoch der Zugriff auf kritische Objekte durch Schutzmechanismen (
Security-Proxies) reglementiert wird.
Beispiel:
<a href="/@@login.html" tal:condition="python: request.pricipal.id = 'zope.anybody'"
In
PageTemplates#PythonModules findet man informationen dazu, wie man Python-Module direkt ansprechen kann - auch wenn das nicht als "schön" gilt.
Modifier
TaLes-Ausdrücke können mit sog.
Modifiern versehen werden, um die Auswertung des Ausdrucks zu beeinflussen. Modifier sind:
-
not: : Negiert den TaLes-Ausdruck dahinter (sinnvoll z.B. beim TaL-Befehl condition )
-
nocall: : verhindert, dass die folgende Path-Expression ausgewertet wird. Das ist z.B. in folgende Fällen sinnvoll:
- beim TaL-Befehl
define , wenn man die Referenz auf ein Objekt haben will, es jedoch erst später aufgerufen/ausgewertet werden soll
- wenn man das Objekt eigentlich gar nicht braucht, sondern nur testen will, ob man Zugriffsrechte hab. Damit spart man gleich noch Rechenleistung auf dem Server.
-
<a href="edit.html" tal:condition="nocall: context/@@edit.html">Edit<a>
-
exists: : Testet lediglich, ob ein angegebenes Objekt existiert oder nicht. Das ist im condition -TaL-Attribut sinnvoll.
Diese Schlüsselwörter können leicht mit den ähnlich zu handhabenden
Modifiern in TaL vewechselt werden.
TaLes -Namensräume
TaLes kann leicht erweitert werden, um abseites des reinen
TraVersing entlang von Objekten um Benutzerspezifische - nennen wir es "Pfadfunktionen" erweitert werden. Dabei kann man in den
TraVersing -Prozess spezielle
AdapTer einklinken.
Beispiel:
MpgSite stellt einen Namensraum
mpg mit einer Methode
root zur Verfügung. Diese Methode liefert den
RootFolder einer Website. Ermitteln der
UrL des
RootFolders (auf saubere Weise):
<div tal:content="context/mpg:root/@@absolute_url" />
Es passiert folgendes:
- TaLes traversiert entlang des Pfades, nimmt die erste Komponente - das ConText -Objekt.
- Die Nächste Komponente enthält einen Doppelpunkt - Zope extrahiert den Namen des Namensraumes (
mpg ) und versucht einen AdapTer zufinden, der für das ConText -Objekt das InterFace zope.app.traversing.interfaces.IPathAdapter zur Verfügung stellt und den Namen mpg trägt.
- Im Paket
mpgsite.tales ist ein solcher Adapter registriert, Zope adaptiert und erhält das entsprechende Objekt zurück.
- Zope liesst das Attribut
root dieses Objektes aus. Das ist gelegentlich etwas hinderlich, da man in einem solchen Namespace-AdapTer meist Methoden unterbringt. Deshalb trifft Zope hier auf ein ProPerty, dass letztendlich auf eine Methode verweist. Zurückgeliefert wird der per ZaPi gefundene RootFolder.
- TaLes nimmt sich die nächste Pfadkomponente vor - in diesem Fall wird aus dem RootFolder die
absolut_url adaptiert.
In TaLes benutzbare Variablen
Es können sämmtliche "root-Ebenen" -Variablen von
PageTemplates benutzt werden (siehe
PageTemplate#NameSpace ). Zusätzlich stehen noch einige andere
TaL-spezifische Variablen zur Verfügung:
-
default : Wenn dieser Ausdruck ausgewertet wird, wird der Standard-Wert zurückgeliefert - also der Wert, der innerhalb der HTML/TaL-Tags steht, die den TaL-Befehl enthalten.
-
modules : Diese Variable erlaubt die Einbindung von Python-Modulen.
-
repeat : Mit dieser Variable kann man auf Daten zugreifen, die innerhalb einer Schleife (siehe repeat -Befehl in TaL) gebraucht werden, die aber vom aktuellen Schleifendurchlauf abhängig sind.
Beispiel: Die Anzahl der bereits abgearbeiteten Schleifendurchläufe.
-
error : Dieses Objekt steht nur in einem on-error -TaL-Attribut zur Verfügung und enthält im Fehlerfall folgende Daten:
-
type : Die Art des fehlers
-
value : the exception instance ???
-
traceback : Der Python-Traceback
[Zurück zum Start]