自定义标签的之前,先看看Think PHP自己是如何自定义标签的:
具体位置:ThinkPHP / Library / Think / Template / TagLib / Cx.class.php
可以看一个 foreach 标签是如何写的:
<?php
namespace Think\Template\TagLib;
use Think\Template\TagLib;
/**
* 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,Common\Tag\My', //加载自定义标签
<?php
return array (
'TAGLIB_BUILD_IN' => 'Cx,Common\\Tag\\My',
);
?>
cx是内置的标签库,Common\Tag\My是自定义的标签库位置;
示例是在Application/Common/Tag目录下建的My.class.php
第二步:
新建My.class.php文件
命名空间要和配置项中填写的一致;如下图;
<?php
namespace Common\Tag;
use Think\Template\TagLib;
class My extends TagLib{
};
标签分为两种:
闭合标签就是单标签;比如a标签、img标签等等;
非闭合标签就是对标签;比如div、p标签等等;
我写的标签:
<?php
namespace Common\Tag;
use Think\Template\TagLib;
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>
网友评论