织梦后台功能“检测微表正确性并尝试修复”功能详解
如果看一下这个模板函数的话,你会发现这个表面看上去跟载入模板字符串函数LoadSource($str)没有区别,因为载入模板字符串函数最后把模板字符串存入文件后,再调用载入模板文件函数,好像差不多,但是,实际上我们仔细研究一下他们还是有差别的。
LoadSource($str)函数一般载入的是从数据库查询出来的字符串,而且,这些字符串完全是一个个标签,例如:
<field:dedebase itemname="织梦基地" autofield="1" notsend="0" type="text" isnull="true" islist="1" default="www.dedebase.com" maxlength="250" page=""></field:dedebase>
可以说这个函数载入的字符串,全是没有多余的其它代码的标签字符串,这样的解析起来当然,比其它像templets/default/里面的模板要快的多。这里说的是“一般”是从数据库查询出来的,但是,也有是从文件里读取出来的,例如,织梦后台里面左侧很多菜单就是从文件里读取出的,当然,这是比较特殊的,其它一般都从数据库里读出来的。
函数LoadTemplate($filename)一般载入的是已经是文件的模板,像.htm,.inc,.txt等等后缀的模板文件,这个函数一般不从数据库读内容来载入,看看上面的载入模板字符串函数就知道,最后,还是调用这个载入模板函数。这是它们二个的最主要区别。
函数代码:
function LoadTemplate($filename) { $this->SetDefault(); if(!file_exists($filename)) { $this->SourceString = " $filename Not Found! "; $this->ParseTemplet(); } else { $fp = @fopen($filename, "r"); while($line = fgets($fp,1024)) { $this->SourceString .= $line; } fclose($fp); if($this->LoadCache($filename)) { return ''; } else { $this->ParseTemplet(); } } }
先进行初始化,这里初始化的是:
$this->SourceString = ''; $this->CTags = ''; $this->Count=-1;
这三个变量从这里开始要使用了,所以对这三个进行初始化操作。然后,判断一下载入的模板文件是否存在,若不存在,提示文件不存在信息,存入到$this->SourceString里面,然后,解析这个错误信息。
若载入的模板文件存在,则直接从这个模板文件一行一行的读到$this->SourceString里面,然后,检测模板缓存是否存在,如果存在了,说明这个$this->sourceString已经解析了,也就是模板已经解析了,返回空。若不存在缓存文件,说明这个载入的模板还没有解析,没有解析当然要去解析了,所以,调用模板解析函数ParseTemplet(),也就是上面我们把模板里面的字符串一行一行的读到$this->sourceString里面,解析时就要用到这个。
从上面我们可以推测出缓存文件是解析后,存入到tplcache文件夹里面的,如果不是这样的话,那么,这里就不会通过有没有载入缓存文件来判断,模板文件有没有解析了,有时候我们可以从代码里研究出代码没有告诉我们的东西。
与这个函数功能相同的二个函数:LoadTemplet($filename),LoadFile($filename)这二个只是为兼容旧版本的,所以只需要知道即可。