使用模板标签可以让网站前台开发更加快速和简单,使用过dedecms、phpcms等内容管理系统的人应该都知道,cms的前台都是使用模板标签来调用数据。以调用文章列表为例:
dedecms可以写成:
1 2 3 4 5 | <ul>
{dede:arclist row= '10' orderby= 'id desc' titlelen= '' }
<li>[field:title]</li>
{/dede:arclist}
</ul>
|
Nach dem Login kopieren
phpcms可以写成:
1 2 3 4 5 6 7 | <ul>
{pc:content action= "hits" catid= "6" num= "10" order= "views DESC" }
{loop $data $r }
<li>{ $r [title]}</li>
{/loop}
{/pc}
</ul>
|
Nach dem Login kopieren
ThinkPHP的自定义标签同样能够实现这样强大的功能。ThinkPHP自定义标签通过TAG扩展库来实现。而ThinkPHP本身就自带了一个tag扩展库只要我们继承TagLib就能随心所遇的定义属于自己的标签。
命名规范:
TagLib+标签库名称.class.php
下面以实现调用导航为例加以说明
文件TagLibNav.class.php如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php
class TagLibNav extends TagLib {
protected $tags = array (
'nav' => array ( 'attr' => 'limit,order' , 'level' => 3, 'close' =>1),
);
public function _nav( $attr , $content ) {
$tag = $this ->parseXmlAttr( $attr , $content );
$cate =M( 'Channel' );
$tb = $cate ->order( $tag [ 'order' ])->limit( $tag [ 'limit' ])->select();
$str = '' ;
for ( $i =0; $i < count ( $tb ); $i ++)
{
$c = str_replace ( array ( "[filed:id]" , "[filed:name]" ), array ( $tb [ $i ][ 'id' ], $tb [ $i ][ 'name' ]), $content );
$str .= $c ;
}
return $str ;
}
}
?>
|
Nach dem Login kopieren
html页面调用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <tagLib name= "nav" />
<html>
<head>
<title>tablist</title>
</head>
<body>
<div class = "nav" >
<ul>
<li>首页</li>
<nav:nav limit= '4' order= 'id asc' >
<li><a href= "[filed:id]" >[filed:name]</a></li>
</nav:nav>
</ul>
</div>
</body>
</html>
|
Nach dem Login kopieren
配置文件:
1 2 | 'APP_AUTOLOAD_PATH' => '@.TagLib' ,
'TAGLIB_BUILD_IN' => 'Cx,Nav' ,
|
Nach dem Login kopieren
控制器:
1 2 3 4 5 6 7 | <?php
class IndexAction extends Action{
public function index() {
$this ->display();
}
}
?>
|
Nach dem Login kopieren
至此实现了自定义标签,在控制器中也不用写很多的代码了。