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 组件化编程技巧
Jun 06 PHP
php 中文和编码判断代码
May 16 PHP
PHP文件上传原理简单分析
May 29 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php实现RSA加密类实例
Mar 26 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 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采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
Python中用format函数格式化字符串的用法
2015/04/08 Python
python调用java的jar包方法
2018/12/15 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
小区的门卫岗位职责
2014/10/01 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
邀请函的格式
2015/01/30 职场文书
2015年药店工作总结
2015/04/20 职场文书
初中信息技术教学反思
2016/02/16 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书