织梦块使用的公共接口函数MakePublicTag()

admin2020-01-02960

函数名:MakePublicTag($atts=array(),$refObj='',$fields=array())

功能:这个函数用于定义任意名称的块使用的接口

参数:  array  $atts  属性

            object  $refObj  所属对象

            array  $fields  字段

返回值:返回值应是一个二维数组

先介绍一下这个函数,其实,这个函数不仅与我们普通的站长无关,就算是二次开发的站长,对于这个函数也完全可以不用知道,因为,这个函数使用的非常少,就像我们学的的有的汉字一样,一辈子用不了几次,这个也是一样,但是,这个函数虽然我们平常用不到,但是,实际上这个函数非常重要,虽然,即使做二次开发的也一般不会去做这个开发,但是,它是块的公共接口。

说接口可能太专业了,毕竟是一个专业术语,不好理解,其实,接口就像我们进入某一地方的一个大门一样,接口就像是门口用来从一个地方到另一个地方。

这个函数到底用在哪里?其实,这个函数用在自由块标记调用类似:

{dede:ask bind='GetArcList' bindtype='class'}
循环代码
{/tag:ask}

在这个块标记里面有一个bind属性,这个属性用来绑定数据源来源函数,我们在上面的标签里面定义了一个数据源GetArclist,但是,若是这个数据源为空时,织梦模板引擎就会调用这个接口函数MakePublicTag()。此时,他就起作用了,这个函数作为一个接口是通向/include/tpllib/文件夹里面的块标记的。

测试一下是不是跟我说的一样,在模板里写入如下标签:

{dede:ask bindtype='class'}
循环代码
{/dede:ask}

编译后的php代码为:

<?php
$atts = array();
$atts['tagname'] = 'ask';
$blockValue = MakePublicTag($atts,$this->refObj,$fields);
if(is_array($blockValue) && count($blockValue) > 0){
foreach( $blockValue as $key=>$fields )
{
?>
循环代码
<?php
}
}
?>

我们看到是不是$blockValue 就是调用这个函数的?是的,这段代码又是哪来的?当然,是织梦模板引擎里面定义好的,我们到模板引擎文件dedetemplate.class.php里面找一找,截图如下所示。

110612s8x0607ic7rlgl8g.png

代码分析开始:

1. 替换掉标记里面的数字,代码是:$atts['tagname'] = preg_replace("/[0-9]{1,}$/", "", $atts['tagname']);

2. 引入块标记使用的块文件,例如本例中块标记为ask,那么,引入的文件就是/include/tpllib/plus_ask.php,对应的代码为:$plusfile = DEDEINC.'/tpllib/plus_'.$atts['tagname'].'.php';

请仔细看一下这行代码,我们发现如果我们想自定义自己的标记,那么,定义的格式是:plus_标记名.php,这是必须的为什么,如果你用别的格式定义,就不会被正确引入,从这里我们可以看出,标记文件名的定义是可以改的,例如,我把这个定义改成dedebase_标记名.php可以吗?当然,可以,但是,include/tpllib/文件夹里面的得全部改成这种格式的,但是,建议不要自己去定义,我们只要知道为什么我们自己定义标记文件名的时候必须是plus_标记名.php这种格式的原因就可以了。

从这个定义我们还可以观察到,块标签:

{dede:ask bindtype='class'}
循环代码
{/dede:ask}

调用的其实是include/tpllib/里面对应的标记,例如,本例子中的plus_ask.php文件,现实你知道了为什么函数是所有块标记的接口了吧。这个函数MakePublicTag()是标签与lus_ask.php之间的桥梁,是一个门口,所以,这个函数叫接口,这样理解就简单多了,当然,这个函数不仅仅是Plus_ask.php的接口,它是所有块的接口,所以,我为什么要做分析织梦源码教程,你只有把织梦的源码弄明白了,你才知道为什么标签这样调用,为什么这个功能要这样写,为什么会有这个函数等等疑问。

3.判断一下plus_ask.php文件是不是存在,若不存在,则返回空,也就是上面的标签将调不出任何内容来,只是返回一个空数组,若没有设置返回类型,直接返回空。

若文件存在,则引入这个文件include_once($plusfile);

4.下面二行代码窄一看上去,好像很难理解:

$func = 'plus_'.$atts['tagname'];
return $func($atts, $refObj, $fields);

实际上这二行就是定义返回一个标记函数,例如本例子中的plus_ask.php,这二行代码就是返回return plus_ask($atts, $refObj, $fields)。这个plus_ask($atts, $refObj, $fields)在哪里?其实,这个就是plus_ask.php里面的一个函数,也就是说,这二行代码定义了一个返回plus_ask.php里面的一个函数,而这个函数的名称刚好与plus_ask.php里面的plus_ask重名罢了。

网友评论