模板机制

模板机制

Discuz! X2.5 拥有完善的模版机制,支持模版和程序的分离,方便模版风格的扩展开发。

通常模版文件存放在template目录下,文件格式为 htm。在加载模版的时候通常就是简单的一句:

include template('dir/filename');
其中 dir 为目录名称,filename 为文件名称。这个时候 Discuz! 的模版引擎主要进行了如下的行为:

 

  • 根据传入的参数计算得到完整的文件路径和名称
  • 检查文件是否存在以及解析之后的模版缓存是否存在及是否已经过期
  • 根据上一步判定是否进行模版的解析如过解析的话,将解析后的可执行文件存入 ./data/template/ 下以备调用
  • 返回解析后的 php 文件地址并加载
  • 加载成功

PHP格式的模版

从 Discuz! X2.5 开始,模板文件支持 PHP 扩展名的格式,你可以创建例如 ./template/mytext/common/forum/discuz.php 文件,PHP 的模板文件中你只需在原有 HTM 的模板文件开头添加一行代码即可,如:

<?php exit;?>
<?php echo '你不能看此模板的内容';exit;?>

PHP 的模板文件的模板数据内容将从文件的第二行开始解析。PHP 和 HTM 模板文件同时存在时,会优先解析 PHP 模板文件

模版语法

  • 变量输出

输出一个变量的值,等同于php的 ,花括号可以省略但不建议去掉。

{$my_var}
  • 条件判断

通过if判断流程分支,如果写在HTML表单元素中,可以省去使代码更清晰易读,如{if $my_var}xxx{/if}

<!--{if $my_var}-->
    任意html语句
<!--{/if}-->

带有多条件的if写法,可使用PHP常规判断中的按位运算符等

<!--{if $my_var && ($my_var2 & 1 || $my_var3 == 3)}-->
    任意html语句
<!--{/if}-->

带有分支条件的if写法

<!--{if $my_var == 1}-->
    变量为1
<!--{elseif $my_var == 2}-->
    变量为2
<!--{else}-->
    其他情况
<!--{/if}-->
  • 循环输出

带有数组键的循环写法

<!--{loop $my_arr $key $val}-->
    循环输出的HTML语句
<!--{/loop}-->

没有数组键的循环写法

<!--{loop $my_arr $val}-->
  • 模板嵌套

将被嵌套模板内容解析为PHP语句并合并入本模板中的写法,common/header 对应某个模板套系中的common目录的header.htm模板文件

<!--{subtemplate common/header}-->

程序运行时include嵌套模板内容

<!--{template common/header}-->
  • 插件钩子

在模板中设立插件钩子,hook为关键词,意为将index_top定义为钩子

<!--{hook/index_top}-->
  • 变量数组嵌套使用

条件判断或变量输出时用到

<!--{if $my_arr[$my_var]}-->
<!--{if $my_arr[0]}-->
<!--{if $my_arr[$my_arr2[$my_var]]}-->
  • PHP解析

在模板中使用PHP语句可以通过{eval }进行

<!--{eval $my_var = 1;}-->
<!--{eval echo $my_var;}-->
<!--{eval $my_arr = array(1, 2, 3);}-->
<!--{eval print_r($my_arr);}-->
<!--{eval output();}-->
<!--{eval exit();}-->
  • 语言包使用

在模板中可以通过下面的代码来使用语言包中的某个值

{lang index_yesterday}

其中语言包在 ./source/language/目录下,以PHP数组形式存放