Plone技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4251|回复: 0

ZOPE PLONE页面模板教程

[复制链接]
发表于 2012-12-11 17:45:36 | 显示全部楼层 |阅读模式
                                 页面模板教程                                   
                                                   
                                            页面模板是一种web页面生成工具。它们帮助编程人员和设计人员协作生成适用于Zope web 应用程序的动态web页面。设计人员可以利用它们来维护页面,而不用放弃他们的工具,同时保留了把这些页面嵌入到一个应用程序里所必需的工作。在本章,你将学习有关页面模板的基础,包括如何在你的web站点里使用它们来轻松的创建动态web页面。在第九章“高级页面模板”里,你将学习相关的高级特性。
页面模板的目标是要让设计人员和编程人员轻松的一起工作。设计人员可以使用所见即所得(WYSIWYG)的HTML编辑器来创建一个模板,然后编程人员就可以编辑处理后融入到应用程序里。如果要求的话,设计人员还可以重新把模板调入编辑器,进一步修改它的结构和样子。仅需一些必要的步骤就可以保留编程人员所做的修改,而设计人员不会影响应用程序。
页面模板通过采用以下三个原则来实现这些目标:
  • 可以很好的用编辑工具处理。
  • 所见非常相似所得。
  • 代码和模板分离,除了那些结构逻辑部分。
    页面模板就像生成页面的模型,而从某方面来讲,它又是一个有效的HTML页面。

[url=]Zope页面模板和DTML的对比[/url]Zope已经有了DTML,为什么还要另外一种模板语言?首先,DTML不是针对HTML设计人员的。页面一旦被转化为模板,它就不是有效的HTML,这样就使得难以脱离应用程序来修改。其次,困扰DTML的是难以分离表现、逻辑和内容(数据)。这样就降低了内容管理和web站点开发的可扩展性
DTML可以完成页面模板不能完成的工作,比如动态生成电子邮件信息(页面模板只能生成HTML和XML)。因此,DTML不会失去作用。但我们确实会看到页面模板几乎可以完成Zope里所有的HTML/XML表现工作。

[url=]页面模板如何工作[/url]页面模板使用模板属性语言(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),框架当中的另外一些与页面表现无关的对象处理事务逻辑和任务。
例如,模板语言适合于处理发票单,生成对应的一行,然后在每行里插入描述、数量、价格等等这样的文字。它不适合用来在数据库里创建发票记录,或者和信用卡处理工具交互。

[url=]创建一个页面模板[/url]如果你设计页面,你可能会使用FTP或WebDAV,而不会用Zope管理界面(ZMI)来创建和编辑页面模板。有关远程编辑页面模板方面的信息请参见本章后面的“使用FTP和WebDAV”部分。对于本章里的小例子,使用ZMI就够了。
使用你的web浏览器以管理员身份登录进入Zope管理界面。选择一个工作目录(根目录就可以),然后从下拉添加列表中选择"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字段下边的 Browse HTML source链接。这样就会给你显示未处理的模板源码。你会看到"This is the Title."。为了进一步编辑例子,再一次返回上一步。
Content-Type字段允许你指定页面的内容类型。通常,对于HTML,你将使用text/html内容类型,对于XML,使用text/xml内容类型。
如果你把内容类型设定为text/html,那么Zope使用兼容HTML模式解析你的模板,这种模式允许使用HTML的松散标记。如果你把内容类型设定为其他的类型,那么Zope假定你的模板是组织良好的XML。Zope另外还要求组织良好的XML必须显式声名TAL和METALXML名称空间。
"Expand macros with editing" 选项将在第九章“高级页面模板”中阐述。

[url=]简单表达式[/url]在页面模板里边的表达式"template/title"是一种路径表达式。这是一种最普通的表达式类型。TAL表达式语法标准(TAL Expression Syntax (TALES))还定义了其他几种表达式类型。有关TALES方面的更多信息,请见附录C,“Zope 页面模板参考”。
"template/title"路径表达式提取模板的title 属性。以下是其他一些常用的路径表达式:
  • request/URL: 当前web请求的URL。
  • user/getUserName: 已经授权的用户登录名。
  • container/objectIds: 同一文件夹中的其他模板对象列表。
