dedetemplate.class.php文件分析

来源:互联网 发布:yum配置文件详解 编辑:程序博客网 时间:2024/06/06 20:23

dedetemplate.class.php - 也是模板解析文件,同 dedetag.class.php 不同,它是 "解析式",会将模板中的标签,都解析为 "动态的php代码";而 dedetag.class.php是 '编译式',它的整个过程更类似是作者自己写了个编译器,直接将标签,生成了 '纯HTML'。


几天前总结了半截,做其他的了,结束的有点潦草。。。


文件包含的函数:
MakePublicTag()
FillAtts()
FillFields()
private_rt()

文件包含的类,同dedetag.class.php很类似:
Tag - 标记的数据结构描述
DedeTemplate - 模板解析类 
TagAttribute - 属性描述操作类
TagAttributeParse - 属性解析类
主讲DedeTemplate解析类,其他3个也很简单,可查看dedetag.class.php,变化不大


DedeTemplate类分析:
__construct($templatedir='',$refDir='')
初始化几个变量:
$templateDir - 模板目录
$refDir - 模版include目录,支持配置的风格目录($cfg_df_style)
$cacheDir - 模板缓存目录
SetObject(&refObj)
设定本类自身实例的类引用和使用本类的类实例(如果在类中使用本模板引擎,后一参数一般为$this)
通俗的说:就是在哪个类中调用了 Dedetemplate 类,就传入那个类
SetVar($k, $v)
$GLOBALS['_vars'][$k] = $v;// 设定Var的键值对
Assign($k, $v)
$GLOBALS['_vars'][$k] = $v;// 设定Var的键值对(怎么同上。。)
SetArray($k, $v)
$GLOBALS[$k] = $v;// 设定数组
SetTagStyle($ts='{dede:',$ftend='{/dede:',$stend='/}',$tend='}')
设置标记风格,开始标记,单标签结束,块标签结束,块标签闭合

GetConfig($k)

获取$this->tpCfg变量的值,自定义配置标签的值{tag:config name='' value=''}

LoadTemplate($tmpfile)
检测缓存是否开启,失效等,读取模板字符串到 sourceString 中,得到缓存文件-'.inc'和缓存配置文件-'_config.inc')
LoadString($str='')
加载模板字符串(得到缓存文件和缓存配置文件,前缀是 'string_')
CacheFile()
调用此函数include一个编译后的PHP文件,通常是在最后一个步骤才调用本文件
Display()
显示内容,由于函数中会重新解压一次$GLOBALS变量,所以在动态页中,应该尽量少用本方法,取代之是直接在程序中 include $tpl->CacheFile(),不过include $tpl->CacheFile()这种方式不能在类或函数内使用
SaveTo($savefile)
引入解析后的php缓存,使用ob输出控制函数,解析后的html保存下来,生成纯静态页面(得清楚,缓存文件,是模板解析后替换的php和html混编的文件。这里是文件执行后,生成的纯html文件,输出到我们指定的一个文件中)
CheckDisabledFunctions($str,&$errmsg='')
检查传入的$str字符串中,是否存在禁止的函数(检测的机制,使用了 'tokenizer' 扩展,我专门写了tokenizer扩展的文章,大家可了解下这个机制)
WriteCache($ctype='all')
1.将解析后的模板字符串,写入到 '.inc' 后缀的缓存文件中
2.如果我们使用了 'config' 的标签(用来自定义变量),得将我们针对这个模板自定义的变量也保存起来。这样调用缓存时,这些变量的值,我们就需要从该变量配置文件中的到
GetEncodeStr($tmpfile)
获得模板文件名的md5字符串,在生成缓存文件和缓存配置文件调用
ParseTemplate()
解析模板,解析过程类似dedetag.class.php中模板的解析,解析后也是生成一个cTags数组,但是未写入缓存中。会调用 'compilerAll()',编译替换了标签的到模板字符串,在此调用 'parseTemplate',直到所有标签被彻底解析完毕
CompilerAll()
最大调用10次,防止出现错误,陷入死循环。里面调用了一个关键方法 'CompilerOneTag()',循环对cTags标签数组,进行标签的解析并替换
GetResult()
得到最终的模板解析后的字符串(html和php混编)
CompilerOneTag(&$cTag)
解析单个标签,各个类型的标签。


// 下面几个都是 'CompilerOneTag' 里需要调用的
CompilerArrayVar($vartype, $varname)
CompilerIf($cTag)
TrimAtts($v)
CompilerFunction($funcstr, $nvalue)
CompilerInclude($filename, $isload=TRUE)


统计下可用的标签:
config - 自定义的配置变量,如果生成缓存,会存储到 '_config.inc' 缓存文件中
global
cfg
name
object
var
field
key数字
value数字
if数字
echo
php
array数字
include
label
datalist - 分页每页展示的数据列表($this->refObj->datalist,调用dedetemplate模板解析的class的datalist方法)
pagelist - 分页下方展示的分页导航链接($this->refObj->$bindFunc,调用dedetemplate模板解析的class的pagelist方法))
其它标签(bind=''),调用 'include/tpllib/plus_标签名'
其它标签(bind!=''),调用 '$this->refObj->$bindFunc' (调用dedetemplate模板解析的class的$bindFunc方法)













0 0
原创粉丝点击