织梦给属赋性默认值函数FillAttsDefault()

admin2020-01-151054

函数名:FillAttsDefault(&$atts, $attlist)

参数:$attlist  属性列表,$atts  属性

返回值:字符串

所在文件:include/helpers/channelunit.class.php

这个函数是前台标签里面必须要用到的一个函数,只要标签要处理属性就要用到,当然,有的标签没有用到像“获得责任编辑名称”标签,因为,这个标签本来就没有属性,所以,用不到,不管怎么样,只要是处理属性这个必须用到,所以,在我们自己去定义标签时,如果我们自己定义的标签有属性,那么,这个函数就是必须使用的,本教程对这个函数进行分析,目的就是让我们在制作自己的标签时,知道为什么要用这个函数。

这个函数的代码比较简单:

  function FillAttsDefault(&$atts, $attlist)
{
    $attlists = explode(',', $attlist);
    for($i=0; isset($attlists[$i]); $i++)
    {
        list($k, $v) = explode('|', $attlists[$i]);
        if(!isset($atts[$k]))
        {
            $atts[$k] = $v;
        }
    }
}

请注意的是这个函数的第一个参数是取地址符号,所以,这样做的好处是,当处理完后,就像return回了这个结果,因为,这个函数就是处理的标签属性$atts。

第二个参数是属性列表,是我们在写标签时设置的标签的默认属性列表,例如:$attlist="row|6,qtype|new,site|www.dedebase.com,titlelen|24";我们就以这个属性列表为例子,进行分析这个函数。

我们看一下属性列表的结构,每组属性及其值都是以逗号分隔的,然后,每个属性和属性值都是以竖线分隔的,这一点要注意在我们写属性列表时,一定也照送这种格式写,要不然,这个函数是无法处理的,从这个函数我们就知道为什么我们要用逗号分隔,为什么属性和其值之间要用竖线分隔了。

然后,通过函数explode(',',$attlist)把这个字符串,通过逗号分隔成一个一个的数组:

$attlists=array("row|6","qtype|new","site|www.dedebase.com","titlelen|24")

然后,通过for进行遍历这个数组$attlists,遍历出来的每一个$attlists[$i]又是一个字符串,所以,再用一次函数explode('|', $attlists[$i])把属性和属性值分离出来,分别存到$k和$v里面,这个是通过list()函数来实现的, 这个函数非常有用处,像在这里直接就可以把属性和属性值分别存入到不同的变量中。

现在再来判断的一下属性$atts[$k]设置了没有?这里的判断指的是{dede:ask row=6 }底层模板{/dede:ask}标签里面有没有设置$atts['site'] 也就是我们在写标签的时候,如果没有写这个属性$atts['site'],那么,这个函数会自动把默认的site的属性及其值"www.dedebase.com" 赋给$atts['site'],上面的标签就相当于:{dede:ask row=6 site='www.dedebase.com'}底层模板{/dede:ask}。

还有一种情况是{dede:ask row=6 site=NULL}底层模板{/dede:ask} 当然没有人这样写,但是,如果是这种有了属性但值为空,跟上面一样。

若标签{dede:ask row=6 site='dedecms.com'}底层模板{/dede:ask}这样设置,那么,函数就不会去使用默认的site值www.dedebase.com 。

从这里我们也知道了标签默认属性及值的重要性了吧。有了默认的标签属性及其值,当某一属性没有设置时,程序会自动使用默认属性,就是这个函数起的作用。虽然,这个函数代码比较少,但是,功能却比较强。


网友评论