制作模板需要有一定的html基础(学习html语言)、div+css样式基础、简单的模板语法基础。这些技巧都可以通过参考默认模板文件来学会。这节就主要分析下discuz模板的解析语法。
一、DiscuzX2.5新增php格式模板文件载入支持
从 Discuz! X2.5 开始,模板文件支持 PHP 扩展名的格式,主要功能是防止模板被别的论坛直接另存为盗取!
例如:template/default/common/header.htm
可创建为:template/default/common/header.php,模板文件为php后,代码书写方式不改变依然和以前一样采用HTML,PHP 的模板文件中你只需在原有 HTM 的模板文件开头添加一行代码即可,如:
<?php exit;?>
或者
<?php echo '你不能看此模板的内容';exit;?>
PHP 的模板文件的模板数据内容将从文件的第二行开始解析。PHP 和 HTM 模板文件同时存在时,会优先解析 PHP 模板文件。
二、模板中的变量
DiscuzX中有两种变量:
1、称为G变量:$_G[xxx]
G变量是程序的全局变量,为了让程序更加高效,减少不必要的数据获取,所以程序特将经常需要用到的变量统一到G变量下,如用户登录信息、后台设置信息、服务器环境信息、客户端CooKies、数据缓存等都存放在G变量里面,在制作模板的时候作者只需要将G变量打印出来即可获得需要的信息是否在G变量里面。
2、自定义变量:$xxx
自定义变量是以$开头首位为字母或下划线的自定义代码,如:$data、$thread、$post、$forumlist、$threadlist等等!
自定义变量是作者可以自己在程序里面自定义的,或程序自身已经定义了的。
三、变量数据在模板中的输出方式
1、输出一个变量的值{$my_var},等同于php的 <?php echo $my_var;?>,花括号可以省略但不建议去掉。
2、自定义变量数据的循环代码书写格式:
<!--{loop $data $key $value}-->
<li>$key $value</li>
<!--{/loop}-->
这段代码就是一段典型的循环代码,意思是将自定义变量$data进行循环,并将每次循环的数据传递给$value,$key是数组键值(序号),<!--{loop $data $key $value}--><!--{/loop}-->之间书写html代码。我们只需要记住这个简单却重要的意思!
打开template/default/forum/viewthread.htm,查找
<!--{eval $postcount = 0;}-->
<!--{loop $postlist $post}-->
<!--{if $post['invisible'] != -5}-->
<!--{if $rushreply && $_G['gp_checkrush'] && $post['rewardfloor'] != 1}-->
<!--{eval continue;}-->
<!--{/if}-->
<div id="post_$post[pid]">
<!--{subtemplate forum/viewthread_node}-->
</div>
<!--{eval $postcount++;}-->
<!--{/if}-->
<!--{/loop}-->
这段代码就是帖子页的循环代码,通过上面的【自定义变量数据的循环代码书写格式】我们应该可以大致了解到这个循环代码。$postlist变量中存放了当前访问帖子的主题信息、回复楼层信息,通过循环,将每个楼层的数据传递给$post变量。
循环的HTML代码存放在template/default/forumviewthread_node.htm,打开这个文件后可以看见里面的很多变量名都是$post,例如:$post['authorid'] = 作者UID、$post['username']=作者用户名等等,通过$post[xxx]不同的字段信息输出相应的数据,这些字段信息都在数据库-数据表pre_forum_post存放着。
经常发现很多童鞋将$post[xxx]变量放到其他模板文件中去用,结果刷新出来的结果什么都没有!
原因是:每个模板文件都有一个对应的php程序文件,所以自定义变量不能在不同的页面中使用,只限于定义了变量的模板文件中使用。例如帖子列表页的帖子数据是不能在论坛首页或其他页面输出的等。
四、条件判断
1、通过if判断流程分支
如果写在HTML表单元素中,可以省去使代码更清晰易读,如{if $my_var}xxx{/if}
<!--{if $my_var}-->
任意html语句
<!--{/if}-->
2、带有多条件的if写法,可使用PHP常规判断中的按位运算符等
<!--{if $my_var && ($my_var2 & 1 || $my_var3 == 3)}-->
任意html语句
<!--{/if}-->
3、带有分支条件的if写法
<!--{if $my_var == 1}-->
变量为1
<!--{elseif $my_var == 2}-->
变量为2
<!--{else}-->
其他情况
<!--{/if}-->
五、模板嵌套
将被嵌套模板内容解析为PHP语句并合并入本模板中的写法:
比如:template/default/forum/viewthread.htm中可以找到:<!--{subtemplate forum/viewthread_node}-->
这个代码的意思是在这个代码的位置载入另外一个模板文件:template/default/forum/viewthread_node.htm,
当我们打开这个文件后发现还有一段载入代码:<!--{subtemplate forum/viewthread_node_body}-->
这个代码的位置载入另外一个模板文件:template/default/forum/viewthread_node_body.htm,
这就是DiscuzX的模板文件N次嵌套!
我们首先要清楚的理解各个模板文件是做什么用的,就知道这些嵌套的意思:
template/default/forum/viewthread.htm 帖子内容页主模板,这个模板文件是帖子内容页处理程序加载的
template/default/forum/viewthread_node.htm 帖子内容页楼层模板文件,这个模板文件循环一次就是一个楼层
template/default/forum/viewthread_node_body.htm 帖子内容页,帖子内容模板,这个模板文件是专门用于处理帖子内容的
这种嵌套方式是便于以后的代码修改,比如我只想修改帖子内容的代码,就只需要编辑viewthread_node_body.htm,而不用把另外两个文件都编辑,这个在模板创建的方法里面已经说过。
六、插件钩子
<!--{hook/index_top}-->
hook为关键词,意为将index_top定义为钩子,插件钩子的作用在于能让插件在指定的一些位置输出有关代码!
我们在制作模板的时候一定要参考默认模板中的插件钩子位置进行合理的安排,除非你觉得某个插件钩子在自己的模板中并不需要,否则请保留插件钩子代码。