一、DLE模板的工作原理

大家都知道,模板都是由框架+各个功能/内容模块来组成的,这也就是所谓的布局。如果布局一款模板,我们的习惯思维总是希望能把整个模板的框架先定义 好,然后在框架里面再设计诸如页头、顶部菜单、边栏、内容部分、底部导航及页脚信息等各个部分。正是基于这种由总体到局部的思路,DLE设计了他的模板系 统,即:以main.tpl为框架模板,然后再在main.tpl对应的部分调用其他功能性模板(如:login.tpl等)或内容性模板 (如:shortstory.tpl等)。当我们每次打开DLE站点时,系统会自动先调用main.tpl,并按照模板内的调用结构再次调用其他模板提供 的的数据,直到形成整个网页展示在我们面前。

二、DLE模板中基础功能类标签

明白了DLE模板的工作原理,我们就会明白main.tpl是整套模板的灵魂,所以本部分主要讲解一下存在于main.tpl内的基础功能类标签: {AJAX}, {info}, {content}, {tags}, {sort}, {custom}。

1.{AJAX}:功能类标签 、 局部标签(main.tpl)

这个标签非常容易理解,AJAX技术(类似预加载+实时反馈,具体请百度)可以在有效节约站点流量的前提下,完美提升用户终端体验,DLE使用AJAX技 术是必须的!那么这个标签的作用就是在模板中输出站点的预加载信息,以供部分功能调用。因为它的数据是要供其他部分调用的,所以这个标签的位置要尽量靠 前,一般建议放在紧随<body>之后

2.{Info}: 功能类标签、局部标签(main.tpl)

Info即information的缩写,意思是提示信息。那么这个标签的含义就很明显了,站点与用户交互过程中出现的提示信息(例如登录时密码错 误 “Login failed,bad password” )就会出现在放置{Info}标签的位置。{Info}提示一般包含标题和提示信息两部分,可以在对应模板 info.tpl 中调整HTML+CSS样式。一般建议将{Info}标签放置在{content}标签之前,使之更加醒目。

3.{content}:功能类标签、局部标签(main.tpl)

content的英文含义是“内容”的意思,这个标签也是站内主内容的输出部,用来标记输出文章列表、文章正文、静态页面、程序部分模块内容的区域。

有些同学不太理解这个标签,这里简单介绍一下:打开一个DLE站点,我们会发现,文章列表占据了很大的位置,而点击列表中的标题,进入文章内容页,文章 列表消失了,文章正文占据了刚才文章列表的位置,然后再点击添加文章,文章正文消失,文章添加页面又占据了这个地方......,我们意识到这个区域是模 板的一个公共区域,站内不同链接下的主体内容会分别占用这个位置,难道我们把每种情况都添加一遍吗?当然不是,既然他们有共同的特性,我们就用 {content}标签来表示这个区域,至于哪个链接中这个区域调用哪些数据都让程序自己来完成吧!

4.{tags}:功能类标签、局部标签(main.tpl  fullstory.tpl  shortstory.tpl)

这个标签大家应该很容易理解,就是标签的意思。不过这个局部标签在不同的位置,输出的内容不一样:在main.tpl里面放置时输出整站的标签云(默认数 量是30个,由/engine/modules/tagscloud.php这个文件控制),而在fullstory.tpl和 shortstory.tpl两个模板文件中放置时,会输出对应文章设定的标签。

5.[sort] {sort} [/ sort] :功能类标签+范围类标签、局部标签(main.tpl)

sort即排序的意思,在DLE中,默认提供了按发布时间、评论数量、浏览数量及字母顺序进行排序,这个功能是系统内置的(后台》System setting 》Database Setting 》 Allow users to change articles default order 开启此功能后模板中的代码才会起作用,否则不显示)。

在main.tpl放置{sort}后,默认是横排输出的(由/index.php及、/engine/init.php等文件控制),那我们还要 [sort]  [/ sort]这组范围标签有什么用呢?  这组标签的存在时为了更好的界定{sort}的范围,比如,我们像给输出的文字加上颜色,有两种方法可以实现:

  1. (1)  <span style="color:red"> SORT: [sort] {sort} [/ sort] </span>
  2. (2)  [sort]<span style="color:red"> SORT: {sort}  </span> [/ sort]

如果sort功能开启,那么上面两种代码显示的是一致的,但是如果关闭sort功能,我们会发现(1)代码仍然会输出

  1. <span style="color:red">SORT:</span>

