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 相关文章推荐
PHP学习资料汇总与网址
Mar 16 PHP
PHP 变量类型的强制转换
Oct 23 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
php格式化金额函数分享
Feb 02 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
php中的依赖注入实例详解
Aug 14 PHP
laravel5.1框架model类查询的实现方法
Oct 08 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
小谈php正则提取图片地址
2014/03/27 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python open读写文件实现脚本
2008/09/06 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
信息专业学生学习的自我评价
2014/02/17 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
go结构体嵌套的切片数组操作
2021/04/28 Golang
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
Python多个MP4合成视频的实现方法
2021/07/16 Python