从TP1.5开始,对于其他的模版引擎有了原生支持(不再是以前那种插件机制了)。
本文以使用smarty模版为例作点简单介绍,其他的,可以参考一下View.class.php中的fetch方法可知。
TP的SVN中已经含有smarty模版库,因此当你要使用的时候,只需要在项目的config.php里作一点简单的配置:
- 'TMPL_ENGINE_TYPE' => 'smarty', //这个是设置引擎为smarty
从2009-01-07下午的SVN版本里,流年为又增加了一个TMPL_ENGINE_CONFIG这个数组,即:
- 'TMPL_ENGINE_CONFIG' = array(
- 'template_dir' => TMPL_PATH , //这个就是tpl目录了
- 'compile_dir' => CACHE_PATH . "tplCompile/", //这是我自己设定的,模版编译缓存放在这个目录里
- 'cache_dir' => CACHE_PATH . "tplCache/", //如果需要生成页面缓存,这个也是必须的
- 'left_delimiter' => '{',
- 'right_delimiter' => '}',
- 'caching' => false,
- 'force_compile' => true,
- 'compile_check' => true,
- ),
备注:如果按照我这样的写法,请到cache目录里手动创建tplCompile和tplCache两个目录,否则程序会报错。
报错信息大致为:
- Catchable fatal error: Object of class Smarty could not be converted to string in D:\local\htdocs\ThinkPHP\Album\Temp\~runtime.php on line 145
如果出现这样的报错信息,请先检查这两个目录是否存在
在项目开发的时候,caching 最好设为false,否则你根本看不到效果。
如此设定完毕后,你就可以直接在项目中使用了,下面以Index模块的index方法进行举例:在IndexAction.class.php的index的方法里
- $this->assign("test" , "This is a test string");
- $this->display();
然后到模版里:
- {$test}
就可以看到输出了。不过,这里需要注意的是,如果你$this->display()没有指定文件名,那么默认的模版文件就是default/Index/index.html,这点和原先使用TP默认的模版引擎没有什么区别。
出现问题最大的应该是在include方法里,include的使用方法是:{include file="Public/header.html"},就象我前面所说,smarty的模版路径只指到了tpl目录,但实际上,我们是在默认的default目录下操作,因此正确的写法应该是{include file="default/Public/header.html"}
如果我们写的程序要对应多模版,那么,上面那种直接写死default的方法是不行的,还好,TP为我们留了一个常量:TEMPLATE_NAME,于是我们的写法就可以是现在这样:
- {include file="`$smarty.const.TEMPLATE_NAME`/Public/header.html"}
现在试一下,是否公用目录里的header.html被加载了?
最后再报一个warning。如果是在WINDOWS下面开发并且开启了DEBUG_MODE,那么你在读取模版的时候,页面的Trace信息里,偶尔会出现一个注意:
- [ 09-01-08 14:36:02 ] 注意:[2] unlink(./Cache/tplCompile/\%%70^706^706C3AFE%%index.html.php) [function.unlink]: No such file or directory core.write_file.php 第 44 行.
这些信息,可以被忽略掉。模版文件还是会正常的生成和编译的。它只会在第一次生成模版编译文件的时候出现