ParseTemplateBehavior.class.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2014 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. namespace Behavior;
  12. use Think\Storage;
  13. use Think\Think;
  14. /**
  15. * 系统行为扩展:模板解析
  16. */
  17. class ParseTemplateBehavior
  18. {
  19. // 行为扩展的执行入口必须是run
  20. public function run(&$_data)
  21. {
  22. $engine = strtolower(C('TMPL_ENGINE_TYPE'));
  23. $_content = empty($_data['content']) ? $_data['file'] : $_data['content'];
  24. $_data['prefix'] = !empty($_data['prefix']) ? $_data['prefix'] : C('TMPL_CACHE_PREFIX');
  25. if ('think' == $engine) {
  26. // 采用Think模板引擎
  27. if ((!empty($_data['content']) && $this->checkContentCache($_data['content'], $_data['prefix']))
  28. || $this->checkCache($_data['file'], $_data['prefix'])) {
  29. // 缓存有效
  30. //载入模版缓存文件
  31. Storage::load(C('CACHE_PATH') . $_data['prefix'] . md5($_content) . C('TMPL_CACHFILE_SUFFIX'), $_data['var']);
  32. } else {
  33. $tpl = Think::instance('Think\\Template');
  34. // 编译并加载模板文件
  35. $tpl->fetch($_content, $_data['var'], $_data['prefix']);
  36. }
  37. } else {
  38. // 调用第三方模板引擎解析和输出
  39. if (strpos($engine, '\\')) {
  40. $class = $engine;
  41. } else {
  42. $class = 'Think\\Template\\Driver\\' . ucwords($engine);
  43. }
  44. if (class_exists($class)) {
  45. $tpl = new $class;
  46. $tpl->fetch($_content, $_data['var']);
  47. } else {
  48. // 类没有定义
  49. E(L('_NOT_SUPPORT_') . ': ' . $class);
  50. }
  51. }
  52. }
  53. /**
  54. * 检查缓存文件是否有效
  55. * 如果无效则需要重新编译
  56. * @access public
  57. * @param string $tmplTemplateFile 模板文件名
  58. * @return boolean
  59. */
  60. protected function checkCache($tmplTemplateFile, $prefix = '')
  61. {
  62. if (!C('TMPL_CACHE_ON')) // 优先对配置设定检测
  63. {
  64. return false;
  65. }
  66. $tmplCacheFile = C('CACHE_PATH') . $prefix . md5($tmplTemplateFile) . C('TMPL_CACHFILE_SUFFIX');
  67. if (!Storage::has($tmplCacheFile)) {
  68. return false;
  69. } elseif (filemtime($tmplTemplateFile) > Storage::get($tmplCacheFile, 'mtime')) {
  70. // 模板文件如果有更新则缓存需要更新
  71. return false;
  72. } elseif (C('TMPL_CACHE_TIME') != 0 && time() > Storage::get($tmplCacheFile, 'mtime') + C('TMPL_CACHE_TIME')) {
  73. // 缓存是否在有效期
  74. return false;
  75. }
  76. // 开启布局模板
  77. if (C('LAYOUT_ON')) {
  78. $layoutFile = THEME_PATH . C('LAYOUT_NAME') . C('TMPL_TEMPLATE_SUFFIX');
  79. if (filemtime($layoutFile) > Storage::get($tmplCacheFile, 'mtime')) {
  80. return false;
  81. }
  82. }
  83. // 缓存有效
  84. return true;
  85. }
  86. /**
  87. * 检查缓存内容是否有效
  88. * 如果无效则需要重新编译
  89. * @access public
  90. * @param string $tmplContent 模板内容
  91. * @return boolean
  92. */
  93. protected function checkContentCache($tmplContent, $prefix = '')
  94. {
  95. if (Storage::has(C('CACHE_PATH') . $prefix . md5($tmplContent) . C('TMPL_CACHFILE_SUFFIX'))) {
  96. return true;
  97. } else {
  98. return false;
  99. }
  100. }
  101. }