自定义标签的之前,先看看Think PHP自己是如何自定义标签的:

具体位置:ThinkPHP / Library / Think / Template / TagLib / Cx.class.php

可以看一个 foreach 标签是如何写的:

<?php
namespace ThinkTemplateTagLib;
use ThinkTemplateTagLib;
/**
 * CX标签库解析类
 */
class Cx extends TagLib {
    // 标签定义
    protected $tags   =  array(
        // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次        
        'foreach'   =>  array('attr'=>'name,item,key','level'=>3)
    );
    /**
     * foreach标签解析 循环输出数据集
     */
    public function _foreach($tag,$content) {
        $name       =   $tag['name'];
        $item       =   $tag['item'];
        $key        =   !empty($tag['key'])?$tag['key']:'key';
        $name       =   $this->autoBuildVar($name);
        $parseStr   =   '<?php if(is_array('.$name.')): foreach('.$name.' as $'.$key.'=>$'.$item.'): ?>';
        $parseStr  .=   $this->tpl->parse($content);
        $parseStr  .=   '<?php endforeach; endif; ?>';

        if(!empty($parseStr)) {
            return $parseStr;
        }
        return ;
    }
}

下面说下自定义标签:

第一步:修改:修改Application/Common/conf/config.php

增加如下一条配置;
‘TAGLIB_BUILD_IN’ => ‘Cx,CommonTagMy’, //加载自定义标签

<?php
return array (
  'TAGLIB_BUILD_IN' => 'Cx,Common\Tag\My',
);
?>

cx是内置的标签库,CommonTagMy是自定义的标签库位置;

示例是在Application/Common/Tag目录下建的My.class.php

第二步:

新建My.class.php文件

命名空间要和配置项中填写的一致;如下图;

<?php
namespace CommonTag;
use ThinkTemplateTagLib;
class My extends TagLib{
    
};

标签分为两种:

闭合标签就是单标签;比如a标签、img标签等等;

非闭合标签就是对标签;比如div、p标签等等;

我写的标签:

<?php
namespace CommonTag;
use ThinkTemplateTagLib;
class My extends TagLib{
    // 定义标签
    protected $tags = array(
        'topcates'=> array('attr'=>'limit')
    );
    public function _topcates($attr,$content){
        //调用父类
        $limit = isset($attr['limit']) ? $attr['limit'] : '';
        // 组合PHP代码的字符串
        $str = '<?php ';
        $str .= '$where = array("pid" =>0);';
        $str .= '$_topcatesResult = M("category")->where($where)->limit('.$limit.')->select();';
        $str .= 'foreach($_topcatesResult as $v):';
        $str .= 'extract($v);?>';
        $str .= $content;
        $str .= '<?php endforeach;?>';
        return $str;
    }
};

标签调用:

<topcates limit='3'>
<li><a href="{:U('List/index',array('id'=>$id))}">{$name}</a></li>
</topcates>