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 相关文章推荐
IStream与TStream之间的相互转换
Aug 01 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
php中explode与split的区别介绍
Oct 03 PHP
php在数组中查找指定值的方法
Mar 17 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
通过源码分析Python中的切片赋值
2017/05/08 Python
浅析python中while循环和for循环
2019/11/19 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
Python分类测试代码实例汇总
2020/07/23 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
带薪年假请假条
2014/02/04 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
推荐信格式要求
2014/05/09 职场文书
集中采购方案
2014/06/10 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
公司开业致辞
2015/07/29 职场文书
python中的装饰器该如何使用
2021/06/18 Python
php双向队列实例讲解
2021/11/17 PHP