每个路径都以一个变量名开始。如果这个变量包含你所需的值,就会在此停止。否则,你就需要添加一个”/”号,以及下级对象或属性的名称。你可能需要经过多个下级对象来得到要找的值。
Zope定义了一个小型内建变量集,其中比如request和user,这些将在第九章“高级变量”里讲述。在这一章里,你还会学习到如何定义你自己的变量。

[url=]插入文字[/url]在上边的例子里,你对一个粗体标记符使用了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标记符里边。

[url=]重复结构[/url]接下来,让我们给页面添加一些内容,形式是显示与模板同一文件夹里的对象列表。你将做一个表,这个表针对每个对象对应一行,并包含几列,分别对应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"也是这样。
你可以使用任何你喜欢的名称命名重复变量("item"只是一个例子),只要它以字母开头,并且只包含字母、数字和下划线('_')。重复变量只在repeat标记符里定义。如果你试图在tr标记符上边或下边使用它,你会得到错误提示。
你还可以使用重复变量来得到当前重复的相关信息。通过把它放置在内建变量repeat路径后边,你就可以访问重复的次序,方式可以从0 ('index')开始,从1('number')开始,从A('Letter')开始,或者以其他一些方式。因此表达式repeat/item/number在第一行里为1,在第二行里为2,以此类似。
因为一个tal:repeat循环可以放置在另外一个循环里,同一时间里可以有多个循环起作用。这就是为什么必须写repeat/item/number,而不是仅仅写repeat/number。你必须通过包含循环的名称来指定你所感兴趣的循环。
现在,观看页面,注意它是如何列出同一文件夹里的所有对象的。试试添加或删除文件夹里的对象,注意页面是如何反映这些变化的。

[url=]condition元素[/url]使用页面模板,你可以动态查询环境变量,并且选择性的根据条件插入文本。例如,针对一个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为假值。几乎其他任何值都为真,包括非零数字,以及包含任何内容的字符串(即使是空格)。
condition语句的另外一种常见用途是在循环以前检测序列是否为空。例如,刚才的例子中如何根据对象集合绘制表格。以下是一个检测页面的例子,如果对象列表为空就不绘制表格:
<table tal:condition="container/objectValues"        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>如果表达式container/objectValues值为假,那么整个表格就被忽略掉。

[url=]更改属性[/url]大多数情况下,模板要列出的对象有一个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属性。这些更改允许你在表格单元里放入图象和文本。

