🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 知识点 1、简单介绍 2、准备工作 3、热门文章 4、本站推荐 5、最新文章 ## PHP在定界符里用变量和常量 **在定界符里用变量注意点**: 如果变量前有\号 或者 变量是在定界符里面新声明的,要在变量前多加一个\作转义符 **在定界符里用常量**: 先在定界符外,将要用的常量赋值给变量,然后在定界符里面用变量即可 参考内容:https://blog.csdn.net/ltx06/article/details/79024669 ## 一、自定义标签简介 ### 1、我的理解 类似于通用函数,便于根据需要调用。如:调用某分类下的文章列表,只需要传入分类ID即可,不需要每次都写很多代码。简化代码,使用方便。 与html标签类似,只要添加数据,即可展示出来 分为:闭合标签和非闭合标签 ~~~ 闭合标签:<article name="" /> 非闭合标签:<article name="">....</article> ~~~ ### 2、官方理解 内置的模板引擎除了支持普通变量的输出之外,更强大的地方在于标签库功能。 标签库类似于Java的Struts中的JSP标签库,每一个标签库是一个独立的标签库文件,标签库中的每一个标签完成某个功能,采用XML标签方式(包括开放标签和闭合标签)。 标签库分为内置和扩展标签库,内置标签库是Cx标签库。 Cx标签库:\thinkphp\library\think\template\taglib\Cx.php ### 3、参考网址 标签扩展(推荐) https://www.kancloud.cn/manual/thinkphp5/185286 标签库 https://www.kancloud.cn/manual/thinkphp5/125015 ThinkPHP自定义模板标签详解 http://www.thinkphp.cn/topic/6258.html thinkphp5 tablib标签库自定义 https://blog.csdn.net/panxiong91/article/details/52059089 自定义TagLib标签库 https://www.kancloud.cn/thinkphp/thinkphp5-guide/115466 自定义标签alert https://www.kancloud.cn/w113211/killall/245642 Thinkphp5的自定义标签 http://www.php.cn/php-weizijiaocheng-399626.html ### 4、代码例子 模板标签让网站前台开发更加快速和简单,这让本该由程序猿才能完成的工作,现在只要稍懂得HTM的人也能轻易做到,这也就是模板标签的强大之处。 接触过dedecms或者phpcms等内容管理系统的人都知道,cms的前台都是使用模板标签来调用数据,如列表,内容。 来看一个phpcms v9调用数据排行列表的标签: ~~~ {pc:content action="hits" catid="6" num="10" order="views DESC"} {loop $data $r} <li><a href="{$r[url]}" title="{$r[title]}">{$r[title]}</a></li> {/loop} {/pc} ~~~ 说明: pc大括号的的参数形式是: {pc:content 参数名=”参数值” 参数名=”参数值” 参数名=”参数值”} action:本参数的值表示为操作事件,模型类PC标签必须使用包含本参数,以说明要进行的操作。 catid:获取频道栏目的ID,和该栏目的数据 num:获取记录的条数,最后会被模板引擎处理成limit传送到处理函数中。 order:表示数据列表的排序方式 上面那段phpcms模板模签的功能就是获取ID等于6的栏目的10条数据,然后按照点击量排序。 不过上面的因为PHPCMS V9已经是一个成熟的CMS,它的模板标签是已经定义好的了,如"pc","num"等标签, 我们只能通过阅读PHPCMS V9的使用文档来学习如何调用,而不可以更改它的名称, 而ThinkPHP只是一个框架,每个开发者都可以通过自定义模板标签来简化数据的调用方式。 ## 二、准备工作 ### 1、新建taglib文件夹 位置:前台index模块下 application\index\taglib ### 2、新建article.php 位置:taglib文件夹下 application\index\taglib\Article.php 这个文件与热门文章调用有关 ### 3、编写Article.php ~~~ <?php namespace app\index\taglib; use think\template\TagLib; /** * 自定义标签 文章相关 */ class Article extends TagLib{ // $tags 标签的具体名称 // 标签定义 attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 // <a href=""></a>(闭合标签) protected $tags = [ 'hot' => ['attr' => 'catid', 'close' => 0], //1非闭合标签(默认1) ,0闭合 ]; // 每个标签对应一个函数,函数返回html代码 // hot标签解析 public function tagHot($tag) { return '自定义标签'; } } ?> ~~~ 备注:具体方法见(四、热门文章) ### 4、调用自定义标签 用这个标签:{Article:hot catid="0" /} 替换以下代码: ~~~ <aside class="widget widget_hot_post"> <h3 class="widget-title"><i class="fa-bars fa"></i>热门文章</h3> <div id="hot_post_widget"> <ul> {volist name="article_hot" id="vo"} <li><span class="li-icon li-icon-{$key+1}">{$key+1}</span><a href="#">{$vo.title}</a></li> {/volist} </ul> </div> </aside> ~~~ 这就叫自定义标签,怎么样,是不是简单了很多,对吧?! ### 5、加载自定义标签 如果不是内置标签库,需要在配置文件中修改。 位置:\application\config.php ~~~ // +---------------------------------------------------------------------- // | 模板设置 // +---------------------------------------------------------------------- 'template' => [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 'view_path' => '', // 模板后缀 'view_suffix' => 'html', // 模板文件名分隔符 'view_depr' => DS, // 模板引擎普通标签开始标记 'tpl_begin' => '{', // 模板引擎普通标签结束标记 'tpl_end' => '}', // 标签库标签开始标记 'taglib_begin' => '{', // 标签库标签结束标记 'taglib_end' => '}', 'taglib_pre_load' => 'app\index\taglib\Article', ], ~~~ ### 6、官方例子 网址参考:https://www.kancloud.cn/manual/thinkphp5/185286 ~~~ /** * 这是一个非闭合标签的简单演示 */ public function tagOpen($tag, $content) { $type = empty($tag['type']) ? 0 : 1; // 这个type目的是为了区分类型,一般来源是数据库 $name = $tag['name']; // name是必填项,这里不做判断了 $parse = '<?php '; $parse .= '$test_arr=[[1,3,5,7,9],[2,4,6,8,10]];'; // 这里是模拟数据 $parse .= '$__LIST__ = $test_arr[' . $type . '];'; $parse .= ' ?>'; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } ~~~ 非闭合标签模板调用 ~~~ {Article:open name='my' type='1'} {$key}=>{$my}<br> {/Article:open} ~~~ 编译解析代码: ~~~ <?php $test_arr=[[1,3,5,7,9],[2,4,6,8,10]]; $__LIST__ = $test_arr[1]; if(is_array($__LIST__) || $__LIST__ instanceof \think\Collection || $__LIST__ instanceof \think\Paginator): $i = 0; $__LIST__ = $__LIST__; if( count($__LIST__)==0 ) : echo "" ; else: foreach($__LIST__ as $key=>$my): $mod = ($i % 2 ); ++$i; ?> <?php echo $key; ?> => <?php echo $my; ?> <br> <?php endforeach; endif; else: echo "" ;endif; ?> ~~~ 闭合标签例子: ~~~ /** * 这是一个闭合标签的简单演示 */ public function tagClose($tag) { $format = empty($tag['format']) ? 'Y-m-d H:i:s' : $tag['format']; $time = empty($tag['time']) ? time() : $tag['time']; $parse = '<?php '; $parse .= 'echo date("' . $format . '",' . $time . ');'; $parse .= ' ?>'; return $parse; } ~~~ **闭合标签模板调用:**{Article:close time="" format=""} **解析成下面的代码:** <?php echo date("Y-m-d H:i:s",1533212790); ?> 备注:自定义标签可以拼接动态代码、其它内置的标签,还可以拼接html代码 ## 三、热门文章 ### (一)原代码 #### 1、控制器 ~~~ $article_hot = Db::name('article')->field('id,title')->limit(8)->order('views desc')->select(); $this->assign('article_hot',$article_hot); ~~~ #### 2、模板 ~~~ <aside class="widget widget_hot_post"> <h3 class="widget-title"><i class="fa-bars fa"></i>热门文章</h3> <div id="hot_post_widget"> <ul> {volist name="article_hot" id="vo"} <li><span class="li-icon li-icon-{$key+1}">{$key+1}</span><a href="#">{$vo.title}</a></li> {/volist} </ul> </div> </aside> ~~~ ### (二)自定义标签代码 #### 1、标签定义 ~~~ protected $tags = [ 'hot' => ['attr' => 'catid','close' => 0], // 0闭合标签 ,1不闭合(默认) 'close' => ['attr' => 'time,format', 'close' => 0], // 闭合标签 'open' => ['attr' => 'name,type', 'close' => 1], // 非闭合标签 ]; ~~~ #### 2、标签解析 ~~~ public function tagHot($tag) { if(empty($tag['catid']) || $tag['catid']=='0'){ $where = ''; }else{ $where = "catid=" . $tag['catid']; } $php = <<<php <?php \$article_hot = think\Db::name('article')->where("$where")->field('id,title')->limit(8)->order('views desc')->select(); \$__LIST__ = \$article_hot; ?> php; $parse ='<aside class="widget widget_hot_post">'; $parse .='<h3 class="widget-title"><i class="fa-bars fa"></i>热门文章</h3>'; $parse .='<div id="hot_post_widget">'; $parse .='<ul>'; $parse .=$php; $parse .='{volist name="__LIST__" id="vo"}'; $parse .='<li><span class="li-icon li-icon-{$key+1}">{$key+1}</span><a href="#">{$vo.title}</a></li>'; $parse .='{/volist}'; $parse .='</ul>'; $parse .='</div>'; $parse .='</aside>'; return $parse; } ~~~ #### 3、模板调用 > {Article:hot catid="0" /} ## 四、本站推荐 ### (一)原代码 #### 1、控制器 ~~~ $article_recommend = Db::name('article')->where('recommend',1)->field('id,title,thumb,views')->limit(3)->order('listorder desc')->select(); $this->assign('article_recommend',$article_recommend); ~~~ #### 2、模板 ~~~ <aside class="widget widget_hot_commend"> <h3 class="widget-title"><i class="fa-bars fa"></i>本站推荐</h3> <div id="hot" class="hot_commend"> <ul> {volist name="article_recommend" id="vo"} <li> <figure class="thumbnail"><a href="#"><img src="__UPLOADS__/image/{$vo.thumb}" alt="{$vo.title}"></a></figure> <div class="hot-title"><a href="#">{$vo.title}</a></div> <div class="views">阅读 {$vo.views}</div> <i class="fa-thumbs-o-up fa"> 0</i> </li> {/volist} </ul> <div class="clear"></div> </div> </aside> ~~~ ### (二)自定义标签代码 #### 1、标签定义 ~~~ protected $tags = [ 'hot' => ['attr' => 'catid','close' => 0], 'recommend' => ['attr' => 'catid', 'close' => 0], ]; ~~~ #### 2、标签解析 ~~~ public function tagRecommend($tag) { if(empty($tag['catid']) || $tag['catid']=='0'){ $where = 'recommend=1'; }else{ $where = "recommend=1 and catid=" . $tag['catid']; } $php = <<<php <?php \$article_recommend = think\Db::name('article')->where("$where")->field('id,title,thumb,views')->limit(3)->order('listorder desc')->select(); \$__LIST__ = \$article_recommend; ?> php; $parse = '<aside class="widget widget_hot_commend">'; $parse .= '<h3 class="widget-title"><i class="fa-bars fa"></i>本站推荐</h3>'; $parse .= '<div id="hot" class="hot_commend">'; $parse .= '<ul>'; $parse .= $php; $parse .= '{volist name="__LIST__" id="vo"}'; $parse .= '<li>'; $parse .= '<figure class="thumbnail"><a href="#"><img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"></a></figure>'; $parse .= '<div class="hot-title"><a href="#">{$vo.title}</a></div>'; $parse .= '<div class="views">阅读 {$vo.views}</div>'; $parse .= '<i class="fa-thumbs-o-up fa"> 0</i>'; $parse .= '</li>'; $parse .= '{/volist}'; $parse .= '</ul>'; $parse .= '<div class="clear"></div>'; $parse .= '</div>'; $parse .= '</aside>'; return $parse; } ~~~ #### 3、模板调用 >{Article:recommend catid="0" /} ## 五、最新文章 ### (一)原代码 #### 1、控制器 ~~~ $article = Db::name('article')->field('id,catid,title,thumb,description,inputtime,views')->limit(2)->order('listorder desc')->select(); $this->assign('article',$article); ~~~ #### 2、模板 ~~~ {volist name="article" id="vo"} <article class="post type-post status-publish format-standard hentry"> <figure class="thumbnail"> <a href="#"> <img src="__UPLOADS__/image/{$vo.thumb}" alt=""></a> <span class="cat"> <a href="#">{$vo.catid|getCatInfoById=catname}</a></span> </figure> <header class="entry-header"> <h2 class="entry-title"><a href="#" rel="bookmark">{$vo.title}</a></h2> </header> <div class="entry-content"> <div class="archive-content">{$vo.description}</div> <br/> <span class="title-l"></span> <span class="entry-meta"> <span class="date">{$vo.inputtime}&nbsp;</span> <span class="views"> 阅读 {$vo.views}&nbsp;</span> <span class="comment"><a href="#"> <i class="fa fa-comment-o"></i> 查看评论</a></span> </span> <div class="clear"></div> </div> <span class="entry-more"> <a href="#" rel="bookmark">阅读全文</a></span> </article> {/volist} ~~~ ### (二)自定义标签代码 #### 1、标签定义 ~~~ protected $tags = [ 'hot' => ['attr' => 'catid', 'close' => 0], //0闭合标签 ,1不闭合(默认) 'recommend' => ['attr' => 'catid', 'close' => 0], 'list' => ['attr' => 'catid,num', 'close' => 0], ]; ~~~ #### 2、标签解析 ~~~ public function tagList($tag) { if(empty($tag['catid']) || $tag['catid']=='0'){ $where = ''; $num = $tag['num']; }else{ $where = "catid=" . $tag['catid']; } $php = <<<php <?php \$article_list = think\Db::name('article')->where("$where")->field('id,catid,title,thumb,description,inputtime,views')->limit("$num")->order('listorder desc')->select(); \$__LIST__ = \$article_list; ?> php; $parse = $php; $parse .= '{volist name="__LIST__" id="vo"}'; $parse .= '<article class="post type-post status-publish format-standard hentry">'; $parse .= ' <figure class="thumbnail">'; $parse .= ' <a href="#"> <img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"></a>'; $parse .= ' <span class="cat"> <a href="#">{$vo.catid|getCatInfoById=catname}</a></span>'; $parse .= ' </figure>'; $parse .= ' <header class="entry-header">'; $parse .= ' <h2 class="entry-title"><a href="#" rel="bookmark">{$vo.title}</a></h2>'; $parse .= ' </header>'; $parse .= ' <div class="entry-content">'; $parse .= ' <div class="archive-content">{$vo.description}</div>'; $parse .= ' <br/>'; $parse .= ' <span class="title-l"></span>'; $parse .= ' <span class="entry-meta">'; $parse .= ' <span class="date">{$vo.inputtime}&nbsp;</span>'; $parse .= ' <span class="views"> 阅读 {$vo.views}&nbsp;</span>'; $parse .= ' <span class="comment"><a href="#"> <i class="fa fa-comment-o"></i> 查看评论</a></span>'; $parse .= ' </span>'; $parse .= ' <div class="clear"></div>'; $parse .= ' </div>'; $parse .= ' <span class="entry-more"> <a href="#" rel="bookmark">阅读全文</a></span>'; $parse .= '</article>'; $parse .= '{/volist}'; return $parse; } ~~~ #### 3、模板调用 > {Article:list catid="0" num="3" /}