ParseTemplateBehavior.class.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. defined('THINK_PATH') or exit();
  12. /**
  13. * 系统行为扩展:模板解析
  14. * @category Think
  15. * @package Think
  16. * @subpackage Behavior
  17. * @author liu21st <liu21st@gmail.com>
  18. */
  19. class ParseTemplateBehavior extends Behavior {
  20. // 行为参数定义(默认值) 可在项目配置中覆盖
  21. protected $options = array(
  22. // 布局设置
  23. 'TMPL_ENGINE_TYPE' => 'Think', // 默认模板引擎 以下设置仅对使用Think模板引擎有效
  24. 'TMPL_CACHFILE_SUFFIX' => '.php', // 默认模板缓存后缀
  25. 'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数
  26. 'TMPL_DENY_PHP' => false, // 默认模板引擎是否禁用PHP原生代码
  27. 'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记
  28. 'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记
  29. 'TMPL_VAR_IDENTIFY' => 'array', // 模板变量识别。留空自动判断,参数为'obj'则表示对象
  30. 'TMPL_STRIP_SPACE' => true, // 是否去除模板文件里面的html空格与换行
  31. 'TMPL_CACHE_ON' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译
  32. 'TMPL_CACHE_PREFIX' => '', // 模板缓存前缀标识,可以动态改变
  33. 'TMPL_CACHE_TIME' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒)
  34. 'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', // 布局模板的内容替换标识
  35. 'LAYOUT_ON' => false, // 是否启用布局
  36. 'LAYOUT_NAME' => 'layout', // 当前布局名称 默认为layout
  37. // Think模板引擎标签库相关设定
  38. 'TAGLIB_BEGIN' => '<', // 标签库标签开始标记
  39. 'TAGLIB_END' => '>', // 标签库标签结束标记
  40. 'TAGLIB_LOAD' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测
  41. 'TAGLIB_BUILD_IN' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序
  42. 'TAGLIB_PRE_LOAD' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔
  43. );
  44. // 行为扩展的执行入口必须是run
  45. public function run(&$_data){
  46. $engine = strtolower(C('TMPL_ENGINE_TYPE'));
  47. $_content = empty($_data['content'])?$_data['file']:$_data['content'];
  48. $_data['prefix'] = !empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX');
  49. if('think'==$engine){ // 采用Think模板引擎
  50. if((!empty($_data['content']) && $this->checkContentCache($_data['content'],$_data['prefix']))
  51. || $this->checkCache($_data['file'],$_data['prefix'])) { // 缓存有效
  52. // 分解变量并载入模板缓存
  53. extract($_data['var'], EXTR_OVERWRITE);
  54. //载入模版缓存文件
  55. include C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX');
  56. }else{
  57. $tpl = Think::instance('ThinkTemplate');
  58. // 编译并加载模板文件
  59. $tpl->fetch($_content,$_data['var'],$_data['prefix']);
  60. }
  61. }else{
  62. // 调用第三方模板引擎解析和输出
  63. $class = 'Template'.ucwords($engine);
  64. if(class_exists($class)) {
  65. $tpl = new $class;
  66. $tpl->fetch($_content,$_data['var']);
  67. }else { // 类没有定义
  68. throw_exception(L('_NOT_SUPPERT_').': ' . $class);
  69. }
  70. }
  71. }
  72. /**
  73. * 检查缓存文件是否有效
  74. * 如果无效则需要重新编译
  75. * @access public
  76. * @param string $tmplTemplateFile 模板文件名
  77. * @return boolean
  78. */
  79. protected function checkCache($tmplTemplateFile,$prefix='') {
  80. if (!C('TMPL_CACHE_ON')) // 优先对配置设定检测
  81. return false;
  82. $tmplCacheFile = C('CACHE_PATH').$prefix.md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX');
  83. if(!is_file($tmplCacheFile)){
  84. return false;
  85. }elseif (filemtime($tmplTemplateFile) > filemtime($tmplCacheFile)) {
  86. // 模板文件如果有更新则缓存需要更新
  87. return false;
  88. }elseif (C('TMPL_CACHE_TIME') != 0 && time() > filemtime($tmplCacheFile)+C('TMPL_CACHE_TIME')) {
  89. // 缓存是否在有效期
  90. return false;
  91. }
  92. // 开启布局模板
  93. if(C('LAYOUT_ON')) {
  94. $layoutFile = THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX');
  95. if(filemtime($layoutFile) > filemtime($tmplCacheFile)) {
  96. return false;
  97. }
  98. }
  99. // 缓存有效
  100. return true;
  101. }
  102. /**
  103. * 检查缓存内容是否有效
  104. * 如果无效则需要重新编译
  105. * @access public
  106. * @param string $tmplContent 模板内容
  107. * @return boolean
  108. */
  109. protected function checkContentCache($tmplContent,$prefix='') {
  110. if(is_file(C('CACHE_PATH').$prefix.md5($tmplContent).C('TMPL_CACHFILE_SUFFIX'))){
  111. return true;
  112. }else{
  113. return false;
  114. }
  115. }
  116. }