[url=]用页面模板创建一个文件库[/url]这里是一个在Zope里边使用页面模板来创建一个简单文件库的例子,它采用一个模板,一些Python 代码,以及一些文件。
首先,使用HTML编辑器创建一个模拟的文件库页面。本章的例子采用Amaya(译者注:amaya 是一种同时具有浏览和编辑功能的浏览器软件,可以到http://www.w3.org下载)制作。这个页面不需要精心制作,它仅显示一些粗略的信息。下边是仅包含一个文件的文件库页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"                      "http://www.w3.org/TR/html4/loose.dtd"><html><head>  <title>File Library</title>  <style type="text/css">  .header {    font-weight: bold;    font-family: helvetica;    background: #DDDDDD;  }  h1 {    font-family: helvetica;  }  .filename {    font-family: courier  }  </style>  <meta name="GENERATOR" content="amaya 5-1"></head><body><h1>File Library</h1><p>Click on a file below to download it.</p><table border="1" cellpadding="5" cellspacing="0">  <tbody>    <tr>      <td class="header">Name</td>      <td class="header">Type</td>      <td class="header">Size</td>      <td class="header">Last Modified</td>    </tr>    <tr>      <td><a href="Sample.tgz" class="filename">Sample.tgz</a></td>      <td>application/x-gzip-compressed</td>      <td>22 K</td>      <td>2001/09/17</td>    </tr>  </tbody></table></body></html>现在,登录进入你的Zope,创建一个名为FileLib的文件夹。在这个文件夹里,通过从添加菜单里选择Page Template创建一个名为页面模板index_html,指定Id 为index_html,然后点击Add。
现在,用你的HTML编辑器,按照在index_html模板的URL后边添加/source.html的方式保存上边的HTML,例如:http://localhost:8080/FileLib/index_html/source.html。注意,结尾是source.html。因为页面模板是动态的,你需要一种编辑模板原始的未经处理的代码的方式。给页面模板附加source.html就会给你提供原始代码。注意,如果页面的内容类型为text/xml,那么你将使用source.xml,而不是source.html。
现在,你已经保存了模板,你已经保存了模板,你就可以返回Zope,点击index_html,然后点击Test标签来观看这个模板。它看起来就像模拟页面一样,一切正常。
现在,让我们给上边的HTML添加一些动态特性。首先,我们想让模板的标题是动态的。在Zope里,你会注意到页面模板有一个可填写的title表单字段。我们想让Zope动态的把模板标题插入到处理后的模板内容里。见下:
<head>  ...  <title tal:content="template/title">File Library</title>  ...<body><h1 tal:content="template/title">File Library</h1>...现在,更改index_html页面模板的标题。保存以后,点击Test标签,你就会看到页面模板在输出里动态的插入了模板对象的标题。
注意'tal' xml名称空间里的新的content标记符属性。这个属性的含义是:用'template/title'变量替换这个标记符的内容。在这个例子里,template/title是index_html页面模板的标题。
下一步是要创建一个动态的文件列表,给你显示FileLib文件夹里的所有文件对象列表。
开始前,你需要写一行Python代码。进入FileLib文件夹,创建一个Script (Python)。让id为files,然后点击Add and Edit,按照以下内容编辑代码:
## Script (Python) "files"## return container.objectValues('File')这样就会返回FileLib文件夹里的全部文件对象列表。现在,编辑你的index_html页面模板,添加一些新的tal属性:
...<tr tal:repeat="item container/files">  <td><a href="Sample.tgz" class="filename"         tal:attributes="href item/getId"         tal:content="item/getId">Sample.tgz</a></td>  <td tal:content="item/content_type">application/x-gzip-compressed</td>  <td tal:content="item/getSize">22 K</td>  <td tal:content="item/bobobase_modification_time">2001/09/17</td></tr>...值得注意的是HTML标记符tr里边的tal:repeat属性。这个属性告诉模板根据"container/files"(刚才创建的Python)返回的值进行循环,并针对每一个文件创建新的表行。每一次循环,当前文件对象被分配给名称item.
每一行里的单元格都有tal:content属性,它描述了应该插入到单元格里的数据。每次循环,用文件的id, content type,size, modification times替换相应的内容。另外,还要注意链接是如何使用tal:attributes来动态指向当前文件并覆盖href属性。
数据来自于item对象,方式是通过对文件对象调用Zope API方法。方法item/getId, item/content_type, item/getSize, item/bobobase_modification_time都是标准的API函数,这些函数在Zope的在线帮助系统里都有文档。
进入Zope,先把一些文件上载到FileLib文件夹里,测试这个脚本。方法是通过从添加菜单里选择File,点击下一屏里边的upload 按钮。上载完毕后,你只需要点击Add就可以了。如果你不指定id,那么就会使用你上载的文件名。
当上载一些文件后,进入index_html页面模板,然后点击Test标签。现在,你会看到这个页面模板已经显示为一个非常简单的文件库,其中的一些HTML标记符属性已经更改了。
但是目前还存在一些小的问题,文件大小和日期显示不是非常好,并且不匹配。你可能喜欢以K或MB方式而不是bytes方式显示文件大小,下面是Python的脚本:
## Script (Python) "file_size"##"""Return a string describing the size of a file."""bytes=context.getSize()k=bytes/1024.0mb=bytes/1048576.0if mb > 1:    return "%.2f MB" % mbif k > 1:    return "%d K" % kreturn "%d bytes" % bytes用file_size 作为id,在FileLib文件夹里创建这个脚本。它以kilobytes 和 megabytes方式计算文件大小,并返回一个适当的描述文件大小的字符串。现在,你就可以在item/getSize表达式里使用这个脚本了:
...<td tal:content="item/file_size">22 K</td>...你还可以使用Python修正日期格式问题。在FileLib文件夹里创建一个名为file_date的脚本:
## Script (Python) "file_date"##"""Return modification date as string YYYY/MM/DD"""date=context.bobobase_modification_time()return "%s/%s/%s" % (date.year(), date.mm(), date.day())现在,在item/bobobase_modification_time表达式里引用这个脚本:
...<td tal:content="item/file_date">2001/09/17</td>...祝贺你,你已经成功创建了动态页面脚本。这个例子说明了页面模板如何在应用程序里边起到良好的表现层作用。页面模板表现应用程序的逻辑(即基于Python的脚本),并且应用程序逻辑处理站点里的数据(即那些文件)。

[url=]使用FTP和WebDAV进行远程编辑[/url]你可以使用FTP和WebDAV远程编辑页面模板,就像HTTP PUT方式发布一样。使用这些方法,你就可以使用页面模板,而不用离开像DreamWeaver这样的WYSIWYG编辑器。
上边的部分给你显示了如何远程使用Amaya编辑页面,它使用了HTTP PUT方式上载页面。你可以使用FTP和WebDAV经过相同的步骤完成同样的任务。
  • 在Zope管理界面里创建一个页面模板。你可以用任何文件扩展名命名文件。有些人,倾向于.html,有些人倾向于.zpt。注意,在Zope里边,一些像index_html这样的名称具有特殊的含义。
  • 在页面模板的URL后边加上/source.html 或者 /source.xml。这样就可以处理页面模板的源代码。
  • 用你的编辑器编辑文件并保存它。当你保存时,应该使用与上一步相同的源码URL。
  • 当你编辑完后,可以重新载入你的页面,检查错误注释。关于调试,请参见下一节。
    在Zope后边的版本里,你可能不使用Zope 管理界面来创建页面模板。


[url=]调试和测试[/url]Zope能够帮助你查找和修改页面模板里的错误。Zope在两次不同的时候进行错误检查:一次是在编辑页面模板时,一次是在观看页面模板时。在编辑状态时,Zope捕捉相对更多类型的错误。
你可能已经熟悉了Zope插入错误注释的捕捉错误的方式。这些注释给你提示出Zope在你所编辑的模板里发现的问题。这些问题大多数在tal 语句里。例如:
<!-- Page Template Diagnostics Compilation failed TAL.TALDefs.TALError: bad TAL attribute: 'contents', at line 10, column 1-->这条消息显示,你在模板的第10行错误的使用了tal:contents,而不是tal:content。其他的消息告诉你有关模板表达式和宏方面的问题。
当你使用Zope管理界面来编辑页面模板时,可以轻松显示这些消息。可是,如果你使用WebDAV或FTP,这些消息很容易被忽略掉。例如,如果你通过FTP保存了一个模板,你不会得到一个揭示问题的FTP错误,你不得不从Zope重新载入这个模板来查看错误消息。在使用FTP和WebDAV时,编辑完成后,在Zope里重新载入一次是一种好方法,这样就可以确信是否包含错误消息。
如果你没有注意到错误消息,试图执行带有问题的模板,你会看到类似于这样的错误消息:
Error Type: RuntimeErrorError Value: Page Template hello.html has errors.这就告诉你有错误,应该重新载入模板,检查错误消息。
除了当编辑时会遇到这种错误消息外,当你观看页面模板时偶尔还会遇到通常的Zope错误。这些问题往往是由于模板表达式不正确造成的。例如,如果表达式不能定位变量,你就会遇到下边的错误:
Error Type: UndefinedError Value: "unicorn" not found in "here/unicorn"这条错误消息告诉你,它不能找到表达式here/unicorn里引用的变量unicorn。为了帮助你指出出现了什么错误,Zope在回溯里包含了环境信息。如果你处于调试模式里边,这条信息将显示在错误页面的底部。另外,观看错误页面的源文件来查看回溯。回溯将包含环境方面的信息:
...'here': <Application instance at 01736F78>,'modules': <Products.PageTemplates.ZRPythonExpr._SecureModuleImporter instance at 016E77FC>,'nothing': None,'options': {'args': ()},'request': ...'root': <Application instance at 01736F78>,'template': <ZopePageTemplate instance at 01732978>,'traverse_subpath': [],'user': amos})...这些信息有些复杂,解释一下。在这个例子里,它告诉我们,here变量为一个应用程序实例。这也就意味着它是顶级Zope文件夹(注意,根变量和"Application instance"相同)。问题可能是你想对一个有unicorn属性的文件夹应用模板。这个回溯没有提供很多的帮助,但是确实可以帮助你。

