免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
Board logo

标题: [discuz]模板解析语法 [打印本页]

作者: flashroad    时间: 2018-8-31 13:32     标题: [discuz]模板解析语法

PHP中使用template()函数显示已存在模板
在Discuz!程序执行中可以通过 include template('模板文件夹/模板名称无后缀');的方式进行解析,前提是您使用的Discuz!程序已经包含了 ./source/function/function_core.php 的函数库
模板语法
变量输出

输出一个变量的值,等同于php的 <php echo $my_var;>,花括号可以省略但不建议去掉。
{$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}-->  

插件钩子

在模板中设立插件钩子 插件模板和语言包的设计  
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();}-->  
语言包使用


在模板中可以通过下面的代码来使用语言包中的某个值
其中语言包在 ./source/language/目录下,以PHP数组形式存放
{lang index_yesterday}
插件模板和语言包的设计
请参见:插件模板和语言包的设计
综合示例

综合示例题目1:php程序中创建一个数组并在模板中循环,并且根据模板显示奇数程序运行时include嵌套模板内容
<!--{template common/header}-->
行输出不同的CSS样式
PHP端代码:

此PHP代码省略了包含 class_core.php 以及初始化$_G变量,详细请查看:
<php
    /*此处省略include class_core.php*/
    $my_arr = array('one', 'two', 'three', 'four');
    include template('forum/mytest'); //使用自定义模板套系中的forum目录的mytest.htm
>  
模板代码:
    <!--{loop $my_arr $key $val}-->
        <div {if $key % 2 == 1}style="background: #ccc;"{/if}>
            这里是value值:{$val}
        </div>
    <!--{/loop}-->  

综合示例题目2:结合风格常量与javascript,动态改变模板页面的字体大小,并引用
默认风格中,小号字体大小 {SMFONTSIZE}为0.83em,主题列表字体大小
{THREADTITLEFONTSIZE}为14px,在Disucz!X2中使用时,需要使用$_G['style']['SMFONTSIZE']和$_G['style']['THREADTITLEFONTSIZE']。
$('test1')此写法是因为header中已经加载了common.js全局javascript脚本文件,可以通过简写来达到document.getElementById('test1')的效果

./template/mytest/forum/mytest.htm模板代码如下
<!--{subtemplate common/header}-->
<div id="test1" style="font-size:{$_G['style']['FONTSIZE']};">
    这是一个改变字体的实例
</div>
<span onclick="changefontsize('{$_G['style']['SMFONTSIZE']}');">改变小号字</span><span onclick="changefontsize('{$_G['style']['THREADTITLEFONTSIZE']}');">改变为大号字</span>
<script type="text/javascript">
function changefontsize(size) {
    $('test1').style.fontSize = size; }
</script>
<!--{subtemplate common/footer}-->
默认模板的header和footer
作者: flashroad    时间: 2018-10-23 15:13     标题: discuz模板语法定义

【转自】
https://www.cnblogs.com/xiaochao ... /06/09/1754724.html


Discuz! 的模板采用近似 PHP 表达式的语法,支持的元素如下:

<!–{ … }–>
逻辑元素包围符,该符号用于包含条件和循环元素
条件判断
<!--{if expr1}-->
  statement1
<!--{elseif expr2}-->
  statement2
<!--{else}-->
  statement3
<!--{/if}-->
这 是一个典型的条件模板,当条件 expr1 为真时,显示模板 statement1 内容,否则当 expr2 为真时,显示模板 statement2 内容,否则显示模板 statement3 的内容。如同其他语言中的条件控制一样,其中 <!–{elseif expr}–> 和 <!–{else} –> 是非必须的。

不带下标变量的数组循环
<!--{loop $array $value}-->
  statement
<!--{/loop}-->
相当于 PHP 的数组循环语句:

foreach($array as $value) {
  statement
}
带下标变量的数组循环
<!--{loop $array $key $value}-->
  statement
<!--{/loop}-->
相当于 PHP 的数组循环语句:

foreach($array as $key => $value) {
  statement
}
逻 辑元素包围符在 { } 外面包含了 html 的注释符号 <!– –>,除了为了和信息元素相区别外,也方便了使用 Dreamweaver 和 Frontpage 之类工具编辑模板的用户。因逻辑元素会被识别为 html 的注释而不被显示,对于绝大多数用户,逻辑元素中的内容是完全不需要修改的,甚至修改错一个字符就可能引起错误信息和整个系统无法运行。因此通常您在修改 模板的时候,不要修改模板的逻辑信息,更不要将逻辑信息内部元素(如 <!–{else}–> 等)的前后位置作以修改,否则可能会导致错误。如果您的模板被不慎修改损坏,请立即用原标准默认模板覆盖,即可恢复。

对于高手而言,实际上外部的 <!– –> 是可以省略不写的,可以用于某些元素在模板中的定位,但强烈建议普通用户不要轻易尝试。

{ … }
信息元素包围符
{CONSTANT}
可以引用界面替换变量,其中必须为大写字母,该符号实际的作用是引用 PHP 常量 CONSTANT,因此也可以通过它来引用其他的常量内容。
{lang variable}
可 以在模板中引用语言变量 variable 的内容,语言变量经由 templates.php.lang 中数组 $language 定义。如 {lang post_edit} 的内容在编译模板的时候被替换为 $language['post_edit'] 的内容,简体中文版的意思是“编辑帖子”。
{template name}
模板嵌入符,为了避免模板的冗长,可以使用本符号来将 name 模板的内容嵌入本模板中(实际上为引用)。
{eval statement}
运行 PHP 语句体 statement。推荐只在特别必须的时候才使用该结构,因为它会破坏模板的结构和可读性。如 {eval echo ‘template!’;} 实现的功能为 echo ‘template’;
{LF}
换行符,因为 Discuz! 模板引擎会忽略掉多余的换行(\n),这个符号用来成生需要的 \n。
我 们所推荐的模板修改方法:通过普通编辑器手工书写 html 或通过 Dreamweaver 或 Frontpage 修改。但是修改需切记,同一逻辑元素内或嵌套中元素的位置和内容切勿修改,即通常情况下,您不能把 <!–{}–> 包围的内容单独的移动,更不能删除。但是整个最外部逻辑结构是可以移动或删除的。

