admin 发表于 2013-3-30 05:56

Discuz!模板二次开发的模板语法介绍

Discuz!模板二次开发的模板语法介绍:
相信大多数朋友都看过discuz的模板文件的代码了。不同于传统的静态html代码,dz的静态模板可以说是动态化得模板文件了。这里集合了,一些特有的php变量和逻辑判断。下面我将为大家整理一下常用的dz模板二次开发规范,希望有助于大家更好的制作模板。
DZ的模板引擎原理是通过特殊的Discuz!模板标签来完成特定的循环和判断的。它不同于PHP本 身自带的脚本语言。大家可能有很多人写过PHP的程序,也都使用过类似 if($abc == 1) {} else {}的判断。Discuz!模板引擎会将Discuz!模板标签中 的关键字替换成php自身的脚本语句,然后存入缓存目录forumdata/templates目 录中生成一个可供PHP程序包含和调用的模板文件。

那在DZ的模板引擎中我们该如何使用Discuz!模板标签 呢?
下面给大家列举DZ模板引擎中常见、常用的模板语句:

一、直接输出变量: {$abc}或 {echo $abc}
二、输出数组中某个变量:{$arr}
三、IF判断语句:
<!--{if $abc < 1}-->
我abc小于1
<!--{elseif $abc == 1}-->
我abc为1
<!--{else}-->
我abc大于1
<!--{/if}-->

四、Loop循环语句:
<!--{loop $abc $key $val}-->
这里是 {$val}
<!--{/loop}-->

上面这段loop语句,DZ会将其转换成php自身的循环语句:
If(is_array($abc)) {
      Foreach($abc AS $key => $val) {
      }
}

五、在模版文件中使用PHP语句:{eval $abc = 1;}注意:这里必须带”;”结尾。

六、在本模板中引用其他的模板: 如我们要包含头部模板文件(header.htm)可以这样写:{subtemplate header}
在模版中使用语言包中的中文语句:{lang xxxxx},在 这里xxxxx就是语言包中任意一个数组的键值。
如:templates/default/templates.lang.php(语 言包)内有下面的数组
$language = array
(
      'discuz_lang' => 'templates',

      'click_here' => '点击这 里',
      'ban_member' => '禁止',
      'input_invalid' => '填写无 效',
      'title_none' => '无标题',
      'title' => '标题',
}
大家可以使用{lang title},这样在模板输出的时候则会显示”标 题”两个字。
当你了解了Discuz!模板开发语法之后,我们就一起来 熟悉一下,常用的数据库表含义,与主题表中常用字段的含义,这样方便你使用sql语句灵活调用个性的内容,如:按会员性别调用头像,在首页右侧边栏调用女性会员头像等等这样各个性的需 求,在此我们丛老师为我们讲解常用数据库表、字段及sql语句。
数据 常用的帖子表有:cdb_threads,cdb_posts
我们仅以了解数据库中该如何根据 结构来获得自己需要的信息。
用户名和密码均为root。也可以查看安装后的readme.txt说 明文件
接着我们还是来围绕今天的题目, 来知道哪些数据表和数据字段对调用“帖子列表”有帮助。
打开phpmyadmin,找到现在你们本机用于演示的数据库。如图:

http://www.55625.com/data/attachment/forum/201204/28/232511f61ltlo60xly00sz.jpg.thumb.jpg

http://www.55625.com/data/attachment/forum/201204/28/232512g6gqzptttrfg6mrh.jpg.thumb.jpg

cdb_threads表红色标记的,则是discuz!中 最重要的主题列表。,回复主题在哪个表呢?
其实,回复帖子的库文件是:cdb_posts。我 们在这里先只使用cdb_thread,以数据库的方式获取,最新的帖子列表数据和第一讲标签调用 有区别,大家一起跟我做。
cdb_threads中有几个重要的字段:
tid (大家很熟悉了), 每个主题唯一的一个帖子ID
fid(所在论坛版块的ID号)
typeid (主题分类类 型)                        
author | authorid 为作者的用户名和作者的uid
subject (标题)

dateline (发帖时间)
lastpost (最后回复者)
lastposter(回复者用户名)
views (浏览数)
displayorder (置顶等级)
看到了上面字段我们就可以根据这些来做一个最新主题列表的数据库sql语句
我们可以这样写
点上面的 sql按 钮

输入:SELECT * FROM cdb_threads ORDER BY dateline DESC LIMIT 4   
提交sql查询,看下结果。
上面的这段sql语句的意思是
以dateline(发帖时间)的倒序,输出4个结果。限制在哪个版块我们先不考虑。这里讲到一些sql语 法。
如果我们只想去的帖子id和标题用于显示,那我们只需要这样书写:
SELECT tid,subject FROM cdb_threads ORDER BY dateline DESC LIMIT 4
将select后面的变一下,变为你想要输出的字段名就可以了。这样一来,我们就获得了与第一个大问题同样效果的 一个数据库调用 新主题列表的语句了。
首先。我们打开dz根 目录的forumdisplay.php文件
用编辑器打开(建议使用Dreamweaver或者Editplus)
向下,到最下方。include template($template);代码的上面。
在上面写入:
$query = $db->query("SELECT tid,subject FROM {$tablepre}threads WHERE fid =
'$fid' ORDER BY dateline DESC LIMIT 4");
while($result = $db->fetch_array($query)) {
      print_r($result);
}
然后,进入自己的演示站,进入一 个有主题的论坛版块,查看一下。最上面会有类似的输出。如图

http://www.55625.com/data/attachment/forum/201204/28/23253077y7yj788pc47779.jpg

继续修改刚才的代码:

我们把 print_r($result);
换成
$mythread[] = $result;
这句:$mythread[] = $result;
的意思就是,组成数组,准备在模 版中使用。
大家进入 templates/default/forumdisplay.htm
这个文件,打开以后。找到第25行:
<div class="main">
      <div class="content">
在下面。我们写一个 loop循环
<!--{loop $mythread $key $val}-->
       <div>帖子ID:{$val}主题:{$val}</div>
       <!--{/loop}-->
这里请注意:
loop后面跟着我们的变量 $mythread
然后帖子ID:{$val}则是刚才在程序中要获取 的id值
主题:{$val}则为标题

http://www.55625.com/data/attachment/forum/201204/28/2325312q4gq24n6itn767t.jpg

页: [1]
查看完整版本: Discuz!模板二次开发的模板语法介绍