dede自定义标签的代码写法
标签目录: \include\taglib
taglib文件夹是所有的dede标签。
在taglib目录下新建一个文件data.lib.php(data为标签名称,lib为dede固定格式)
if(!defined('DEDEINC')) exit('Request Error!');//判断常量是否存在,这行代码可有可无
lib_data(&refObj) //data为标签名称 $ctag为获取dede模板。
使用sql语句查询时注意关闭安全检测,如若不关闭最新版会报‘错误步骤’
标签中函数中不可输出,只能return.
<?php
if(!defined('DEDEINC')) exit('Request Error!');
function lib_bdata(&$ctag,&$refObj){
global $dsql;//获取sql变量
$attlist = "date|".date('Ymd');//属性默认值 "属性|默认值,属性|默认值"
FillAttsDefault($ctag->CAttribute->Items,$attlist);//处理属性
extract($ctag->CAttribute->Items);//extract函数获取属性变量,也可以直接使用$ctag->CAttribute->Items['属性']
$innertext = $ctag->GetInnerText();//获取底层模板,标签实在哪个地方就获取那个地方的模板
$ctp = new DedeTagParse();//处理底层模板中的变量
$ctp->SetNameSpace('field', '[', ']');//显示方式,例如[field:.../]<br>
$sql = 'select * from dede_archives';//sql查询
$dsql->safeCheck = false;//关闭sql验证,如若不关闭新版会报错
$dsql->Execute('me',$sql);//执行sql;
$str = '';
$ctp->LoadString($innertext);//载入模板中的字符串
while($value = $dsql->GetArray('me')){
if(is_array($ctp->CTags))://判断是否存在模板标记
foreach($ctp->CTags as $k=>$ctag):
if($ctag->GetName()=='array'){//可无
//传递整个数组,在runphp模式中有特殊作用
$ctp->Assign($k,$ctag);
} else {
if(!empty($value[$ctag->GetName()]))://判断标记是否存在
$ctp->Assign($k,$value[$ctag->GetName()]);//给输出到模板中的变量赋值
else:
$ctp->Assign($k,'');//设置为空,如若不设置,下面值如果为空,将输出的是上次值。
endif;
}
endforeach;
endif;
$str .= $ctp->GetResult();//处理模板
}
return $str;
}
使用
{dede:data date='20140704'}
[field:id /]<!--id可以为数据库任意字段名称-->
{/dede:data}
在模板标签中使用判断:
{dede:data runphp='yes'}
[field:id runphp='yes']
if(@me != '' || @me != 0)
@me = '<div class="national_flag '.@me.'"></div>';
else
@me = '';
[/field:id]
{/dede:data}
用到的函数代码分析:
函数名: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.msmpp.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 。
从这里我们也知道了标签默认属性及值的重要性了吧。有了默认的标签属性及其值,当某一属性没有设置时,程序会自动使用默认属性,就是这个函数起的作用。虽然,这个函数代码比较少,但是,功能却比较强。