[url=]XML模板[/url]页面模板的灵活性还表现在另外一方便,那就是他们能够象HTML那样动态处理XML。例如,在第5章里,“创建基本Zope应用程序”里边,你创建了以下XML:
<guestbook>  <entry>    <comments>My comments</comments>  </entry>  <entry>    <comments>I like your web page</comments>  </entry>  <entry>    <comments>Please no blink tags</comments>  </entry></guestbook>这段XML的创建方式是对某个文件夹里的所有DTML文档进行循环,然后把它们的源码插入到comment元素里边。在这一节,我们将给你显示如何使用页面模板来生成相同的XML。
在你的访客簿文件夹里创建一个名为"entries.xml"的页面模板,其内容如下:
<guestbook xmlns:tal="http://xml.zope.org/namespaces/tal">  <entry tal:repeat="entry python:here.objectValues('DTML Document')">    <comments tal:content="entry/document_src">Comment goes here...</comments>  </entry></guestbook>确认你把内容类型设置成text/xml,点击Save Changes,然后点击Test标签。如果你正在使用Netscape,它将提示你下载一个XML文档,如果你正在使用MSIE 5或更高版本,你可以在浏览器里查看XML文档。
注意tal:repeat是如何对所有的DTML文档进行循环的。tal:content语句把每个文档的源码插入到comments元素里边。xmlns:tal属性是一个XML名称空间声明。它告诉Zope,以tal开头的名称是页面模板命令。有关TAL和TALES XML名称空间方面的更多信息,请参见附录C,“Zope 页面模板参考”
使用页面模板创建XML几乎完全类似于创建HTML。最大的不同在于你必须使用显式XML名称空间声明。另外一个不同是你应该把内容类型设置为text/xml或者任何你的XML应该设置的类型。最后一个不同是你通过source.xml而不是source.html来浏览XML模板。

