04月
21
smarty学习总结
文章分类:PHP 查看次数:465 + 31
花了半天的时间把smarty手册大概翻了一下,总结了一些使用要点和技巧。
先来说说安装
安装也许要说?恩,其实还是有点小学问的,我是通过继承来实现安装的,看代码
//setup.php
require("libs/Smarty.class.php");
class Smarty_C extends Smarty{
function Smarty_C(){
$this->smarty();
$this->template_dir = 'templates';
$this->compile_dir = 'templates_c';
$this->cache_dir = 'cache';
$this->left_delimiter = '<{';
$this->right_delimiter = '}>';
$this->caching = 1;
$this->cache_lifetime = 1800;
$this->config_dir = 'config';
//regist functions
$this->register_block('dynamic','smarty_block_dynamic',false);
}
}
function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
}
我觉得这样更方便管理,可以在类里面完成插件的注册,而不用实例化一个对象后再注册,使用方法还是类似
require('setup.php');
$smarty = new Smarty_C();
//$smarty->assign('title','hello lzyy');
$smarty->display('test.tpl');
config文件的设置
除了建立常规的templates,templates_c,cache文件夹外,我觉得config文件夹也很必要,可以在里面建立config文件,然后在模板里载入
比如config文件夹下面,有一个test.conf文件
bgcolor = '#cc0000'
title = 'hello world'
# customer variables
[customer]
title = 'hello lzyy'
然后就可以在模板里载入,并使用其中的变量了
<{ include file='header.tpl' title=#title# }>
<body style='background:<{ #bgcolor# }>'>
config里面的变量通过#varname#来获取,同时如果在config里面,指定了section,比如上面的customer,并且在载入config文件的时候指定了相应的section,那么就可以使用该section里面的变量(全局变量自动载入,如果section里面的变量名跟全局变量的变量名一样,那么前者将覆盖后者)
关于缓存
拿动态内容作为例子,如果涉及到根据传递的参数查询数据库,比如user_id,那么有两种缓存策略
1、使用display($filename,$user_id)
这样就能为不同的user_id产生不同的缓存文件,但是问题也来了,如果用户数很多的话,那么会在缓存文件夹里生成很多的类似文件,无论是从磁盘占用,还是查询速度都会受到影响。
2、对动态内容不执行缓存
可以通过两种方法来解决。一个是smarty内置的insert方法,我感觉这个不够灵活和方便;第二个方法就是我们在安装的时候注册的一个函数dynamic,使用方法
<{ '0'|date_format:'%D %H:%M:%S' }>
<{ /dynamic }>
插件
插件默认都放在plugins文件夹下面,如果自己想写一个插件,只要把写完的插件按照smarty的方式命名,并放到这个文件夹下面就可以使用了。
插件的使用方法
function usage:{funcname data='hello baby'}(function.name.php)
modifiler usage:{$data|upper}(modifiler.name.php)
block usage:{func} ... {/func}(block.name.php)
具体的参数可以参考smarty手册,后者直接打开相应的php文件查看。
小提示
- 如果一个smarty变量为空(''),并且要输出一个默认值时,可以使用default(eg:$text|default:' ')
- smarty很方便的一个特性是支持include,并且php里assign的变量可以在include进来的file里显示
- 如果要显示时间的话,最好传递给smarty一个时间戳,这样就能方便地控制时间的显示格式
- smarty内置了对全局变量的引用,比如{$smarty.get.page},{$smarty.cookie.name}
- 使用section代替foreach
闲言碎语
由于smarty很好很强大,有不少自己的用法,所以有人爱之,有人恨之。反正我是挺喜欢的,其实常用的功能就那么几个,花个一两天足矣掌握,而那些附加的功能也提供了更多的解决办法,但千万不要以为,功能越多,执行速度就会受影响,其实不是的,因为那些附加功能都是用到的时候才载入的。还有,使用smarty的网站,基本都是给予MVC架构,那么就会有一个问题,到底该不该在前端表现层出现逻辑判断和流程控制?在《Sams Advanced PHP Programming》里,里面讲到view层可以出现display logic but not business logic。也就是说可以出现表现方面的逻辑判断而不是应用方面的逻辑判断(有点不好理解,hoho)。
相关文章
评论
共1条评论 to “smarty学习总结”
发表评论

Smarty 能改变你编写 PHP 的习惯,加油
[回复此评论]