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 相关文章推荐
Zend framework处理一个http请求的流程分析
Feb 08 PHP
discuz程序的PHP加密函数原理分析
Aug 05 PHP
如何用PHP实现插入排序?
Apr 10 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
cakephp常见知识点汇总
Feb 24 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 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语言认识上需要避免的10大误区
2014/06/12 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php生成RSS订阅的方法
2015/02/13 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
jquery动态添加option示例
2013/12/30 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
2015年社区创卫工作总结
2015/04/21 职场文书
我的暑假生活作文(五年级)范文
2019/08/07 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python