Zope页面模板样例

Zope页面模板样例
页面模板是一种web页面生成工具。适用于Zope web 应用程序的动态web页面。
页面模板遵循以下三个原则:
  1. [align=left]可以很好的用编辑工具处理。[/align]
  2. [align=left]所见即所得。[/align]
  3. [align=left]代码和模板分离,除了那些结构逻辑部分。[/align]
[align=left]页面模板如何工作
页面模板使用模板属性语言(Template Attribute Language (TAL))。TAL由一些特殊的标记符组成。例如,一个动态的页面标题可以是这样:
<title tal:content="here/title">;Page Title</title>tal:content属性就是一种TAL语句。由于它有XML名称空间(tal:部分),大多数的编辑工具都可以支持它,而不会把它删去。当WYSIWYG编辑器或web浏览器载入它时,不会更改模板的结构或样子。名称content表示它将设置title标记符内容,值"here/title"是一种表达式,提供了要插入到标记符里的文字。
所有的TAL语句由开头为tal:的标记符属性和与其相关的值组成。一个TAL语句的值显示在引号里边。更多相关信息请参见附录C:”Zope页面模板参考”。
对于使用WYSIWYG工具的HTML设计人员来说,上边的动态标题例子是完全有效的HTML,在编辑器里显示就会像应该显示的那样。换句话说,页面模板能够很好的支持编辑工具。
这个例子还说明了“所见非常相似所得”原则。当你在一个编辑器里观看这个模板,标题文字会充当动态标题文字。模板提供了一个要被生成的文档的例子。
当这个模板在Zope里保存以后,用户观看时,Zope会把模板的内容变为动态的内容,从而用任何"here/title"所代表的内容替换"Page Title"。在这个例子里,"here/title"应为应用这个模板的对象的标题。这个替换在观看模板时是自动完成的。
有的模板语句可以用来替换整个标记符、内容或部分属性。你可以重复标记符多次,或者忽略它。你可以把几个模板的某些部分连接在一起,以及指定简单的错误处理。所有这些功能是用来生成文档结构。除了这些功能,你不能创建继承或类,还不能执行复杂的流程控制,或者轻松的表达复杂的关系。对于这些任务,你应当使用基于Python的脚本或应用程序组件。
页面模板语言不强调它的强大性和通用性。这也就意味着它用在一种框架里边(比如Zope),框架当中的另外一些与页面表现无关的对象处理事务逻辑和任务。
例如,模板语言适合于处理发票单,生成对应的一行,然后在每行里插入描述、数量、价格等等这样的文字。它不适合用来在数据库里创建发票记录,或者和信用卡处理工具交互。
创建一个页面模板
使用你的web浏览器以管理员身份登录进入Zope管理界面ZMI。选择一个工作目录(根目录就可以),然后从下拉添加列表中选择"Page Template"。在添加表单里的Id字段中键入"simple_page",然后按"Add and Edit"按钮。
现在,你应该看到这个页面模板的主编辑页面。标题是空的,内容的类型是text/html,默认的模板文字在编辑区里边。
在让我们创建简单的动态页面。在Title字段里键入单词"a Simple Page"。然后,按照以下内容编辑模板文字:
<html> <body> <p> This is <b tal:replace="template/title">the Title</b>. </p> </body></html>现在,按Save Changes按钮。Zope就会显示一条消息,表示你所做的修改已经生效了。
如果出现了以<– Page Template Diagnostics起始的注释HTML,就请你检查一下,然后再保存一次。这个注释是一条错误消息,告诉你有错误。不需要你去删除它,一旦错误修正了,它自动会消失。点击Test标签,你会看到一个顶部显示"This is a Simple Page."的页面。Content-Type字段允许你指定页面的内容类型。通常,对于HTML,你将使用text/html内容类型,对于XML,使用text/xml内容类型。
简单表达式
在页面模板里边的表达式"template/title"是一种路径表达式。这是一种最普通的表达式类型。TAL表达式语法标准(TAL Expression Syntax (TALES))还定义了其他几种表达式类型。
"template/title"路径表达式提取模板的title 属性。以下是其他一些常用的路径表达式:
[/align]
  • request/URL: 当前web请求的URL。
  • user/getUserName: 已经授权的用户登录名。
  • container/objectIds: 同一文件夹中的其他模板对象列表。
