ThinkPHP内置标签库原理(Cx标签库)
任何一个模板引擎的功能都不可能是为你量身定制的,具有一个良好的可扩展 机制也是模板引擎的另外一个考量,Smarty采用的是插件方法来实现扩展,ThinkTemplate由于采用了标签库技术,比Smarty提供了更为 强大的定制功能,和Java的TagLibs一样可以支持自定义标签库和标签,每个XML标签都有独立的解析方法,所以可以根据标签库的定义规则来增加和 修改标签解析规则。在ThinkTemplate中标签库的体现是采用XML命名空间的方式。
标签库由定义文件和解析类构成。每个标签库存在一个XML定义文件,用来定义标签库中的标签和属性。并且一个标签库文件对应一个标签库解析类,每个 标签就是解析类中的一个方法。例如,CX标签库的定义文件是cx.xml 位于ThinkTemplate/Template/Tags/目录下面,而cx标签库解析类文件是位于ThinkTemplate/Template /TagLib/目录下面的TagLibCx.class.php文件,每个标签的解析方法就是TagLibCx类的一个方法,为了不和系统的关键字冲 突,所以在方法名前加上了“_”前缀,因此,假如要定义Cx:Var 的标签解析,就需要定义一个 _var方法。
标签库解析类的作用其实就是把某个标签定义解析成为有效的模版文件(可以包括PHP语句或者HTML标签)。扩展标签库需要添加标签库定义XML文件和标签库解析类。
标签库定义XML文件的格式为:
<!--- XML/HTML代码 -->
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tag>
<name>标签名称< /name>
<nested>是否允许嵌套< /nested>
<alias>标签别名< /alias>
<bodycontent>是否属于闭合标签< /bodycontent>
<attribute>
<name>属性名称< /name>
<required>是否必须< /required>
</attribute>
</tag>
</taglib>
标签库的名称和文件名一致,每个tag标签对定义了标签库中的一个标签,每个tag节点的属性定义规范如下:
name:标签名称
nested:是否允许标签嵌套(true或false)
alias:标签别名(多个逗号分隔)
bodycontent:是否为闭合标签(true或empty)
attribute:标签允许的属性
每个标签节点可以包含多个属性,也就是tag节点可以定义多个attribute节点,每个attribute属性支持两个属性:name和required,required(true或false)表示该属性是否为必须。
然后,我们看解析类的定义,每个标签的解析方法在定义的时候需要添加“_”前缀,可以传入两个参数,属性字符串和内容字符串(对于非闭合标签)。必须通过return 返回标签的字符串解析输出,在标签解析类中可以调用模板类的实例。下面是一个include解析方法的定义:
//PHP代码
public function _include($attr,$content){
$tag = $this->parseXmlAttr($attr,'include');
$file = $tag['file'];
return $this->tpl->parseInclude($file);
}
在每个标签的解析方法中,首先需要调用
//PHP代码
$this->parseXmlAttr($attr,'include');
表示分析某个标签的XML定义,返回include的所有标签属性。接下来就是根据具体的属性值来返回实际的解析内容了。
ThinkPHP内置标签库原理(Cx标签库)的更多相关文章
- thinkphp 内置标签volist 控制换行
thinkphp 内置标签volist 控制换行 volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行 ...
- thinkphp内置标签简单讲解
thinkphp内置标签简单讲解 1.volist循环 name 需要遍历的数据 id 类似于foreach中 value offset 截取数据起始位置 length 截取数据的个数 mod 奇偶数 ...
- ThinkPHP内置函数详解D、F、S、C、L、A、I
单字母函数D.F.S.C.L.A.I 他们都在ThinkPHP核心的ThinkPHP/Mode/Api/functions.php这个文件中定义. 下面我分别说明一下他们的功能: D() 加载Mode ...
- Thinkphp内置截取字符串函数
Thinkphp内置了一个可以媲美smarty的模板引擎,给我们带来了很大的方便.调用函数也一样,可以和smarty一样调用自己需要的函数,而官方也内置了一些常用的函数供大家调用. 比如今天我们说的截 ...
- thinkPHP内置字符串截取msubstr函数用法详解
作者:陈达辉 字体:[增加 减小] 类型:转载 时间:2016-11-15 我要评论 这篇文章主要介绍了thinkPHP内置字符串截取函数用法,结合实例形式分析了thinkPHP内置的字符串截取函数功 ...
- ThinkPHP内置日志记录
ThinkPHP内置日志记录日志记录http://document.thinkphp.cn/manual_3_2.html#log 日志的处理工作是由系统自动进行的,在开启日志记录的情况下,会记录下允 ...
- thinkphp中ajax使用实例(thinkphp内置支持ajax)
thinkphp中ajax使用实例(thinkphp内置支持ajax) 一.总结 1.thinkphp应该是内置支持ajax的,所以请求类型里面才会有是否是ajax // 是否为 Ajax 请求 if ...
- 第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理
1.Navicat工具与pymysql模块 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数 ...
- Python 2.7 学习笔记 内置语句、函数、标准库
使用任何开发语言进行软件开发,都离不开语言提供的内置库(或Api),甚至说内置库的强大及使用是否方便都会影响大家对开发语言的选择. python语言,一样提供了很多内置的功能,可供开发时使用.主要有如 ...
随机推荐
- SR-IOV
SR-IOV 来源 http://blog.csdn.net/liushen0916/article/details/52423507 摘要: 介绍SR-IOV 的概念.使用场景.VMware 和 K ...
- JSON:结构化数据格式
JSON是javascript的子类,也是作为更好的互联网传输结构化数据格式逐渐取代XML,因此要理解JSON,重要的是理解它是一种数据格式,不是一种编程语言. 语法 //javascript var ...
- github命令大全
github是一种开源的版本控制工具,现在已经得到很多人的应用.所以想介绍一下github的一些使用. github安装 github提供了桌面客户端,我们也可以通过命令行的方式来进行控制. wind ...
- sublime text3 安装插件
遇到的问题1: 软件中无此属性 打开Packages目录,Preferences > Browse Packages 就可以进入这个目录.$ cd Packages/$ git clone ht ...
- Git初始化本地仓库及管理远程仓库github
1.首先在本地安装git,地址:https://git-scm.com/downloads.下载安装好git工具. 2.将自己在github上的注册的用户名和邮箱写入本地git的配置文件中: (1). ...
- 前端移动开发--viewpoint
移动开发时,一般都会在头部加载这样一行meta标签 <meta name="viewport" content="width=device-width, initi ...
- MyCat(1.2)Mycat的安装
[0]基本环境 OS:CentOS7.5 Software envireonment:JDK1.7.0 Master Software:Mycat1.6.5 Linux Client:CRT 8.0 ...
- Java web入门之Http请求和响应
三层架构 web层:JSP + Servlet.Struts 2.SpringMVC service层:Spring dao层:JDBC.DBUtils.Hibernate.MyBatis form表 ...
- 51nod 1490: 多重游戏(树上博弈)
题目链接 该题实质上是一个树上博弈的问题.要定义四种状态——2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必败态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的 ...
- SQL索引优化方法
SQL索引优化方法 以下是代码片段: ROW_NUMBER() OVER(ORDER BY ResumeCreateTime DESC) as [RowID] ,[TopDegree] ,[Degre ...