TurboCMS内容管理系统(Java版本)模板制作指南北京泰得文通科技有限公司修订时间:2010年7月TurboCMS内容管理系统Java版本模板制作指南第2页共35页TurboCMS2009的模板制作(频道部分)一、概述TurboCMS是一个基于模板的内容管理系统,整个系统的使用流程如下图:表单数据库录入保存生成模板用户通过WEB表单录入信息表单中的信息被保存在数据库中的一条记录中某一个频道的所有信息构成了一张表,有多个频道,则数据库中可能有多个表存在。内容中的数据结合模板生成HTML文件。从上面的过程可以看出,每个频道需要定义一个表单,以及一个模板。模板定义了数据呈现的形式,模板中定义的字段通常同表单中的字段是一一对应的。表单—数据库中的表—模板三者间的关系如下图:表单模板数据库中的表XxXxXxHTML文件xxxxxxxxxxxx………XxXxXxxxxxxxxxxxxx………TurboCMS内容管理系统Java版本模板制作指南第3页共35页频道的表单可以使用系统提供的表单定义工具生成,而模板则必须要手工制作,本文主要介绍模板的制作。1、从什么地方定义模板所谓模板,在TurboCMS中其实是一个普通的HTML文件,它定义了所有用这个模板生成的HTML文件的大致表现形式,包括布局、字体、颜色、风格等信息。以管理员身份登陆TurboCMS,将会看到一个“模板”视图,其中保存的就是网站的模板文件。“模板”视图其实是“文件夹”视图的一个快截方式,专门管理/templates目录。我们建议将所有的模板文件都保存在这里,如果一定要放在其他目录的话,也是允许的。如果要编辑模板文件,请首先选中某个模板文件,然后鼠标右键,选择“Notepad”,以源代码的方式编辑模板文件。TurboCMS内容管理系统Java版本模板制作指南第4页共35页在这个非常类似于Windows的Notepad的环境中,可以以源代码的方式编辑模板文件,并在其中插入定义模板专用的脚本。最后将文件保存下来便成为模板。2、模板和模板脚本模板一方面定义了最终的HTML文件的形式和风格,另一方面还定义了数据如何呈现在最终的HTML文件中。模板中的HTML定义的是形式和风格,而其中的脚本则定义了数据的呈现。当站点中的一个频道的所有信息被发布时,系统构造了一个数据环境,然后将频道中的一条记录取出来,并放到数据环境中去,接下来将模板放到数据环境中去,解释执行其中的脚本,最后将所有的输出写入到HTML文件。系统依次处理所有的记录,每处理一条记录就执行一遍上面的这个过程。我们引入一种新的语言(TDL,TemplateDefineLanguage)来定义模板中的数据输出。它是一种脚本语言,使用Java作为运行脚本,暴露了若干对象供脚本访问,以实现脚本中的灵活控制。模板中的TDL脚本用两个特殊符号分隔:!--%和%--。这两个符号之间的内容被当成TDL脚本处理,其他的内容原样地输出到HTML文件中去。请注意这里的分隔符与Java中的分隔符的区别。一段模板中的TDL脚本例:!--%Response.Output(ThisDocument.Item(“Title”));%--也支持表达式直接输出,等同于!--%=ThisDocument.Item(“Title”)%--。模板中的TDL脚本是Java脚本,任何合法的Java代码都是被允许的。关于Java的语法基础,可以参考Java技术部分。在TDL脚本中,除了可以使用标准的Java代码之外,还可以访问系统提供的几个固有对象,用其同数据环境打交道,取出需要的数据。这几个对象分别是:System,ThisDocument,ThisChannel,ThisSite,ThisPage,ThisPageColumn,ThisColumn,ThisMagazine,ThisIssue,Response。本文中对这几个对象将进行详细的说明。TurboCMS内容管理系统Java版本模板制作指南第5页共35页二、TDL编程1、网站规划在讲解TDL编程前我们先来介绍一下网站规划的步骤,以便理解模板的作用。站点首页inc文件频道一首页频道二首页频道三首页子频道一首页子频道二首页......目录页(可能分页)当前频道top5导航栏hotnewshotnewshotnewshotnews某栏目的最新几条(头条信息)带摘要的top10带摘要的top10带摘要的top10子栏目导航栏文章1文章n带摘要的top10带摘要的top10文章标题列表.........文章1文章2文章3TurboCMS内容管理系统Java版本模板制作指南第6页共35页由上图可以看出,当一篇文章提交到某个频道后,有三种文件需要生成或修改:1、文章本身的HTML页面(文章内容页)2、频道的封面页3、上级频道以及首页中的top列表(通过inc文件体现)因此,有三种模板脚本存在:1、文章内容页模板2、封面页模板3、附带发布的模板也即是说,对每一个频道,需要制作三个模板文件,其中的附带发布模板是可选的。2、文章内容页模板制作前面我们说过,TDL的脚本中可以访问若干个内置对象。所谓内置对象,是指不需要申明就可以直接访问的Class对象。文章内容页的模板制作需要访问的两个主要的内置对象是Response和Document。Response对象的目的在于从TDL中输出,Document对象的主要作用是访问上下文中当前处理的文章的各字段的值。Document对象是最主要的对象,脚本通过它来取得当前数据环境中的数据,它只有三个方法.2.1Document对象的方法Item(fieldName)获取字段fieldName的值,返回字段值,是一个对象例:StringName,Sex,Age;Name=(String)ThisDocument.Item(“Name”);Sex=(String)ThisDocument.Item(“Sex”);Age=(String)ThisDocument.Item(“Age”);如果确信调用会返回的是一个对象,则应该申明相应的对象来进行调用,例:java.util.Vectorpageall=(java.util.Vector)ThisDocument.Item(pages);参数fieldName表示字段名,他们同频道的表单定义中为字段取的名字是一样的。推荐全部使用英文做字段名。在使用Document的Item方法返回字段值时应当确信字段名是在频道的表单定义中确实定义好了的,并且名称拼写没有错误。除了可以访问表单定义时定义的字段以外,有几个字段是始终可以访问的,他们是:Id,当前数据环境中的那条记录在整个系统中的唯一编号Title,内容的标题Author,提交这条内容的用户的用户名SubmitDate,这条内容的提交时间TurboCMS内容管理系统Java版本模板制作指南第7页共35页Url,当前记录在生成HTML文件后,这个文件在系统中的URL,是绝对路径,如/site1/news/news3498.htmContent,当前记录的正文字段。Title标题和Content正文是不论在表单定义中是否定义,在内容提交时系统均会要求输入的两个字段,所以可以放心地访问这两个字段。PageNum,如果一条记录的正文内容有多页,则每一页都将生成一个独立的HTML文件,在模板中不用担心,Content字段始终返回的是当前页的内容,而PageNum则返回当前页的页号,页号是从1开始的。PrevPage,如果正文有多页,则PrevPage返回前一页的那个文件的URL,如果当前页是1,则这个字段返回空串。NextPage,如果正文有多页,则NextPage返回下一页的那个文件的URL,如果当前页是最后一页,则这个字段返回空串。CMSPIC,文章的图片字段CMSWLINK,文章的文件连接字段CMSSUMMARY,文章的摘要字段Pages,如果正文有多页,则Pages字段返回所有页的集合。特别注意的是,集合在Java中是一个对象,因此需要使用定义一个Vector来取得。集合中保存的是每一页的URL。输出所有页的一个目录的代码如下:!--%//内容页分页最新n页第n页StringpPage,nPage;java.util.Vectorpageall=(java.util.Vector)ThisDocument.Item(pages);Response.Output( 最新+pageall.size()+页 );for(inti=0;ipageall.size();i++){StringPage=(String)pageall.get(i);if(Integer.parseInt((String)ThisDocument.Item(pageNum))==i)Response.Output( ahref=\+Page+\fontcolor=第+(i+1)+页/font/a );elseResponse.Output( ahref=\+Page+\第+(i+1)+页/a );}%--如果不知道一条内容到底有无可能有分页,则最好在输出下一页的连接前先判断一下,如下:!--%//内容页分页前一页后一页StringpPage,nPage;pPage=(String)ThisDocument.Item(PrevPage);nPage=(String)ThisDocument.Item(NextPage);if(!pPage.equals())Response.Output(ahref=\+pPage+\<<前一页/a );if(!nPage.equals())Response.Output(ahref=\+nPage+\后一页>>/a);TurboCMS内容管理系统Java版本模板制作指南第8页共35页%--注意,所有对字段的名称都是大小写无关的,即ThisDocument.Item(“Content”)与ThisDocument.Item(“CONTENT”)是等效的。2.2Document对象的方法publicVectorRelativeArticles(intlngCount,StringRelDefine)RelativeArticles方法返回当前文章的相关文章。返回的是一个Link对象组成的向量。参数lngCount为返回的条数。如果大于实际的条数,则只返回实际的条数。参数RelDefine为“相关文章”的名,请使用空串来表示缺省的相关文章。publicChannelDocumentChannel()返回当前文章所在的频道对象。publicStringDocumentSource()返回当前文章的文章来源。Response对象负责内容的输出,通常用来直接将字段的值输出到HTML文件。Response对象有两个方法:Output(txtText),将txtText输出到HTML文件中去。Clear,取消所有已经有的输出,将输出缓冲清空。模板文件中有普通的HTML以及模板脚本,普通的HTML将直接输出到缓冲区,脚本将被解释执行,脚本中也可以通过调用Output将文本输出到缓冲区。当模板文件结束时,缓冲区中的内容就被输出到HTML文件中去了。注意Clear方法除了将清除所有用Output输出的内容外,还将清除所有的已经在缓冲中的普通HTML内容。3、封面页模板的制作频道的封面页制作中的主要任务在于列出频道内所有文章的标题和连接。这个列表支持分页显示,可以定义每页仅显示多少条。TDL解释器将只把当前页的文章返回。封面页制作需要访问的对象为Channel,它也是一个内置对象。另外,还可能涉及到类TOC和Link,这两个类是不能直接访问的,一定是通过对象Channel的属