<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- namespace Behavior; use Think\Storage; use Think\Think; /** * 系统行为扩展:模板解析 */ class ParseTemplateBehavior { // 行为扩展的执行入口必须是run public function run(&$_data) { $engine = strtolower(C('TMPL_ENGINE_TYPE')); $_content = empty($_data['content']) ? $_data['file'] : $_data['content']; $_data['prefix'] = ! empty($_data['prefix']) ? $_data['prefix'] : C('TMPL_CACHE_PREFIX'); if ('think' == $engine) { // 采用Think模板引擎 if ((! empty($_data['content']) && $this->checkContentCache($_data['content'], $_data['prefix'])) || $this->checkCache($_data['file'], $_data['prefix'])) { // 缓存有效 // 载入模版缓存文件 Storage::load(C('CACHE_PATH') . $_data['prefix'] . md5($_content) . C('TMPL_CACHFILE_SUFFIX'), $_data['var']); } else { $tpl = Think::instance('Think\\Template'); // 编译并加载模板文件 $tpl->fetch($_content, $_data['var'], $_data['prefix']); } } else { // 调用第三方模板引擎解析和输出 if (strpos($engine, '\\')) { $class = $engine; } else { $class = 'Think\\Template\\Driver\\' . ucwords($engine); } if (class_exists($class)) { $tpl = new $class(); $tpl->fetch($_content, $_data['var']); } else { // 类没有定义 E(L('_NOT_SUPPORT_') . ': ' . $class); } } } /** * 检查缓存文件是否有效 * 如果无效则需要重新编译 * * @access public * @param string $tmplTemplateFile * 模板文件名 * @return boolean */ protected function checkCache($tmplTemplateFile, $prefix = '') { if (! C('TMPL_CACHE_ON')) // 优先对配置设定检测 { return false; } $tmplCacheFile = C('CACHE_PATH') . $prefix . md5($tmplTemplateFile) . C('TMPL_CACHFILE_SUFFIX'); if (! Storage::has($tmplCacheFile)) { return false; } elseif (filemtime($tmplTemplateFile) > Storage::get($tmplCacheFile, 'mtime')) { // 模板文件如果有更新则缓存需要更新 return false; } elseif (C('TMPL_CACHE_TIME') != 0 && time() > Storage::get($tmplCacheFile, 'mtime') + C('TMPL_CACHE_TIME')) { // 缓存是否在有效期 return false; } // 开启布局模板 if (C('LAYOUT_ON')) { $layoutFile = THEME_PATH . C('LAYOUT_NAME') . C('TMPL_TEMPLATE_SUFFIX'); if (filemtime($layoutFile) > Storage::get($tmplCacheFile, 'mtime')) { return false; } } // 缓存有效 return true; } /** * 检查缓存内容是否有效 * 如果无效则需要重新编译 * * @access public * @param string $tmplContent * 模板内容 * @return boolean */ protected function checkContentCache($tmplContent, $prefix = '') { if (Storage::has(C('CACHE_PATH') . $prefix . md5($tmplContent) . C('TMPL_CACHFILE_SUFFIX'))) { return true; } else { return false; } } }