最近用到thinkphp官方出版的onethink搭建管理后台,因为公司以前代码是smarty写的,模版2000多行,实在懒得用think的模版引擎来改,
所以整合smarty模版引擎, 兼容 think模版。
一:Application/Common/Conf/config.php添加
‘TMPL_ENGINE_TYPE’ => ‘Smarty’,
二:下载smarty模版引擎 下载地址
http://pan.baidu.com/s/1ntoXvwH
放在ThinkPHP\Library\Vendor下面
因为onethink已经有smarty类,在
ThinkPHP/Library/Think/Template/Driver/Smarty.class.php
public function fetch($templateFile,$var) {
$templateFile = substr($templateFile,strlen(THEME_PATH));
vendor('Smarty.Smarty#class');
$tpl = new \Smarty();
$tpl->caching = C('TMPL_CACHE_ON');
$tpl->template_dir = THEME_PATH;
$tpl->compile_dir = CACHE_PATH ;
$tpl->cache_dir = TEMP_PATH ;
if(C('TMPL_ENGINE_CONFIG')) {
$config = C('TMPL_ENGINE_CONFIG');
foreach ($config as $key=>$val){
$tpl->{$key} = $val;
}
}
$tpl->assign($var);
$tpl->display($templateFile);
}
而onethink模版解析流程是在
hinkPHP\Library\Behavior\ParseTemplateBehavior.class.php
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_SUPPERT_').': ' . $class);
}
}
}
可以看出如果模版引擎不是think时,则实例化
‘Think\\Template\\Driver\\’.ucwords($engine);
这样你的系统可以支持smarty模版了,
但是你其他的模版有的不想使用smarty ,还想保留think
则可以在config.php里加判断
if( strstr($_GET['s'],"NoSmarty")!=''){){
return array(
'TMPL_ENGINE_TYPE' => 'Smarty',
//当前控制器使用smarty
);
}else{
return array(
//当前控制器不使用smarty
);
}