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
第三节--定义一个类
Nov 16 PHP
关于PHP5 Session生命周期介绍
Mar 02 PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php数组一对一替换实现代码
Aug 31 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
laravel 使用auth编写登录的方法
Sep 30 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判断当前操作系统类型
2015/10/28 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
bootstrap读书笔记之CSS组件(上)
2016/10/17 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
vue.js语法及常用指令
2017/10/29 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python编写的最短路径算法
2015/03/25 Python
基python实现多线程网页爬虫
2015/09/06 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
工业自动化毕业生自荐信范文
2014/01/04 职场文书
给护士表扬信
2014/01/19 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
2015年新学期寄语
2015/02/26 职场文书
python神经网络 使用Keras构建RNN训练
2022/05/04 Python