如果修改后模板所在页面在输出类似如下的错误信息 Parse error: parse error, unexpected ‘}’ in /home/username/forums/forumdata/templates/1_login.tpl.php on line 6,说明模板中出现了无法匹配,或格式错误的逻辑元素,请仔细检查是否有元素不对应,没有结束或嵌套损坏,格式错误的现象,必要时可以恢复原始模板来解决 问题。

Discuz! 提供了方便的界面打包程序,前面已对其格式做了介绍,将导出信息的内容粘贴到 系统设置 中 风格方案 中的 导入界面方案 中,执行即可。程序会自动解析数据内容,恢复相关的界面设置,自定义替换变量和所需的模板设置。如果被导出界面使用了非默认模板,必须将 ./templates 目录属性设置为 777,以便导入程序自动建立模板记录和文件夹。

定义变量说明

<?exit?>
<!–{eval $i=2}–>
<!–{if $i==1}–>
123
<!–{/if}–>

<!–{block name=”spaceblog” parameter=”notype/1/order/i.dateline,i.lastpost/limit/0,14/cachetime/900 /cachename/newti/tpl/data”}–><!–最新日志–>
<!–{eval $i=0;}–>
<!–{loop $_SBLOCK['newti'] $value}–>
<!–{if $i % 2 == 0}–>//如果i除以2的余数等于0
<div class=”listbg”><!–{else}–>
<div class=”listbg2″><!–{/if}–>
· [<span class="listA">$value[typename]</span>]<a
class=”listA” href=”$value[url]” title=”$value[subjectall]” target=”_blank”>$value[subject]</a></div>
<!–{eval $i++;}–>
<!–{/loop}–>

<!–{eval for ($i=1; $i<=5; $i++){ }–>

<!–{eval echo “Hello World!<br />”;}–>
<!–{eval}}–>
作者: flashroad    时间: 2018-10-23 15:14     标题: Discuz!标签语法

【转自】
http://www.cmsjzy.cn/discuz/157.html
Discuz! X 模板的解析主要是 ./source/class/class_template.php 文件解析处理的,如果需要深入了解请可以看看这个文件!
1、模板嵌套语法
将被嵌套模板内容解析为 PHP 语句并合并入本模板中的写法
<!--{subtemplate common/header}-->
common/header 对应某个模板套系中的 common 目录的 header.htm 模板文件
程序运行时include嵌套模板内容
<!--{template common/header}-->
注释:当模板中有较多 loop 时,尽量用 subtemplate

2、逻辑判断 if...else
A、如果写在 HTML 表单元素中,可以省去使代码更清晰易读,如{if $my_var}xxx{/if}
   <!--{if $_G['uid']}--> 任意html语句 <!--{/if}-->

B、带有分支条件的 if 写法
   <!--{if $_G['uid']}--> 任意 html 语句 <!--{elseif $_G[connectguest]}--> 任意html语句 <!--{/if}-->

C、带有多条件的 if 写法,可使用 PHP 常规判断中的按位运算符等
   <!--{if empty($_G['forum']['picstyle']) && $_GET['orderby'] == 'lastpost' && empty($_GET['filter']) }-->
     任意 html 语句
   <!--{/if}-->

D、CSS 书写时也可以按条件进行判断设置设置例如:
   <td class="fl_g"{if $forumcolwidth} width="$forumcolwidth"{/if}>

3、直接执行 PHP 代码标签:
<!--{eval echo $my_var;}-->
<!--{eval $my_arr = array(1, 2, 3);}-->
<!--{eval print_r($my_arr);}-->
<!--{eval output();}-->
<!--{eval exit();}-->

4、直接输出变量,等同于 PHP 的 <?php echo $my_var; ?>, 花括号可以省略但不建议去掉。(模块程序处理后才能在这里调用):
<div id="anc"><ul id="ancl">$announcements</ul></div>
<!--{echo cutstr($group[lastpost][subject], 30)}-->

5、广告的嵌入点代码:
<!--{ad/headerbanner/wp a_h}-->

6、插件的钩子标签:
<!--{hook/global_usernav_extra2}-->
hook为关键词,意为将index_top定义为钩子

7、循环语法(可以多重循环)
带有数组键的循环写法
<!--{loop $my_arr $key $val}-->
    循环输出的HTML语句
<!--{/loop}-->
没有数组键的循环写法
<!--{loop $_G['setting']['navs'] $nav}-->
    循环输出的HTML语句
<!--{/loop}-->

8、DIY 区域和后台数据调用标签:
<!--[diy=diy1]--><div id="diy1" class="area"></div><!--[/diy]-->
{block XXX}(数据调用模块)

9、Discuz! 语言包加载后,模板文件中的使用:
{lang forum_category_modedby}
其中语言包在 ./source/language/目录下,以PHP数组形式存放




欢迎光临 flash之路-flash技术交流 (http://flashroad.joinbbs.net/) Powered by Discuz! 7.2