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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
php初学者写及时补给skype用户充话费的小程序
Nov 02 PHP
php中日期加减法运算实现代码
Dec 08 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
php获取淘宝分类id示例
Jan 16 PHP
PHP发送AT指令实例代码
May 26 PHP
php 常用的系统函数
Feb 07 PHP
php表单习惯用的正则表达式
Oct 11 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
php中的explode()函数实例介绍
Jan 18 PHP
PHP实现与java 通信的插件使用教程
Aug 11 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
PHP5 的对象赋值机制介绍
2011/08/02 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
php unlink()函数使用教程
2018/07/12 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
python打开网页和暂停实例
2014/09/30 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
构造方法和其他方法的区别
2016/04/26 面试题
《乞巧》教学反思
2014/02/27 职场文书
师范毕业生求职信
2014/07/11 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
培训师岗位职责
2015/02/14 职场文书
病房管理制度范本
2015/08/06 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
bose降噪耳机音能消除人声吗
2022/04/19 数码科技