美文网首页
dede自定义标签的代码写法

dede自定义标签的代码写法

作者: 亚讯 | 来源:发表于2019-05-15 15:12 被阅读0次

    标签目录: \include\taglib

    taglib文件夹是所有的dede标签。
    在taglib目录下新建一个文件data.lib.php(data为标签名称,lib为dede固定格式)

    if(!defined('DEDEINC')) exit('Request Error!');//判断常量是否存在,这行代码可有可无
    lib_data(&ctag,&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

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

    相关文章

      网友评论

          本文标题:dede自定义标签的代码写法

          本文链接:https://www.haomeiwen.com/subject/iibpaqtx.html