我也没用过这个功能,就看了下手册,我就把我理解的东西写出来给大家看看吧
首先,自定义标签库应该位于 Thinkphp/Extend/Driver/TagLib 目录下
第一步:新建标签类库文件名为 TagLibTest.class.php ,手册中没讲文件命名方式,我猜应该是这样的,Test为自定义标签库名。
第二步:编辑刚才建的类库文件,新建一个类,集成TagLib父类
class TagLibTest extends TagLib{
}
第三步:在类中声明一个protected成员变量$tags
class TagLibTest extends TagLib{
protected $tags =array(
' article '=>array(' attr '=>'num,typeid',' close '=>'1'),
/*
这里$tags数组内,每个单元也就是每一行代表一个标签,例如{dede:article},我们这里也定义了一个article,在test标签库里,所以就是{Test:article}, 然后每一行标签的键值就是标签名,value呢也是一个数组,该数组包含两个单元,第一个就是attr,就是标签中得属性,以逗号分隔,如num, typeid等等,close的值如果是0的话就是闭合标签,1的话就是不闭合,意思是要以{/Test}来结尾。
*/
);
}
第四步:定义了标签后,我们需要实现标签的功能,这里直接在类文件下声明一个函数,以_开头,以标签名 article 结尾的函数名
public function _article($attr,$content){
/*
$attr这个参数代表的就是标签中得attr,标签属性;
$content这个在close=1的时候有用,即 {test:article}.....$content..... {/test:article}标签中包含的内容
*/
$tag = $this -> parseXmlAttr ( $attr , 'article' ); //这一步强制的,就是将article标签的attr解析出来,取得标签每个参数的值
$num=$tag['num'];
$typeid=$tag['typeid']; //就是这样,取得了num值和typeid值,{test:article num='9' typeid='1'}......{/test:article}
/*
理论上到了这里我们就开始处理信息然后直接return一个字符串就OK了,但是为了实现该标签下循环取数据,还得稍微做点工课
假设我们标签中的content是类似dede的这种[field.字段]的方式{test:article num='9' typeid='1'}文档ID: [filed.id] , 文档名: [field.name] <br>{/test:article},我们下面开始实现循环
*/
$article=M('Article'); //实例化文章表的模型
$arts=$article->where("typeid=$typeid")->limit("0,$num")->select(); //根据传进来的typeid和num查询表
$str=""; //初始化str变量,最后返回用的
//
//重点来了,我们对结果集做一个循环
for($i=0;$i<count($arts);$i++){
$c=str_replace( array("[filed.id]","[filed.name]") , array($arts[$i]['id'],$arts[$i]['name']) , $content ); //将content中得[filed.xx]替换成结果集中的变量
$str.=$c; //将替换后的字符串拼接到$str
}
//
//
return $str;//将处理完毕的字符串返回,也就是输出到模板中
}
第五步:使用自定义标签
首先你得在模板中引入你得自定义标签库 <taglib name = 'Test' />
建议使用一个单独的模板文件,用于自定义标签库的声明,include包含即可,方便管理
标签的使用:
<Test:article num=10 typeid=2>
文档ID:[filed.id] <br>
文档名:[filed.name]<br>
</Test:article>
首先,自定义标签库应该位于 Thinkphp/Extend/Driver/TagLib 目录下
第一步:新建标签类库文件名为 TagLibTest.class.php ,手册中没讲文件命名方式,我猜应该是这样的,Test为自定义标签库名。
第二步:编辑刚才建的类库文件,新建一个类,集成TagLib父类
class TagLibTest extends TagLib{
}
第三步:在类中声明一个protected成员变量$tags
class TagLibTest extends TagLib{
protected $tags =array(
' article '=>array(' attr '=>'num,typeid',' close '=>'1'),
/*
这里$tags数组内,每个单元也就是每一行代表一个标签,例如{dede:article},我们这里也定义了一个article,在test标签库里,所以就是{Test:article}, 然后每一行标签的键值就是标签名,value呢也是一个数组,该数组包含两个单元,第一个就是attr,就是标签中得属性,以逗号分隔,如num, typeid等等,close的值如果是0的话就是闭合标签,1的话就是不闭合,意思是要以{/Test}来结尾。
*/
);
}
第四步:定义了标签后,我们需要实现标签的功能,这里直接在类文件下声明一个函数,以_开头,以标签名 article 结尾的函数名
public function _article($attr,$content){
/*
$attr这个参数代表的就是标签中得attr,标签属性;
$content这个在close=1的时候有用,即 {test:article}.....$content..... {/test:article}标签中包含的内容
*/
$tag = $this -> parseXmlAttr ( $attr , 'article' ); //这一步强制的,就是将article标签的attr解析出来,取得标签每个参数的值
$num=$tag['num'];
$typeid=$tag['typeid']; //就是这样,取得了num值和typeid值,{test:article num='9' typeid='1'}......{/test:article}
/*
理论上到了这里我们就开始处理信息然后直接return一个字符串就OK了,但是为了实现该标签下循环取数据,还得稍微做点工课
假设我们标签中的content是类似dede的这种[field.字段]的方式{test:article num='9' typeid='1'}文档ID: [filed.id] , 文档名: [field.name] <br>{/test:article},我们下面开始实现循环
*/
$article=M('Article'); //实例化文章表的模型
$arts=$article->where("typeid=$typeid")->limit("0,$num")->select(); //根据传进来的typeid和num查询表
$str=""; //初始化str变量,最后返回用的
//
//重点来了,我们对结果集做一个循环
for($i=0;$i<count($arts);$i++){
$c=str_replace( array("[filed.id]","[filed.name]") , array($arts[$i]['id'],$arts[$i]['name']) , $content ); //将content中得[filed.xx]替换成结果集中的变量
$str.=$c; //将替换后的字符串拼接到$str
}
//
//
return $str;//将处理完毕的字符串返回,也就是输出到模板中
}
第五步:使用自定义标签
首先你得在模板中引入你得自定义标签库 <taglib name = 'Test' />
建议使用一个单独的模板文件,用于自定义标签库的声明,include包含即可,方便管理
标签的使用:
<Test:article num=10 typeid=2>
文档ID:[filed.id] <br>
文档名:[filed.name]<br>
</Test:article>