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异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
php获取文件内容最后一行示例
Jan 09 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
php 的反射详解及示例代码
Aug 25 PHP
php中的异常和错误浅析
May 03 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 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批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
php实现插入排序
2015/03/29 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
python实现图像拼接功能
2020/03/23 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
python实现无边框进度条的实例代码
2020/12/30 Python
html5与css3小应用
2013/04/03 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
什么是岗位职责
2013/11/12 职场文书
怎么写有吸引力的自荐信
2013/11/17 职场文书
五一服装活动方案
2014/01/11 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
经典婚礼主持词
2014/03/13 职场文书
培训研修方案
2014/06/06 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
销售督导岗位职责
2015/04/10 职场文书
PHP遍历数组的6种方式总结
2021/11/17 PHP
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers