织梦后台功能“检测微表正确性并尝试修复”功能详解

admin2023-01-17877

如果看一下这个模板函数的话,你会发现这个表面看上去跟载入模板字符串函数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)这二个只是为兼容旧版本的,所以只需要知道即可。

网友评论