自定义标签的之前,先看看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>