A DTML Tag-eket három szintaktika szerint írhatjuk le: létezik dokument-template, szerver oldali szintaktika, valamint a Python kiterjesztett
sztring formátuma is.
A három szintaktikát így adjuk meg:
A Tag neve már meghatározza a Tag típusát is. A nevet általában egy vagy több a taghoz tartozó attribútum követi, amely meghatározza, hogy hol találhatóak a tag adatai és hogy kell azokat beilleszteni. Néha az attribútum értékek el is hagyhatóak, illetve az értékeket nem kell idézőjelbe tenni, ha az nem tartalmaz szóközt, tabot, új-sor karaktert, vagy kettős idézőjelet. Például
Az egyik leggyakrabban használt tag, a dtml-var tag. A var tagot változók értékeinek szövegbe való behelyettesítésére használják. Például legyen az a feladat, hogy egy input_name nevű változóban tárolt üdvözlő szöveget akarunk megjeleníteni. Ezt a következőképp tehetjük meg:
A fenti példa két attribútumot használ, ezek a name és a capitalize. A name attribútum egy hivatkozás valamely WWW adatkérésre, vagy változóra vagy Zope objektumok tulajdonságaira. Mivel a name attribútum használata igen gyakori, ezért létezik egy rövidített forma is, ahol a name -et nem kell kiírni:
A rövidített forma használatakor a tag első attribútuma a name értéke is egyben, és ilyenkor nem tesszük ezt idézőjelbe. Hasonló rövidítés létezik az expr attribútumra is. Az expr attribútumot számításokra, kifejezések kiértékelésére használják:
Ez a name attribútumhoz teljesen hasonlóan így rövidíthető:
A capitalize egy jó példa egy érték nélküli attribútumra: hatására a behelyettesítésre kerülő szöveg első betűje nagybetű lesz.
A dtml-var tag egyszerű tag, (singleton), hisz nem tartalmaz más tagot.
Összetett tagokat <dtml-tagnév> <\dtml-tagnév> közé kell írni.
Ilyen például a dtml-if tag:
vagy else ugyanez ággal
Ezt a szintaktikát két Python osztály, a DocumentTemplate.String és a DocumentTemplate.File használja eredetileg. Így lehet a sztringek megjelenését szabályozni formázó karakterekkel a '[' , ']' blokkjelölő karakterek között. A szövegbeillesztést a formázó karakterek mellett még kiegészítő attribútumokkal is szabályozhatjuk, például:
Ennek hatására a date változó egy egyéni, 'DayOfWeek' formátumban fog megjelenni úgy, hogy minden kisbetű átkonvertálódik nagybetűvé A Document Template sztringek formázásra egy kibővített Python szintaktikát használnak. Ennek formája igen egyszerű:
ahol a név a behelyettesítendő érték neve és az 'x' egy formátum specifikáció, mint például a '12.2d'. Olyan blokkok bevezetésére, mint az 'if' vagy az 'in' blokk, vagy egy blokk folytatása, például az 'else' blokk, a '[' szolgál a formátum specifikációban. Lezárni a ']' karakterrel lehet a formázó blokkot. Erre egy példa:
A %(név)x forma tulajdonképpen a %(var név)x rövidített formája. A legtöbb esetben a 'var' elhagyható, azonban ki kell írni, ha
Az előbbiekben két olyan attribútumot láthattunk, amit a legtöbb DTML tag használ: ezek a name és az expr. Mindkettő
olyan adatok azonosítására, illetve kiszámítására szolgál, amiket az adott tag használ.
A name attribútum: adatok név szerinti hivatkozására szolgál. Speciális, hisz létezik az előzőekben már taglalt rövidített formája is. Amikor a name attribútum értékét kikeresi a rendszer, azonnal értelmezi is azt, ha egy mód van rá. Ha ez az érték egy Zope Documentum vagy egy Python dokumentum template, akkor ez előbb behelyettesítésre kerül, és úgy adódik át a name-t használó tagnek. Például a legtöbb Zope dokumentum a következő dtml-var taggel kezdődik:
ahol is a standard_html_header egy olyan Zope dokumentum, ami egy sima HTML-t állít elő, ami aztán majd minden oldal tetejére beillesztődik. Amikor a fentebbi var taget használjuk, a standard_html_header DTML file feldolgozásra kerül, és az eredmény kerül be a szóban forgó dokumentumba. Ha a name értéke egy argumentum nélküli függvény, akkor a függvény eredménye kerül átadásra a tagnek. Ha a name attribútumot a dtml-if, dtml-elif, dtml-unless, dtml-in vagy a dtml-with tag használja, akkor a name-hez tartozó érték szép magyar szóval cache-elődik, ami jelentősen meggyorsítja a hivatkozást. Ez rendkívül hasznos akkor, ha valami nagy számításigényű függvényt használunk, pl:
Itt a dtml-var tag már a reallyExpensiveFunction cache-elt értékét használja. Megjegyzésként meg kell említeni, hogy az olyan tageknél,
ahol lehetőség van új változók bevezetésére, és ha ez megegyezik a cache-elt változó nevével, akkor a cache-ben lévő érték felülíródhat.
A dtml-var tagnak sok egyéb attribútuma van, pl formázáshoz, ezek megtalálhatóak az eredeti
DTML User's Guide -ban.
Az expr attribútum: akár egész bonyolult kifejezések kiértékelésére használatos. Az attribútumhoz tartozó kifejezést idézőjelek ("") közé kell rakni. Épp ezért a kifejezés belsejében idézőjel nem szerepelhet.
A kifejezések szintaktikája megegyezik a Python-ban használatossal, ami meg hasonló az olyan közkedvelt nyelvek szintaktikájához, mint a C vagy
a Java.
Álljon itt néhány példa:
Kifejezés | Magyarázat |
---|---|
x*2*3 | Numerikus kifejezés |
func(a, b) | Függvényhívás |
obj.title | Az obj title nevű argumentumát adja vissza |
obj.meth(a, b) | Meghívja az obj meth nevű metódusát a, b argumentumokkal |
(age < 12 or age > 65) and status == 'student' | Egy logikai (igaz / hamis) teszt |
REQUEST['HTTP_REFER'] | Kikeres egy értéket a REQUEST-ből a 'HTTP_REFER' kulcs alapján |
A kikeresett változók nem "hívódnak meg" azonnal, ahogy a name esetében: Az 1. táblázat kifejezéseiben szereplő nevek közűl az
x, func, a, b, obj, sge és a status változó nevek, míg a meth és a
title nevek objektumok attribútumait jelölik. A változó neveknek betűvel kell kezdődniük, és csak betűket, számokat illetve aláhúzást
tartalmazhatnak.
Az ettől eltérő nevű változókat egy speciális változó, az _ segítségével lehet elérni. A _ speciális változóról a következőkben lesz szó
A Zope lehetővé teszi, hogy szövegeket csak bizonyos adatok függvényében illesszünk be. Erre szolgál az if tag, aminek is az alábbi négy formája létezik:
A dtml-if és a dtml-elif csak a name és az expr attribútumokat támogatják, míg a dtml-else -nek
nincs argumentuma.
A dtml-unless /dtml-unless páros abban tér el a dtml-if -től, hogy a szöveg akkor helyettesítődik be,
ha az expr attribútumhoz tartozó kifejezés értéke hamis.
Sokszor van szükség értéklisták beillesztésére, például egy ZSQL metódus eredményének az iteratív beillesztésére.
A dtml-in tagot használják objektum sorozatok beillesztésére. Például egy munkavállalói könyvtár lista előállítása DTML-el igen egyszerű. Ebben a példában az employees dolgozók egy listáját szolgáltatja, vagy úgy, hogy maga a lista, vagy egy függvény, pl egy Zope SQL method, ami előállítja a listát. Minden dolgozónak van neve és telefonszáma: ezeket az adatokat dtml-var tagokkal érjük el. A dtml-in tag sort attribútuma a dolgozókat névsorba rendezi.
A példában, ha nem lenne egy dolgozó sem, akkor egy üres tábla jelenne meg. Ezt elkerülendő, használhatjuk a dtml-in tagot a dtml-if -fel kombinálva:
De nem muszáj a dtml-if -et használni, hisz a dtml-in taghez is tartozhat dtml-else tag, ami pontosan akkor illesztődik be, ha a feldolgozandó sorozat üres. A következő példa hatása megegyezik az előzőével, a bonyolultságát mégis megnöveli az a tény, hogy a táblázatok fejének és aljának kiíratását be kellett tenni a dtml-in blokkon belülre. Mi több: a fejet és a táblázat alját aszerint kell beilleszteni, hogy az épp aktuális elem az első, az utolsó, vagy egy közbülső elem. Erre két változót használunk, ezek a sequence-start és a sequence-end.
Amikor egy dtml-in name attribútumát egy dtml-if tagen belül használjuk, akkor az csak egyszer számítódik ki, hiszen a dtml-if cache-eli a name-hez tartozó értéket.
A legtöbb esetben célszerű a dtml-in taget a dtml-if -en belül használni. Egy esetben lehet jobb megoldás a dtml-in
-hez tartozó dtml-else -t használni:
Ha a sorozatot az expr attribútummal állítjuk elő, és a számítás nagyon költséges. A dtml-else használata dtml-in
-en belül megakadályozza, hogy egy kifejezést kétszer definiáljunk és számítsunk ki.
Amikor a dtml-in taget használjuk szöveg beillesztésre, akkor tulajdonképp a sorozat minden tagjáról egy másolat készül, és ez kerül
beillesztésre. A dtml-in tag belsejében definiálva van néhány, csak a belső tagek által elérhető változó.
Ezek :
Ezek részletes leírása megtalálható az eredeti DTML User's Guide-ban.
Itt is, hasonlóan a Delphihez, először a title-t mint subfolder. A title-t keresi a rendszer, csak aztán keresi a
többi változó között, ha a subfolder objektumnak nem lenne ilyen nevű változója.
A dtml-with tagnek van egy attribútuma, ez az only. Ez azt írja elő, hogy a blokkban szereplő változókat, metódusokat csak az
adott objektum tulajdonságai között keresse. Ezzel elkerülhetők az öröklésből adódó problémák, például:
Ugyanez az only attribútum nélkül a környezet id-jét adná, ami ebben a példában hibás lenne.
Sokszor szükség van a változók - főleg az input változók - leellenőrzésére, validálására. Ha egy változó értéke hibás, jó lenne hibaüzenet
generálni. A DTML erre lehetőséget ad a dtml-raise tag segítségével, amit dtml-if -el kombinálva használnak.
A dtml-raise attribútuma a hiba típusát írja le. Csak úgy, mint a standard name attribútum esetében, ez is elhagyható.
A hiba típus egy rövid, a hibára utaló név. Van néhány standard hibatípus is, mint pl. az "Unauthorized" vagy a "Redirect", amelyek mindketten
HTTP hibák.
Íme egy példa a dtml-raise használatára:
A dtml-raise tag egy Zope hibát vált ki. Ezeknek a hibáknak van egy nagyon fontos mellékhatása, mégpedig az, hogy sx adott WEB kérés által okozott változásokat törli. Ez azért van így, mert a rendszer mindig egy tranzakciót feltételez a hívás mögött, s ennek korrekt kezelése érdekében szükség van az előbb említett mechanizmusra.
Ha már hibát (illetve kivételt) lehet kiváltani, akkor azt le is kéne kezelni. Erre van a Zope -ban a dtml-try dtml-except dtml-else dtml-finally blokkstruktúra, ami hasonló más nyelvek kivételkezeléséhez. Ennek szintaktikája:
Az első dtml-except blokk az utána megnevezett hibákat kezeli le. Ha a dtml-except után nem írunk nevet, akkor az összes hibát
lekezeli az adott blokkal. A dtml-else ág akkor fut le, ha a dtml-try blokkon belül nem történt kivétel.
A dtml-except blokk a Python osztály alapú kivételeivel dolgozik, tehát ha egy adott nevű kivétel szerepel a dtml-except tag
után, akkor az a kivétel összes alosztályát is lekezeli. Például ha ArithmaticError a tag után írva, akkor az összes ebből származtatott
kivételt, például a ZeroDivisonError -t is le tudja kezelni az adott blokk.
A dtml-else ágban fellépő esetleges kivételeket már nem kezelik le a szóban forgó dtml-except blokkok.
A dtml-try blokkon belül speciális változók is rendelkezésre állnak:
Megjegyzéseket a dtml forrásba a
<dtml-comment>
</dtml-comment>
blokk közé tehetünk. Nem túlságosan meglepő módon, ezen blokkon belül szereplő sorok nem kerülnek beillesztésre, vagy értelmezésre.
A dtml-return tag szolgál egy DTML metódus által kiszámított érték visszaadására. A dtml-return tag attribútumai csak a
standard name és az expr attribútumok lehetnek.
Példa:
Ha az előbbi DTML metódus lefut, akkor az 1 szám kerül visszaadásra, a "blah" szöveg nem. Egy másik példa:
Itt, ha léteznek objektum azonosítók, akkor az első ilyennel tér vissza a metódus, ha nem, akkor pedig a "blah" szöveget adja vissza.
A dtml-sendmail tag segítségével SMTP protokollon keresztül e-mail-t küldhetünk. Ez a tag, a többi taggel ellentétben nem generál outputot.
A dtml-sendmail tagnek jó pár adatra szüksége van, ennek megfelelően sok attribútummal rendelkezik, amik közül én csak a fontosabbakat
említem meg. Minimálisan kell neki, hogy létezzen egy Zope MailHost objektum, vagy egy STMP host címét kell megadni az smtphost attribútummal.
A címzeteket, a feladót, és a tárgyat meg kell adni, de ez történhet a dtml-sendmail attribútumai segítségével is, de lehetnek ezen
információk az üzenet "fejlécében", első soraiban is.
Erre két példa:
A WEB adatlap, ami az észrevételeket összegyűjti a felhasználóktól, és elküldi az ügyfélszolgálatnak:
A dtml-sendmail taget követő szöveg generálására használhatjuk a dtml tageket is, mint ahogy azt az előző példából is láthatttuk.
A dtml-mime tag a dtml-sendmail taggel együtt használható e-mail melléklet küldésére. A dtml-mime tag automatikusan
multipart/mixed -re állítja az üzenet tartalmának típusát. Sok, különféle adat csatolható egy egyszerű üzenethez egy, vagy több
dtml-boundary tag segítségével.
Például:
A dtml-boundary tagnek három attribútuma van (type, disposition, encode), mivel is a melléklet MIME fejlécét adhatjuk meg. Az alapértelmezett kódolási érték 7bit.