织梦静态模板引擎引入文件函数IncludeFile()

admin2020-01-15656

一般人肯定对这个函数不了解,即使用过多年的朋友想必也是如此,包括本人在内,如果不去研究一下织梦底层代码的话,这个可能这辈子都不知道做什么的,这个一点也不夸张,如果你是做前台开发,像模板制作等的。

但是,我说这个函数其实就是我们在织梦模板里经常遇到的{dede:include fielname='' /},大家肯定非常熟悉了对include,只要接触过的朋友一定会知道这个是什么标签,就是引入模反的。其实,我们虽然,不知道有Includefiele()这个函数存在,但是,每当我们用这个标签时,程序就自动调用了这个函数进行解析了一次。

函数IncludeFile()是上面标签里面的标记include的底层代码,这个标签就是由这个函数解析的。

要研究这个函数,我们就要先研究一下标签{dede:include fielname='' /},这样我们一步一步去揭开这个标签的真面目,当我们在模板写好这个标签后,这个标签是通过模板引擎哪些代码来解析的?其实,解析这个标记的代码比较简单,如下所示。

$filename = ($CTag->GetAtt('file')=='' ? $CTag->GetAtt('filename') : $CTag->GetAtt('file') );
$str = $this->IncludeFile($filename,$CTag->GetAtt('ismake'));
$this->CTags[$i]->IsReplace = TRUE;
$this->CTags[$i]->TagValue = $str;

从上面的代码我们知道,这个标签真正是解析是由函数$this->IncludeFile($filename,$CTag->GetAtt('ismake'))来做的,所以,现在我们就要研究一下这个函数又做了什么?

在文件include/dedetag.class.php里面找到这个函数的代码如下所示:

image.png

也就是说上面的标签,最终由这个函数来解析的,我们再研究一下这个函数都做了什么。先判断一下这个引入的文件是否存在,假设我们以标签{dede:include filename="head.htm" /}为例子,当然这里面也可以把filename换成file。若head.htm文件不存在,则返回为空,也就是在模板里面引入的模板文件不存在,则相当于什么也没有引入,因为,这里返回的是空。

接下来就是判断这个引入的模板文件在哪里,若是在根目录,例如 www.dedebase.com/templets/文件夹里面,那么,就把这个文件赋给$okfile,否则,若文件在www.dedebase.com/templets/自定义的模板路径/目录,那么,就把这个目录存入到$okfile里面,若在这二个地方都没有找到,则返回无法在这个位置找到head.htm,从上面的代码可以看出,模板文件只能存入上面二个路径里面,其它地方都不行。

上面是判断函数参数里面的第一个,现在判断第二个,参数是否编译。

若要编译,也就是if($ismake!="no") 那么,就执行这个条件里面的代码,这个条件里面的引入了文件/include/channelunit.func.php和/include/helpers/channelunit.helper.php 并且,实例化了dede模板类,最主要的是这里面调用了给块标记赋值函数MakeOneTag($dtp,$this->refObj) ,然后,显示编译的内容,什么时候编要编译,一般都需要,因为,引入的模反文件一般都有标签,如果我们引入的文件是一个html代码的,那么,直接执行else里面的代码。直接返回引入模板字符串。

关于上面编译函数里面给块赋值函数MakeOneTag($dtp,$this->refObj);我们会做一个专门的教程来详细的分析这个,这个函数比较复杂,虽然,代码不多。


网友评论