发新话题
打印

ThinkPHP夜话之4:模板引擎

ThinkPHP夜话之4:模板引擎

第四话:模板引擎
  • 推荐指数:4
  • 难度系数:4
  • 实用指数:4


关于ThinkPHP的模板引擎,说起来也曾经是投入比较大和完善较多的一个部分。ThinkPHP把框架里面的每个大功能的实现都当作是一个项目来对待,希望能够体现内置的优势和价值。其实,我们都知道,PHP开发已经有很多成熟的模板引擎,但是他们或多或少有些觉得不方便或者其它的问题,那么,ThinkPHP是否有这个能力来做这个挑战呢,究竟是否会有开发人员会去用这个内置的模板引擎。事实证明,在使用ThinkPHP的开发人员中,有80%都选择用内置的模板引擎,即使官方已经提供了很多流行的模板引擎的支持插件。

毫无疑问,这个归咎于当初ThinkPHP模板引擎的设计和不断的完善。最早的模板引擎只是提供了简单的变量输出功能,当0.8版本以后引入XML标签库后才有了充足的发展。
目前来说,ThinkPHP内置的模板引擎是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,集输出、包含、控制功能于一身,而且支持自定义标签库,其特点主要包括:
  • 1、支持XML标签库技术和普通标签定义;
  • 2、只需编译一次,下次直接运行而无需重新编译;
  • 3、模板更新后,自动更新模板缓存;
  • 4、自动加载当前操作的模板缓存文件,无需指定模板文件名称;
  • 5、支持编码转换和Content-Type 更换;
  • 6、模板变量输出前缀支持,避免变量名称冲突;
  • 7、支持特殊变量输出,无需设置模板变量;
  • 8、支持变量调节器和格式化功能;
  • 9、自动对象初始化,无需额外加载和初始化模板对象;
  • 10、模板文件可以单独预览;
  • 11、支持自定义标签库和扩展标签;



ThinkPHP内置模板引擎的的模板标签有两种类型:第一种是普通标签,类似于Smarty的模板标签,在功能方面作了部分简化,增强了显示功能,弱化了逻辑控制功能;第二种是XML标签库形式,该模板技术是新版(0.8版本以上才支持)新增的标签技术,有效地借鉴了Java的标签库技术,在控制功能和各方面都比较强大,而且允许自定义标签库,是新版ThinkPHP系统引入和推荐的模板标签技术。两种标签方式的结合使用,可以让您的模板定义功能相当强大。
由于采用了标签库技术,比Smarty提供了更为强大的定制功能,和Java的TagLibs一样可以支持自定义标签库和标签,每个XML标签都有独立的解析方法,所以可以根据标签库的定义规则来增加和修改标签解析规则。标签库的体现是采用XML命名空间的方式,例如:
  • <cx:volist id=”list”></cx:volist>


每个命名空间都有一个对应的标签库XML定义文件,并且还包含有一个用于解析该标签库的类文件。系统默认对cx标签库进行支持,所以在定义cx标签库的标签时候,可以省略XML的命名空间前缀。当系统中存在很多的标签库的时候,每次编译都会加载所有的标签库解析文件,这样会造成一种浪费,因为很多情况,我们可能只是使用其中的一个或者二个标签库。所以,我们还必须在模板页面实现标签库引入功能,来告诉模板引擎当前模板页面需要哪些标签库的支持,从而加载需要的解析类。可以使用tagLib标签来实现这一功能,例如:
  • <tagLib name="html,cx" />


表示导入html和cx两个标签库的支持。如果没有定义,那么默认只是加载cx标签库。
利用标签库的特性,我们可以非常方便地扩展自己需要的标签,正是采用这种机制来内置集成了一些常用的HTML组件标签,例如:
  • <html:list id="checkList" name="user" style="list" checkbox="true" action="true" datasource="list" show="id:编号|10%,title:标题:edit,cTime|toDate='Y-m-d h#i#s':评论日期,status|getStatus:状态" actionlist="forbid|resume:禁用|恢复,edit:编辑" />


使用上面的自定义XML标签定义了一个DataGrid组件,省去了复杂的Html代码,在模板第一次执行的时候,模板引擎会把上面的组件标签解析成PHP和Html结合的代码,生成缓存文件。模板引擎中包含的Html标签库中封装了很多有价值的Html组件。

作为一个应用开发框架,需要考虑不同的模板引擎接口,所以后来ThinkPHP又不断推出主流的模板引擎插件来满足不同需要的模板定义。目前为止,已经提供了包括TemplateLite、Smarty、EaseTemplate、DzTemplate在内的模板引擎支持。有效解决了应用的视图层的表现问题。

TOP

发新话题