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语言,一样提供了很多内置的功能,可供开发时使用.主要有如 ...
随机推荐
- Assembly language 再读---续
前面已经写到了第三章的数据类型 的那一部分 接下来是一些关于伪指令和其他杂七杂八的东西 1. 当前地址计数器: $ 常用于 计算数组以及字符串的长度,如: .data list db ,,,,, ...
- unity DOTween Pro的使用--简化流程--自动播放
当gameobject setActive(true)的时候自动播放动画 1) 添加DoTween Animation. 设置动画效果, 略 选中 AutoPlay, 取消 AutoKill 2) 在 ...
- 四、附加到进程调试(.NET Core)
1.安装.net core windows server托管工具包: 1.下载https://dotnet.microsoft.com/download/thank-you/dotnet-runtim ...
- C# 事务的创建,提交和回滚
在C#中开启事务的步骤 01.调用SqlConnection对象的BeginTransaction()方法,创建一个SqlTransaction对象,标志事务开始. 02.将创建的SqlTransac ...
- 编译错误:warning C4005]ws2def.h(91): warning C4005: “AF_IPX”: 宏重定义 winsock.h(460) : 参见“AF_IPX”的前一个定义
[问题] ws2def.h(91): warning C4005: “AF_IPX”: 宏重定义: winsock2.h(460) : 参见“AF_IPX”的前一个定义 [原因] windows.h头 ...
- golang对象
对象和组合 package main import ( "fmt" ) type father struct { name string sex int } type sun st ...
- [BZOJ5407]girls
也是CF985G... 容斥+三元环计数 CF数据太弱啦 vis没赋初值-1竟然过了QAQ 所以又调了我半个小时才搞掉QAQ 数数真难QAQ 记得要写#include<vector>!!! ...
- 使用yum命令报错
树莓派(Raspberry Pi 3) centos7使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, ...
- [转]解决win10下localhost打不开的问题
博主刚开始玩Tornado,结果localhost都打不开,各种找寻解决方案,结论都是IIS服务器问题.然而win10下的解决方法居然没人写过...那就我来配图详解下. 打开控制面板--添加或删除程序 ...
- Java线程与线程、进程与进程之间通信方式
1.1 基本概念以及线程与进程之间的区别联系 关于进程和线程,首先从定义上理解就有所不同: 进程是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说 ...