而代码(2)中[sort]  [/ sort]以及它包括之内的代码完全不显示。

上面这个例子证明通过[sort]  [/ sort] 范围类标签可以界定特定的代码范围,使之只有在需要的时候才出现,不需要的时候完全消失。在模板制作设计过程中更加灵活

6.{custom}:功能类标签、全局标签

本标签是DLE所有标签中功能最强大的标签。通过这个标签,我们可以在特定的区域、按照特定的模板(需要自己另外制作)输出特定的分类、 特定数量的文章列表,特别是这个标签支持缓存功能。不过这个标签需要设定多个参数,为了保证标签能更准确的运作,我们必须按照以下格式(包括大小写)及参数顺序进行布置

  1. 实例:{custom category = "2,7" template = "custom" aviable = "global" from = "0" limit = "10" cache = "yes"}

以上是一个实例,我们在实际使用中,需要对category,template,aviable,from,limit,cache等6个参数进行设定,以下分别加以说明:

category即分类的意思,它在标签中后续的2和7两个用半角逗号隔开的数字表示分类的id号,这个可以在后台》 Categories里面的分类列表中找到。这里可以设定任意多个分类id(主分类id,二级分类id...没有冲突,所以填写任意id都可以),用半角 逗号隔开放入双引号内即可,这个标签在以后运作时,输出的文章即是上面设定的这些分类中的文章,其他分类的文章不会出现。

template即模板的意思,它用来指定文章输出时通过哪个模板形式输出。类似shortstory.tpl,它也是只需要设定一条记录的模板形式,DLE程序会自动循环调用这个模板来生成文章列表。
我们使用这个模板是希望能让站点的内容表现形式更加丰富,所以我们一般会制作新的模板来达到我们预期的效果,新模板可以兼容 shortstory.tpl里面的所有标签,所以可以按照shortstory.tpl模板文件的标签说明来实现这里新模板的各种效果。制作新模板之 前,当然我们要先新增一个模板(如实例中的custom),如果你在后台模板在线编辑器中新增模板只需要填写模板名称即可(如:custom),而如果你从服务器的文件管理系统添加新模板,需要指定的名称必须包含.tpl拓展名(如:custom.tpl)。

aviable即适用范围的意思,它表示{custom}标签输出的文章列表会出现在哪些区域,DLE系统已经预置了各个区域的值,使用时只要根据需要填写下面的值即可:

  1. global - 在整站显示
  2. main- 只在首页显示
  3. date - 只在浏览日期下的文章列表中显示
  4. cat - 只在浏览分类下的文章列表中显示
  5. showfull - 只在浏览全文时显示
  6. search - 只在浏览搜索结果页显示
  7. userinfo - 只在浏览用户信息时显示
  8. register - 只在注册页面显示
  9. stats - 只在浏览统计页面时显示
  10. pm - 只在浏览站内消息时显示
  11. feedback - 只在站点反馈页面显示
  12. favorites - 只在浏览收藏夹下的文章列表时显示
  13. newposts - 只在浏览最新未读文章列表时显示
  14. addnews - 只在添加文章页面显示
  15. lastcomments - 只在浏览最新评论页面时显示
  16. static - 只在浏览静态页面时显示(注意:具体的静态页填写对应的静态页的url字符串)
  17. catalog - 只在浏览特征符下的文章列表中显示
  18. alltags - 只在标签云页面显示
  19. tags - 只在特定标签下文章列表显示

我 们发现上面的值都是独立的,如果我们需要在多个区域使用{custom}标签,那么我们需要使用链接符“|”来添加多个区域,例如aviable = "userinfo | register | main"  就表示在浏览用户信息、注册页及主页都会输出{custom}标签的内容。

from即开始位置,表示输出的数据从第几条文章记录开始。DLE系统已经预先设定这里的文章顺序是降序(id越大文章越新越靠前),如果我们设置 from=“0”,就表示{custom}标签输出的文章列表中第一个就是指定分类们下最新的一篇文章,如果我们设置 from=“14”,就表示 {custom}标签输出的文章列表中第一个就是指定分类们下的最新文章的第14篇文章。
limit即文章列表输出的数量
这里的值很随意,按你的需要来填写即可,不过过大的数字会轻微加大系统的负载

cache即是否允许缓存{custom}标签输出的文章列表。填写“yes”表示允许,“no”表示不允许,允许缓存对降低系统负载有比较明显的效果(特别是大型站点),所以建议开启缓存

