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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
很实用的一个完整email发送程序
Oct 09 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
PHP加密解密函数详解
Oct 28 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
php经典趣味算法实例代码
Jan 21 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
php动态生成JavaScript代码
2009/03/09 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
2013/09/30 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
php实现URL加密解密的方法
2016/11/17 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
js中的this关键字详解
2013/09/25 Javascript
JS画线(实例代码)
2013/11/20 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python写的贪吃蛇游戏例子
2014/06/16 Python
python之文件读取一行一行的方法
2018/07/12 Python
Python调用C语言的实现
2019/07/26 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
软件测试工程师笔试题带答案
2015/03/27 面试题
建议书的格式
2014/05/12 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
文明单位汇报材料
2014/12/24 职场文书
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS