Thinkphp 框架扩展之标签库驱动原理与用法分析


Posted in PHP onApril 23, 2020

本文实例讲述了Thinkphp 框架扩展之标签库驱动原理与用法。分享给大家供大家参考,具体如下:

Think\Template中标签库的体现是采用XML命名空间的方式。每个标签库对应一个标签库驱动类,每个驱动类负责对标签库中的所有标签的解析。

标签库驱动类的作用其实就是把某个标签定义解析成为有效的模版文件(可以包括PHP语句或者HTML标签),标签库驱动的命名空间位于 Think\Template\TagLib,标签库驱动必须继承Think\Template\TagLib类,例如:

namespace Think\Template\Taglib;
use Think\Template\TagLib;
Class Test extends TagLib{
}

首先需要定义标签库的标签定义,标签定义包含了所有标签库中支持的所有标签,定义方式如下:

protected $tags  = array(
 // 定义标签
 'input'  =>  array('attr'=>'type,name,id,value','close'=>0), // input标签
 'textarea' =>  array('attr'=>'name,id'),
 );

标签库的所有支持标签都在tags属性中进行定义,tags属性是一个二维数组,每个元素就是一个标签定义,索引名就是标签名,采用小写定义,调用的时候不区分大小写。

每个标签定义支持的属性包括:

属性名 说明
attr 标签支持的属性列表,用逗号分隔
close 标签是否为闭合方式 (0闭合 1不闭合),默认为不闭合
level 标签的嵌套层次(只有不闭合的标签才有嵌套层次)
alias 标签别名

定义了标签属性后,就需要定义每个标签的解析方法了,每个标签的解析方法在定义的时候需要添加“_”前缀,传入两个参数,对应属性数组和内容字符串(针对非闭合标签)。必须返回标签的字符串解析输出,在标签解析类中可以调用模板类的实例。下面是一个input解析方法的定义:

// input标签解析
public function _input($tag,$content)  {
  $name  =  $tag['name'];
  $id  =  $tag['id'];
  $type  =  $tag['type'];
  $value  =  $this->autoBuildVar($tag['value']);
  $str = "<input type='".$type."' id='".$id."' name='".$name."' value='".$value."' />";
  return $str;
}
// textarea标签解析
public function _textarea($tag,$content)  {
  $name =  $tag['name'];
  $id  =  $tag['id'];
  $str  =  '<textarea id="'.$id.'" name="'.$name.'">'.$content.'</textarea>';
  return $str;
}

定义好标签库扩展之后,我们就可以在模板中使用了,首先我们必须要告诉模板申明Test标签库,用taglib标签,例如:

<taglib name='Test' />

name属性支持申明多个标签库,用逗号分隔即可。申明Test标签库之后,就可以使用Test标签库中的所有标签库了,调用方式如下:

<test:input type='radio' id='test' name='mail' value='value' />
<test:textarea id="content" name="content">$value</test:textarea>

注意:调用扩展标签库的标签的时候,必须加上标签库的XML命名空间前缀。

Input标签定义value属性可以支持变量传入,所以value被认为是一个变量名,如果在控制器中已经给value模板变量赋值,例如:

$this->assign('value','my test value');

最后标签被模板引擎编译后,就会输出:

<input type='radio' id='test' name='mail' value='my test value' />
<textarea id="content" name="content">my test vale</textarea>

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
PHP缓存技术的多种方法小结
Aug 14 PHP
php语言流程控制中的主动与被动
Nov 05 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
Sep 29 PHP
php使用curl出现Expect:100-continue解决方法
Mar 03 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
Django 中 cookie的使用
Aug 17 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 #PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 #PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 23 #PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 #PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 #PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 #PHP
php模拟实现斗地主发牌
Apr 22 #PHP
You might like
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
react学习笔记之state以及setState的使用
2017/12/07 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
解决Python中回文数和质数的问题
2019/11/24 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
基层党建工作宣传标语
2014/06/24 职场文书
市场部经理岗位职责
2015/02/02 职场文书
常用的Python代码调试工具总结
2021/06/23 Python
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫
解决MySQL报“too many connections“错误
2022/04/19 MySQL