最后再次说一下,注意上面实例中{custom}标签的顺序,千万别弄错!另外每添加一个{custom}标签都会新增一个对数据库的查询,所以对于大型站点或服务器性能不佳的用户来说,务必控制好此标签的数量以保持站点运行的更加流畅。

三、DLE模板中范围类标签
1.[aviable = section] text [/ aviable]范围类标签、全局标签
本标签组是DLE使用频率非常高的一个,所以请仔细看一下下面的说明。

看到这个标签,我们很自然会想到上文刚刚提到的{cutom}标签中的aviable参数,其实这个参数就是用本标签组衍生而来的,aviable 参数的所有属性也都是继承本标签组的。为了不混淆思路,这里还是重新说一遍,即使不看上面的aviable参数也可以完整正确的理解此标签组的作用。

aviable即适用范围的意思,本标签组表示在特定范围输出特定的内容(即标签组内的内容,包括html代码等)。DLE系统已经预置了各个特定范围的值,使用时只要根据需要在标签组第一个[]内的aviable后面填写下面的值即可:

  1. global - 在整站显示
  2. main- 只在首页显示
  3. date - 只在浏览日期下的文章列表中显示
  4. cat - 只在浏览分类下的文章列表中显示
  5. showfull - 只在浏览全文时显示
  6. search - 只在浏览搜索结果页显示
  7. userinfo - 只在浏览用户信息时显示
  8. register - 只在注册页面显示
  9. stats - 只在浏览统计页面时显示
  10. pm - 只在浏览站内消息时显示
  11. feedback - 只在站点反馈页面显示
  12. favorites - 只在浏览收藏夹下的文章列表时显示
  13. newposts - 只在浏览最新未读文章列表时显示
  14. addnews - 只在添加文章页面显示
  15. lastcomments - 只在浏览最新评论页面时显示
  16. static - 只在浏览静态页面时显示(注意:具体的静态页填写对应的静态页的url字符串)
  17. catalog - 只在浏览特征符下的文章列表中显示
  18. alltags - 只在标签云页面显示
  19. tags - 只在特定标签下文章列表显示

我们发现上面的值都是独立的,如果我们需要在多个范围显示本标签组包括的特定内容,那么我们需要使用链接符“|”来添加多个区域,例 [aviable = "userinfo | register | main"]特定内容[/aviable]  就表示在浏览用户信息、注册页及主页都会输出本标签组包括的特定内容。

1.1 [not-aviable = section] text [/ not-aviable] 范围类标签、全局标签

在模板中,我们会经常遇到与上面相反的情况,即只在特定的范围不显示特定内容,DLE也提供了相对的标签组来解决上面的问题,不过注意使用过程中注意不要引文代码过多,导致两组相对的标签组出现交叉的情况。

2.[category = X] text [/ category] 范围类标签、全局标签

在站点运营中,我们总会根据文章的特点将它们分成若干类,每个分类总有自己的特性,如果我们在模板中能比较好的体现出这些特性的话,对我们的用户来说会有非常好的用户体验。本标签组就可以很好的解决这个问题,它表示在特定的分类下,显示特定的内容(允许HTML代码)。标签组中的X表示分类ID(后台》Categories里面的分类列表中找到 ),如果我们想设定多个分类,可以使用半角逗号来链接不同的分类ID,例如:

  1. [category = 1,2,3] text [/ category]
复制代码

2.1 [not-category = X] text [/ not-category] 范围类标签、全局标签
相对应的,我们有时候希望在除了特定分类以外的范围内出现我们想要的内容,DLE也设定了与上文相对的标签组[not-category = x] text [/ not-category] 表示只在特定的分类下,不显示特定的内容(允许HTML代码)。

3. [group = X] text [/group] 范围类标签、全局标签

在站点运营中,我们总会将用户归入不同的用户组以便于管理,每个用户组总有自己的特性,如果我们在模板中能比较好的体现出这些特性的话,对我们的用户来说会有非常好的用户体验。本标签组就可以很好的解决这个问题,它表示在特定的用户组下的用户,浏览站点时显示特定的内容(允许HTML代码)。标签组中的X表示用户组ID( 后台》User Group Manager里面的用户组列表中找到 ),如果我们想设定多个用户组,可以使用半角逗号来链接不同的用户组ID,例如:

  1. [group = 1,2,3] text [/ group]
复制代码

