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
PHP的cURL库简介及使用示例
Feb 06 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
php封装的smarty类完整实例
2016/10/19 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
PHP echo()函数讲解
2019/02/15 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
教育专业个人求职信
2013/12/02 职场文书
中学生校园广播稿
2014/01/16 职场文书
运动会100米解说词
2014/01/23 职场文书
委托公证书范本
2014/04/03 职场文书
党性观念心得体会
2014/09/03 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
创业计划书之寿司
2019/07/19 职场文书
Python3 类型标注支持操作
2021/06/02 Python
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
如何优化vue打包文件过大
2022/04/13 Vue.js