[url=]使用带有内容的模板[/url]通常,Zope支持内容,表现和逻辑组件。页面模板是一种表现组件,因而可以用来显示内容组件。
Zope2.5带有集中内容组件:ZSQL Methods, Files, 和 Images。DTML文档和方法不是纯内容组件,这是因为他们可以容纳内容并且执行DTML代码。目前为止,Zope没有一种通用的内容对象。你可以使用Files来处理文本内容,如果小于64K并包含文本,你就可以编辑文件内容。File对象是相当基本的。
Zope的内容管理框架(CMF)通过提供一套丰富的内容组件集来解决这个问题。CMF是一种内容管理扩展件。它包括各种加强功能,包括工作流,界面和内容对象等。CMF利用了很多页面模板。在以后的版本里,Zope可能会包含CMF。

[url=]结论[/url]Zope页面模板帮助你为web应用程序构建web页面。模板使你轻松使用普通的HTML工具和技术来构建web页面。它们还提供了融进现有应用程序的便利性。页面模板帮助设计人员和编程人员一起工作来生成web应用程序。在第九章“高级页面模板”里,你将学习更强大的模板技术,比如Python表达式和宏。

                    

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|Plone技术论坛 ( 湘ICP备07003419

GMT+8, 2017-9-20 06:47 , Processed in 0.140197 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表