欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dede自定义标签的代码写法

程序员文章站 2024-02-04 20:23:04
...

标签目录: \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 '[email protected]'"></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

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