3.1 [not-group= X] text [/ not-group] 范围类标签、全局标签
相对应的,我们有时候希望在除了特定用户组以外的用户组内出现我们想要的内容,DLE也设定了与上文相对的标签组 [not-group= x] text [/ not-group] 表示只在特定的用户组下的用户,浏览站点时不显示特定的内容 (允许HTML代码)。

4. [page-count = X] text [/page-count] 范围类标签、全局标签
在站点运营中,我们有时会希望只在文章列表页的某几页显示特定内容,其他页面就不需要再显示这些内容了。如果我们在模板中能比较好的控制的话,对我们的用户来说会有非常好的用户体验。本标签组就可以很好的解决这个问题,它表示在文章列表的特定页码中浏览时显示特定的内容(允许HTML代码)。标签组中的X表示页码ID,如果我们想设定多个页码,可以使用半角逗号来链接不同的页码ID,例如:

  1. [aviable=cat][category= 2,4][page-count  = 1,2,3] text [/ page-count] [/category] [/aviable] 表示在分类ID为2和4的分类下,文章列表页码ID为1和2和3的页面显示text内容
复制代码

4.1 [not-page-count= X] text [/ not-page-count] 范围类标签、全局标签
相对应的,我们有时候希望在除了特定文章列表特定页码以外的页面出现我们想要的内容,DLE也设定了与上文相对的标签组 [not-page-count = x] text [/ not-page-count ] 表示只在特定页码下浏览时不显示特定的内容 (允许HTML代码)。

5. [static = page url] text [/ static] 范围类标签、全局标签
静态页面也是站点重要的组成部分,我们有时会希望只在特定的静态页面显示特定的内容,其他页面就不需要再显示这些内容了。如果我们在模板中能比较好的控制的话,对我们的用户来说会有非常好的用户体验。本标签组就可以很好的解决这个问题,它表示在特定静态页面中浏览时显示特定的内容(允许HTML代码)。标签组中的page url表示页面url字符串,如果我们想设定多个页码,可以使用"|"来链接不同的页面url字符串,例如:

  1. [static = rules|dmca|privacy] text [/ static] 表示在页面url为rules和dmca和privacy的静态页面显示text内容
复制代码

5.1 [not-static = page url] text [/ not-static] 范围类标签、全局标签
相对应的,我们有时候希望在除了特定静态页面以外的页面出现我们想要的内容,DLE也设定了与上文相对的标签组 [not-static = page url] text [/ not-static] 表示只在特定静态页面下浏览时不显示特定的内容 (允许HTML代码)。

四、服务于DLE程序模块的数据值类标签  
1.{banner_adname}:我们在  后台》Adverting 模块中可以建立各种不同的广告代码,在建立新广告代码时会要求填写广告名称(tag name),这个名称就代表了这个广告,在模板中通过{banner_广告名称}标签来确定广告的位置,从而使模板看起来更简洁易读。我们会在《认识 DLE程序的广告模块》一文中更加详细的介绍相关内容。

2.{inform_rssname}:我们在 后台》RSS Informer On a Site 模块中设定站点的RSS调用功能,本功能可以通过RSS将其他站点的RSS新闻展示到自己的站点上来。同广告模块相似,我们在建立RSS调用时会要求填写 一个名称,我们把{inform_RSS调用名称}的标签放置到模板中,即可输出其他站点的rss新闻列表到自己的模板上。注意:输出的rss新闻列表的 样式可以通过模板文件inform.tpl来设定。

五、关于本文讲解内容的几点说明

非常高兴你看到了最后,一般最后的才是精华,[模板知识] Datalife Engine模板原理及全局标签/基础标签解析

1.本文是认识DLE标签的第一篇文章,里面涉及了很多关于标签的含义、使用的范围及举例说明,我已经尽力去写了,但难免有一些错误或解释不清的地方,希望大家能够及时指正,我随时改进,先谢谢大家。

2.关于标签,我认为重点是去理解,只有理解的东西才更容易记忆,运用的也更灵活。比如在制作模板中,如果对范围标签理解的比较透彻的话,可以通过嵌套范围标签来完成非常高要求的模板设计。再比如通过{custom}标签很好的美化模板,丰富站内内容及内链,对用户体验是非常有帮助的。

3.制作模板,我们要养成一些比较好的习惯,比如制作过程中尽可能的添加注解,或者通过DLE程序的调用函数可以使模板的脉络更加清晰,便于日后自己或他人做二次修改。说到调用函数,这里再提醒一下:{include file = "my_block.tpl"}