Discuz! 官方站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 80152|回复: 14

discuz模板开发教程系列教程整理

[复制链接]
发表于 2010-2-26 10:51:17 | 显示全部楼层 |阅读模式
本帖最后由 elevensky 于 2010-3-15 11:13 编辑

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[0]}
三、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,找到现在你们本机用于演示的数据库。如图:



  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);
}
然后,进入自己的演示站,进入一 个有主题的论坛版块,查看一下。最上面会有类似的输出。如图


继续修改刚才的代码:

我们把 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[tid]}主题:{$val[subject]}</div>
       <!--{/loop}-->
这里请注意:
loop后面跟着我们的变量 $mythread
然后帖子ID:{$val[tid]}则是刚才在程序中要获取 的id值
主题:{$val[subject]}则为标题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
发表于 2010-3-2 19:12:30 | 显示全部楼层
正在学习仿站的基本方未法
回复

使用道具 举报

发表于 2010-3-15 08:54:57 | 显示全部楼层
回复 1# elevensky


最近在,在写模板时遇到一个问题 ,生成一个下拉列表,为什么不成功啊
1.htm:
<select name="amount_1">
        <!--{eval for($i=1;$i<={$val[good_amount]};$i++){echo "<option value=$i>$i</option>"}}-->
</select>

1.tpl.php:

  <select name="amount_1">
<? for($i=1;$i<=$val['good_amount'];$i++)<? echo "<option value=$i>$i</option>" ?>; ?>
</select>

提示 错误,指向生成的文件那行

向大侠请教,谢谢!
回复

使用道具 举报

发表于 2010-3-15 11:17:19 | 显示全部楼层
本帖最后由 xserver 于 2010-3-15 14:32 编辑

在Supesite中想 创建模块 调用一下论坛的数据。

不如果是要一天内所发的帖子、并且要得到版块的名称。
SQL语句可以这样写
  1. SELECT f.fid AS forum_id, f.name AS forum_name, t . *
  2. FROM cdb_forums AS f, cdb_threads AS t
  3. WHERE (f.fid = t.fid)
  4. AND (dateline > curdate( ) -1)
  5. ORDER BY replies DESC
  6. LIMIT 0 , 10
复制代码
但模板应该怎么写才是正确的?

就是多表联合查询的问题。

在phpMyAdmin中使用SQL语句不会出错的。

但在模板中这么 $value[forum_name]  将是一个空值。

而其它的 $value[url] $value[fid] $value[message] $value[subject] 这些都是可以正确得到的。
  1. <?exit?>
  2. <table width="420" align="center" background="images2/pic20.gif" border="0" cellpadding="0" cellspacing="0">
  3. <tbody>

  4. <!--{loop $_SBLOCK['my_forumhot'] $value}-->
  5. <tr>
  6.         <td class="f12_CA02" width="6">[</td>
  7.         <td class="f12_CA02" width="48"><div style="width: 48px; height: 24px; overflow: hidden;"><a href='{S_URL}/bbs/forumdisplay.php?fid=$value[fid]' target='_blank'>$value[forum_name]</a></div></td>
  8.         <td class="f12_CA02" width="9" align="left">]</td>
  9.         <td class="f14_4D4D" width="267"><a href="$value[url]" title='$value[subject]' target='_blank'>$value[subject]</a></td>
  10.         <td width="90" align="right"><a href='{S_URL}/bbs/space.php?uid=$value[authorid]' target='_blank'>$value[author]</a></td>
  11. </tr>
  12. <!--{/loop}-->
  13. </tbody>
  14. </table>

复制代码
回复

使用道具 举报

发表于 2010-3-15 16:16:29 | 显示全部楼层
在Supesite中想 创建模块 调用一下论坛的数据。

不如果是要一天内所发的帖子、并且要得到版块的名称。
...
xserver 发表于 2010-3-15 11:17



    你在程序中直接 打印(print_r) $_SBLOCK['my_forumhot']变量会是什么样子呢。
回复

使用道具 举报

发表于 2010-4-30 11:07:15 | 显示全部楼层
啊 我占位 正在学习
回复

使用道具 举报

发表于 2010-5-24 11:15:37 | 显示全部楼层
回复

使用道具 举报

发表于 2010-5-24 15:47:23 | 显示全部楼层
支持作者,谢谢你的分享
回复

使用道具 举报

发表于 2010-6-22 10:49:46 | 显示全部楼层
刚好正在弄这个,很好,谢了!
回复

使用道具 举报

发表于 2010-7-13 23:20:16 | 显示全部楼层
正在找这个....
回复

使用道具 举报

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

本版积分规则

Discuz! Q 3.0 全新来袭 助力变现

小黑屋|Discuz! 官方站 ( 粤B2-20090059-165 )star

GMT+8, 2021-10-26 04:43

Powered by Discuz! X3.4

Copyright © 2001-2019 Tencent Cloud.

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