## **ThinkPHP自定义标签的使用总结** ##
- 打开TagLib**.class.php文件,定义好类库类名并继承TagLib基类。
- 只有类库没有标签是没有意义的,接下来就是制作标签
- 例一:
<?php
class TagLibMy extends TagLib{
protected $tags = array(
"logo"=>array("attr"=>"id,size",'close'=>0),
);
}
?>
- 这样,就定义好了一个名为logo的标签,里面有id,size等属性,close为0代表是闭合标签,1为不闭合。
- 接下来,就要定义标签的处理方法。该方法需要使用parseXmlAttr将数组解析成XML数据,如以下代码所示:
public function _logo($attr,$content){
$attr = $this->parseXmlAttr($attr);
//$tag = $this->parseXmlAttr($attr, 'logo');两种方式都可以
$id = !empty($tag['id']) ? $tag['id']: '_logo';
$size = $tag['size'];
switch ($size){
case "big":
$str='<img name="logo" src="./Public/images/logo_big,jpg"
width="200" height="140" alt="网站大logo">';
break;
case "small":
$str='<img name="logo" src="./Public/images/logo_small,jpg"
width="100" height="70" alt="网站小logo">';
break;
defalut:
$str="size参数有:big、small";
}
return $str;
}
- 如上述代码所示,标签的处理方法命名规则为”_标签名”,这是系统规范。接下来,就是在模板中使用了
<my:logo id ="index_logo" size="big">
- 例二:
<?php
/**
* 自定义标签库
*/
Class TagLibHd extends Taglib{
protected $tags = array(
'nav' => array('attr'=>'order'),
'hot' => array('attr'=>'limit'),
);
public function _nav($attr,$content){
$attr = $this->parseXmlAttr($attr);
$str = <<<str
<?php
\$_nav_cate = M('cate')->order("{$attr['order']}")->select();
import('Class.Category',APP_PATH);
\$_nav_cate = Category::unlimitedForlayer(\$_nav_cate);
foreach(\$_nav_cate as \$_nav_cate_v):
extract(\$_nav_cate_v);
\$url = U('/c_'.\$id);
?>
str;
$str .= $content;
$str .= '<?php endforeach ?>';
return $str;
}
public function _hot($attr,$content){
$attr = $this->parseXmlAttr($attr);
$limit = $attr['limit'];
$str ='<?php ';
$str.='$fields = array("id","title","click");';
$str.='$_hot_blog = M("blog")->field($fields)->limit(
'.$limit.')->order("click desc")->select();';
$str.='foreach($_hot_blog as $_hot_blog_value):';
$str.='extract($_hot_blog_value);';
$str.='$url = U("/".$id);?>';
$str.=$content;
$str.='<?php endforeach?>';
return $str;
}
}
?>
<nav order='sort'>
<li class='nav-lv1-li'>
<a href="{$url}" class='top-cate'>{$name}</a>
<ul>
<foreach name='child' item='v'>
<li><a href="{:U('/c_'.$v['id'])}">{$v.name}</a></li>
</foreach>
</ul>
</li>
</nav>
- 标签处理方法中的参数
$attr,$content
都不能省略。 例二和例一中不同的是例二的标签处理方法 _nav 中里面有php代码段,代码段中的必须在变量前加”\”,不然会出错。
以上两个例子均引用自他人,第一个引用自《PHP MVC 开发实战》李开涌编著,第二个引用自后盾网黄永成老师的教程视频。