dede织梦模板类解析模板替换标签函数GetResult()

admin2023-01-181155

如果没有这个函数,那么,前面的载入模板,解析模板都是和写入缓存等工作都是白费,这个函数是显示数据用的。

函数功能:笼统的讲就是把模板里面的标签替换成这个标签对应的值,若是块标签那就替换成底层模板对应的值,若是短标签则替换成这个标签对应的值。

所在文件:/include/dedetag.class.php

返回值:返回替换后的模板。如果把这个模板的后缀写成xxx.html的话,就是我们添加文章后的静态网站,也就是模板生成的html网页,这就是为什么我们在后台加完内容,点保存后,会生成html网页了,因为,添加文章功能,一定调用这个函数。

这个函数其实与动态模板引擎里面的编译模板CompilerAll()函数功能完全一样,只是替换的内容不一样,动态模板引擎里面替换的是php代码,而静态模板引擎里面替换的是字符串。

代码开始分析:

先判断一下$this->count是否等于-1,若这个等于-1说明模板里没有标签,模板完全是一个html的代码,既然没有标签就相当于一个静态网页,那么,直接返回这个模板内容即可。

        if($this->Count==-1)
        {
            return $this->SourceString;
        }

若有特殊标记,例如:global,include,foreach等,还有模板里有使用{dede:id runphp="yes"}标签,那么,就通过函数$this->AssignSysTag();进行特殊处理。

然后,通过一个for遍历标记的id值$this->Count 也就是标签的个数,来找到模板中的标签,找到标签后,替换标签的值,然后,再向下查询一下找完后,把替换好的模板存入到$ResultString里面。代码如下:

for($i=0;$i<=$this->Count;$i++)
        {
            $ResultString .= substr($this->SourceString,$nextTagEnd,$this->CTags[$i]->StartPos-$nextTagEnd);
            $ResultString .= $this->CTags[$i]->GetValue();
            $nextTagEnd = $this->CTags[$i]->EndPos;
        }

这个替换方法跟动态模板引擎里面的方法完全一样,这个方法我已经在分析动态模板引擎编译函数时,已经分析过了。如果还是不太清楚的请看教程“编译模板CompilerAll()函数” http://www.dedebase.com/thread-208-1-2.html 。

在这一段代码里面有$this->CTags[$i]->GetValue()这样一行代码,它的作用是把获取标签的值,分二种情况,一种是短标签的值,一种是块标签里面的底层模板的值;这些值是如何获取的?

这个是通过函数Assign($i,$str)里面的$this->CTags[$i]->TagValue = $str,得到的,也就是说$str就是这个标签的值或块标签里面的底层模板的值,这一点是模板引擎的核心中的核心。只要是织梦基地做的教程都会重点突出,主次分明,让大家知道哪些是重点,哪些只是了解。

下面这一段函数的作用是:把最后一个标签后的html代码加到模板里面,因为,我们的标签一般不是在最后的,这样,最后一个标签后面就有很多html代码,如果不加上这个模板字符串就是不完整的。

          $slen = strlen($this->SourceString);
        if($slen>$nextTagEnd)
        {
            $ResultString .= substr($this->SourceString,$nextTagEnd,$slen-$nextTagEnd);
        }

最后,返回这个结果。

这个函数在多个函数里面被调用,例如:显示数据函数Display()、把解析模板输出为文件saveTo($filename)函数,这个就是生成静态网页用的一个函数。


网友评论