模板解析变量理解

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}-->
<!--{/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}}-->
制作模板需要有一定的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,查找

这段代码就是帖子页的循环代码,通过上面的【自定义变量数据的循环代码书写格式】我们应该可以大致了解到这个循环代码。$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定义为钩子,插件钩子的作用在于能让插件在指定的一些位置输出有关代码!
我们在制作模板的时候一定要参考默认模板中的插件钩子位置进行合理的安排,除非你觉得某个插件钩子在自己的模板中并不需要,否则请保留插件钩子代码。
时间: 2024-10-08 07:51:45

模板解析变量理解的相关文章

[转载]ECMall模板解析语法与机制

ECMall模板解析语法与机制 2011-05-22 在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词就是标签名.在标签单元中单词前含"$"(美元符)的为变量名. 资源引用 res标签 功能:返回当前模板当前风格目录的url路径 实例:{res file=css/ecmall.css}这个标签在模板编译后将变成http://商城域名/themes/default/styles/defaul

javascript编写自己的模板解析器

编写自己的模板解析器 因为最近在研究artTemplate,ejs,baaiduTemplate等模板,所以,一时兴起,自己也写了个简单的模板解析器. 一个最基本的模板解析器,需要有什么功能呢? 读取变量值 解析模板语句 按照这个思路,我们编写一个简单的解析器,需求如下: 读值: <%= 变量名 %> 语句支持: <% if( type == 1 ){ %> good! <%}%> 总体来说,就是如果模板如下: 我叫:<%= name %> <br/&

Java环境变量理解及配置

环境变量理解 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等. 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找.用户通过设置环境变量,来更好的运行进程. JAVA环境变量配置

整理ECMall模板解析语法与机制

在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词就是标签名.在标签单元中单词前含"$"(美元符)的为变量名. 资源引用 res标签 功能:返回当前模板当前风格目录的url路径 实例:{res file=css/ecmall.css}这个标签在模板编译后将变成http://商城域名/themes/default/styles/default,注意末尾没有"/",返回结果会

Django 模板中 变量 过滤器 标签 的使用方法

一.变量 1.变量的形式是:{{variable}}, 当模板引擎碰到变量的时候,引擎使用变量的值代替变量.    2.使用dot(.)能够访问变量的属性    3.当模板引擎碰到dot的时候,查找的顺序是什么样子呢?        a.字典查找,例如:foo["var1"]        b.属性查找,例如:foo.bar        c.方法查找,例如:foo.bar()        d.list-index查找,例如foo[bar] 注意:方法查找比一般的查找要复杂一些 (1

Thinkphp入门三—框架模板、变量(47)

原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display()   调用当前操作名称的模板 display(‘名字’)  调用指定名字的模板文件 控制器调用模板四种方式: [在控制器给模板传递变量] 在smarty里边给模板传递变量信息 $smarty -> assign(变量名称,值); 在tp框架里边同样适用assign()给模板传递变量信息 ThinkPHP的模板引擎的左右标记: ThinkPHP/Lib/ Behavior/ ParseTemplateBe

一种简单快速的模板解析方法,活用with javascript版

//一种简单快速的模板解析方法,活用with var parseTpl = function( str, data ) { var tmpl = 'var __p=[];' + 'with(obj||{}){__p.push(\'' + str.replace( /\\/g, '\\\\' ) .replace( /'/g, '\\\'' ) .replace( /<%=([\s\S]+?)%>/g, function( match, code ) { return '\',' + code.

PHP模板解析类实例

作者:mckee 这篇文章主要介绍了PHP模板解析类,涉及php针对模板文件的解析与字符串处理的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 1 <?php 2 class template { 3 private $vars = array(); 4 private $conf = ''; 5 private $tpl_name = 'index'; 6 //如果模板不存在 会查找当前 controller默认index模板 7 private $tpl_suffix = '.html

Flask08 包含(include)、继承(extends)、宏???、模板中变量的来源

1 包含 直接把另一个文件的内容,复制粘贴过来 {% include "模板路径" %} 注意:模板都是放在 templates 这个文件夹下面的,可以在里面新建文件夹来进行分离:    例如:{% include "include/header.html" %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"