DTML基础
| 英文原稿: | http://zope.org/Documentation/Books/ZopeBook/2_6Edition/DTML.stx |
|---|---|
| 翻译来源: | http://zope.slat.org/Project/ZopeBook/Dynamic_Content_with_DTML/chap04.txt |
| 翻译作者: | 周易正 |
第四章:用DTML作动态内容
DTML(文件样版标注语言)是Zope以标签为基础的呈现与命令稿语言。DTML 能动态地产生内容 、控制内容并将它格式化。DTML通常用来为你的网页应用 程式建立模组与动态网页界面。
DTML是伺服器端的命令稿语言,就像SSI、PHP、ASP、JSP一样。这意味着 DTML命令是由Zope于伺服端执行,而其执行结果将被送到你的网页浏览器; 相反地,例如Javascript的客户端 命令稿语言就不是由伺服器执行,而是送交给 你的网页浏览器来执行。
你可以用两种模式的Zope物件来使用DTML:DTML Document,与DTML method。
谁适用DTML?
DTML是设计给熟悉HTML及基本网页命令稿的人,而不是给应用程式设计师。 事实上,如果你想以Zope来作写程式,你不应该用DTML。在第九章「进阶Zope 命令稿撰写」,我们将会论及使用 Python与Perl的进阶程式设计。
DTML是用以呈现(内容),所以应该由网页设计者来管理。Zope强烈建议你将呈 现与逻辑分开,因而提供不同的物件:DTML用以呈现,而Python、Perl等等是 用以逻辑。你会在呈现交由DTML负责,而逻辑交给其他Zope物件负责的方式 中发现数不尽的好处。其中包括:
1. 逻辑与呈现分开,将使得改变任一元件(component)都很容易,而且不会破坏 其他东西。
2. 通常会有不同的人来负责维护逻辑与呈现,而经由不同工作使用不同物件,会 让人们合作更为容易,而且不会干扰他人工作。
如果逻辑与呈现没有混在一起,也让既有的呈现与逻辑元件容易重复利用。
DTML有什么好处
DTML有益于制造动态网页界面。它支援内容与版面的重复利用、格式化不同种 类的资料,并将呈现与逻辑、资料区分开来。
例如,你可以利用DMTL来重复利用共享的网页的页面档头与档尾:
<dtml-var standard_html_header> <p>Hello world.</p> <dtml-var standard_html_footer>
这个页面将HTML跟DTML混杂在一起。DTML命令列是写成以dtml-为开头 的标签。此例中,经由将一个标准档头与档尾插进HTML页面中而制造出来。 这使得HTML页面看来像是这样:
<html> <body> <p>Hello world.</p> <hr> <p>Last modified 2000/10/16 by AmosL</p> </body> </html>
如你所见,标准档头将背景定义为白色,而标准档尾则在页面底端加进一个附 注,标出此页面最新修定时间以及由谁所修订。
除了内容的重复利用,DTML让你能轻易而且强大地格式化所有种类的资料。你
可以使用DTML来呼叫methods、查询资料库、 Zope内部物件、处理表单等等。
举例来说,当你使用SQL Method来查询资料库时,它通常会传回一串结果。以 下说明你如何使用DTML来格式化这些来自资料查询的结果:
<ul>
<dtml-in frogQuery>
<li><dtml-var animal_name></li>
</dtml-in>
</ul>
DTML的in标签对资料库查询结果进行迭代并格式化每个资料。伪设frogQuery 传回四个结果,那以下就是产生出HTML的结果:
<ul> <li>Fire-bellied toad</li> <li>African clawed frog</li> <li>Lake Nabu reed frog<-li> <li>Chilean four-eyed frog</li> </ul>
资料库查询的结果已被格式化成HTML的bullet条列。
注意,你不需要告诉DTML你正在查询一个资料库,你也不需要告诉它呼叫资 料查询的参数。你只是告诉它要呼叫什么物件,它就会去弄清楚它应该如何呼叫 这个物件,并传给它适当的参数。如果你将SQL Method换成其他类型的物件, 例如Script、ZCatalog甚至另一个DTML Method,你都不需要改变格式此结果的 方式。
这种格式化各种资料的能力,使得DTML成为一个强大的呈现工具,让你不需 要改变你的呈现,就可以更动你自己的逻辑。
何时不要使用DTML
DTML不是为一般程式写作而生。例如,DTML不能够让你轻易地产生变数。 虽然要使DTML执行复杂的演算也许是可能的,但那相当痛苦而我们也不建议 使用。如果你要执行程式逻辑,请使用Python、Perl(预知详情,请见第九章「进 阶Zope命令稿撰写」)。
举例来说,我们伪设你正为一群数学系学生撰写一个简单的网页,在此页面中, 你要说明一个简单的计算。你就不会想要写出一个程式让这个计算用DTML执 行。DTML也许可以做到,但它将很难理解。DTML在描述此计算插入的网页 相当在行,但用DTML来作这个运算就很可怕,如果是Python或Perl则将轻而 易举。
对字串处理来说,DTML也不是最佳选择。如果你要以复杂方式来处理使用者的 输入,而且是要用函数来作,你最后还是用Python或Perl,二者都比DTML有 着更强大的字串处理能力。
DTML只不过是是Zope上面许多可用的工具之一。如果你发现自己正搔着头, 想理解某个复杂的DTML结构;这时,如果你结束你的DTML命令稿,投向 DTML合集或Python、Perl为基础的命令稿,也许会有机会让你的工作变得更好。
DTML标签语法
DTML的语法与HTML相似。DTML是一个以标签为基础的标记语言。换句话 说,DTML使用标签来完成工作。以下是一个简单的片段:
<dtml-var standard_html_header> <h1>Hello World!</h1> <dtml-var standard_html_footer>
这个DTML码包括了两个DTML的var标签以及一些HTML。h1标签就是HTML 而非DTML。你通常会将DTML与其他例如HTML的标注语言混合使用。DTML 一般是用以产生HTML,当然也可以让你产生其他类型的文本。如你即将所见, 你也可以使用DTML来产生信件讯息与其他文件资讯。
DTML包含两种标签:单一标签与区块标签。单一标签由一个标签及小于(<)、 大于(>)符号组成,例如var标签就是一种单一标签:
<dtml-var parrot>
我们也不需要替var作结束的动作。
区块标签则由两个标签组成,其中一个开启此区块,另一个用以关闭区块,而 内容夹在二者之间:
<dtml-in mySequence> <!-- this is an HTML comment inside the in tag block --> </dtml-in>
「开启标签」启动这个区块,而「结束标签」将之结束。「结束标签」与「开启 标签」的名字相同,但是「结束标签」的前面会加一个斜线(/),这跟HTML、 XML的习惯相同。
使用DTML标签属性
所有的DTML标签都有其属性。属性让我们知道这个标签应当如何工作。 有些属性是选用而非必要。例如:var标签插入一个变数的值。它有一个可选用 的missing (遗失)属性,万一找不到这个变数,就会指定一个预设值:
<dtml-var wingspan missing="unknown wingspan">
如果找不到winspan变数,它就会插入unknown wingspan。
有些属性并没有值。例如,你可以用upper属性来将一个插入值转成大写英文:
<dtml-var exclamation upper>
注意,这个upper属性不像missing属性,它并不需要一个值。
不同的标签有不同的属性。如要知道更多关于不同DTML的文法,请见附录 A,"DTML参考"。
用DTML插入变数
插入变数是你在DTML上可以执行的最基本工作。你已经看到DTML如何用var 标签将档头与档尾插入一个网页页面。许多DTML可以插入变数,而且都是以 类似的方式。让我们弄清楚Zope如何插入变数:
伪设你有一个id为Feedbags,title为Bob's Fancy Feedbags的档案夹。在这个档 案夹里增加一个以pricelist为id的DTML Method,然后将此DTML Method的 内容改成:
<dtml-var standard_html_header> <h1>Price list for <dtml-var title></h1> <p>Hemp Bag $2.50</p> <p>Silk Bag $5.00</p> <dtml-var standard_html_footer>
现在按View键来观看这个DTML Method。你应该可以看到一个HTML页面, 它的原始档应该像是这样:
<html> <body> <h1>Price list for Bob's Fancy Feedbags</h1> <p>Hemp Bag $2.50</p> <p>Silk Bag $5.00</p> </body> </html>