每个路径都以一个变量名开始。如果这个变量包含你所需的值,就会在此停止。否则,你就需要添加一个”/”号,以及下级对象或属性的名称。你可能需要经过多个下级对象来得到要找的值。
Zope定义了一个小型内建变量集,其中比如request和user,这些将在第九章“高级变量”里讲述。在这一章里,你还会学习到如何定义你自己的变量。
插入文字
在上边的例子里,你对一个粗体标记符使用了tal:replace语句。当你测试时,Zope用模板的标题替换整个标记符。当你浏览时,你看到了以粗体显示的模板文字。我们使用一个粗体标记符是为了加亮显示之间的不同。
为了把动态的文字放置到其他文本里,通常应对span标记符而不对bold标记符使用tal:replace。例如,给你的例子添加以下几行:
<br>The URL is <span tal:replace="request/URL">URL</span>.Span标记符是结构的,但不可视,因此当你在编辑器或浏览器里观看源码时,这会显示为"The URL is URL."。当你观看经过执行后的代码时,可能会是:
<br>The URL is http://localhost:8080/simple_page.如果你想把文字插入到一个标记符里,但不影响标记符本身,你应该使用tal:content语句。要把例子页面的标题设置为模板的title属性,可以在html和body标记符之间加入以下几行:
<head> <title tal:content="template/title">The Title</title></head>如果你在一个新浏览器窗口里打开"Test"标签,这个窗口的标题会成为"a Simple Page"。如果你查看页面的源文件,你会看到以下代码:
<html> <head> <title>a Simple Page</title> </head>…Zope把模板的标题插入到了title标记符里边。
重复结构

接下来,让我们给页面添加一些内容,形式是显示与模板同一文件夹里的对象列表。你将做一个表,这个表针对每个对象对应一行,并包含几列,分别对应id,meta-type和title。在例子模板的底部添加以下几行:
<table border="1" width="100%"> <tr> <th>Number</th> <th>Id</th> <th>Meta-Type</th> <th>Title</th> </tr> <tr tal:repeat="item container/objectValues"> <td tal:content="repeat/item/number">#</td> <td tal:content="item/getId">Id</td> <td tal:content="item/meta_type">Meta-Type</td> <td tal:content="item/title">Title</td> </tr></table>表行当中的tal:repeat语句的含义是:针对我的容器对象值列表里的每个条目重复这一行。Repeat语句一次性把对象从列表转换为item 变量(这样就被称为重复变量),并且使用这些变量进行复制。每一行里的"item/getId"变量值是针对那一行的对象的Id,"item/meta_type" 和 "item/title"也是这样。
你还可以使用重复变量来得到当前重复的相关信息。通过把它放置在内建变量repeat路径后边,你就可以访问重复的次序,方式可以从0 ('index')开始,从1('number')开始,从A('Letter')开始,或者以其他一些方式。因此表达式repeat/item/number在第一行里为1,在第二行里为2,以此类似。
因为一个tal:repeat循环可以放置在另外一个循环里,同一时间里可以有多个循环起作用。这就是为什么必须写repeat/item/number,而不是仅仅写repeat/number。你必须通过包含循环的名称来指定你所感兴趣的循环。
现在,观看页面,注意它是如何列出同一文件夹里的所有对象的。
condition元素
使用页面模板,你可以动态查询环境变量,并且选择性的根据条件插入文本。例如,针对一个cookie你可以指定特殊的信息:
<p tal:condition="request/cookies/verbose | nothing"> Here's the extra information you requested.</p>只有设置了名为verbose的cookie时,表达式'request/cookies/verbose | nothing'才为真,这一段才会包含在输出里边。在第九章“高级页面模板”,你将学习更多的内容。
使用tal:condition语句,你可以检查所有类型的条件。如果表达式有一个真值,tal:condition语句不做什么,如果值为假,则是删去整个语句标记符,包括它的内容。Zope认为数字0、空字符串、空列表和内建变量nothing为假值。几乎其他任何值都为真,包括非零数字,以及包含任何内容的字符串(即使是空格)。
更改属性
大多数情况下,模板要列出的对象有一个icon属性,这个属性包含了指向表示这种对象的标识的路径。为了在meta-type列里显示这个标识,需要把这个路径插入到img标记符的src属性里边。按照以下编辑meta-type:
<td><img src="/misc_/OFSP/Folder_icon.gif" tal:attributes="src item/icon"> <span tal:replace="item/meta_type">Meta-Type</span></td>tal:attributes语句用item/icon的值替换img标记符的src属性。模板里边的 src="/misc_/OFSP/Folder_icon.gif" 属性充当一个替代物
注意,我们已经对span标记符用tal:replace语句替换表格单元的tal:content属性。这些更改允许你在表格单元里放入图象和文本。
设置