函数名:WriteCache($ctype='all')
参数:string$ctype缓存类型
功能:把模板引擎编译好的内容缓存到/data/tplcache/里面
所在文件:/include/dedetemplate.class.php
以前对模板引擎的缓存内容理解有误,直接做了一个后台二次开发的实例后,才把这个突然发现自己在载入模板时,理解有错误,当然,感觉这个写入缓存文件函数比较简单,也确实比较简单,但是,简单的综合起来后,就有难度了。本教程对这个函数分析一下,在后面显示数据函数display()就使用了这个函数,从这里显示数据函数就可以知道,当把模板里面的标签全部替换成php代码后,才调用这个写入缓存文件的。
在这个函数里面最核心的就是:把编译好的模板文件写入到缓存文件里面,就这一点内容,其它都是为这个作准备,用到的php函数也就是打开文件fopen(),写入内容fwrite(),关闭打开的文件fclose()。
代码分析开始:
要把内容写入缓存文件$this->cacheFile,只有下面任何一条成立就要写入缓存文件:
1.缓存文件$this->cacheFile不存在的情况。除非我们在后台设置不缓存文件,否则,只要文件不存在当然,就要写入缓存文件了。
2.若$this->isCache==FALSE,也就是不开启缓存文件。
3.模板文件的修改时间比对应的缓存文件时间要大,这时就要写入缓存。
只要上面这三条中的任何一条,成立,那么,我们就要写入缓存文件,然后,保存到/data/tplcache/文件夹里面。
函数里面这个大条件成立,则判断里面的一个一个的小条件。
条件判断:
因为,默认的情况下$this->isParse等于false,只有当解析模板时,这个值才变为true,所以,这里判断一下,如果这个值为false说明还没有解析模板,既然,模板都没有解析,那么,就不可能去缓存文件,因为,模板里面的标签还没有被编译成php代码。所以,若$this->isParse为false,则解析模板。if(!$this->isParse)
{
$this->ParseTemplate();
}
因为,默认的情况下$this->isParse等于false,只有当解析模板时,这个值才变为true,所以,这里判断一下,如果这个值为false说明还没有解析模板,既然,模板都没有解析,那么,就不可能去缓存文件,因为,模板里面的标签还没有被编译成php代码。所以,若$this->isParse为false,则解析模板。$fp = fopen($this->cacheFile,'w') or dir("Write Cache File Error! ");
flock($fp,3);
$result = trim($this->GetResult());
$errmsg = '';
if (!$this->CheckDisabledFunctions($result, $errmsg))
{
fclose($fp);
@unlink($this->cacheFile);
die($errmsg);
}
fwrite($fp,$result);
fclose($fp);
<?php
if(!isset($GLOBALS['_vars'])) $GLOBALS['_vars'] = array();
$fields = array();
?>
因为,我们模板里面用到的标记经常global,field,特别是标签{dede:datalist}{/dede:datalist}中间全用的是fields,所以,这里定义了这二个为数组。
作用函数CheckDisabledFunctions():检查是否存在禁止的函数,这些被禁止的函数,可以在后台[系统基本设置]中的“其他选项”中进行设置,如下图所示。这段代码是:
若模板中有禁用函数,则删除这个缓存文件,关闭文件显示错误信息,并结束程序。否则,写入缓存文件,然后,关闭打开的文件。
若在模板中使用配置标签{dede:config name=""value=""/},那么,把这个配置文件写入缓存配置文件里面,缓存起来。
要判断有没有模板中有没有使用配置标签,只需要判断数组$this->tpCfgs这个值是否为0,因为,配置标签编译内容都存在在这个数组里面。若有值,则说明有这个配置标签,那么,就要在data/tplcache/里面建立这个缓存文件,并写入类似如下代码内容:
<?php
$this->tpCfgs['www.ys720.com']="元素模板";
?>
函数结束,其实,这个函数就是做了二件事,一是把一般的标签的缓存文件写入到data/tplcache/里面;二是把配置标签写入缓存目录里面。