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扩展函数
Oct 09 PHP
做一个有下拉功能的留言版
Oct 09 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
Laravel如何同时连接多个数据库详解
Aug 13 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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生成带有雪花背景的验证码
2006/10/09 PHP
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
js实现五星评价功能
2017/03/08 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
使用Python抓取模板之家的CSS模板
2015/03/16 Python
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
Python jieba库分词模式实例用法
2021/01/13 Python
北大青鸟学生求职信
2013/09/24 职场文书
投资建议书模板
2014/05/12 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书