11.2 Smarty的安装与配置
Smarty的安装非常简单,由于它采用的是PHP的面向对象思想编写的软件,所有只要在PHP脚本中加载Smarty类,并创建一个Smarty对象,就可以使用Smarty模板引擎了。通常这种安装方法是将Smarty类库放置到Web文档根目录之外的某个目录中,再在PHP的配置文件中将这个位置包含在include_path指令中。但如果某个PHP项目在多个Web服务器之间迁移时,每个Web服务器都必须有同样的Smarty类库配置。
11.2.1 Smarty的安装
Smarty要求的安装环境很简单,只需在Web服务器上运行PHP 4.0.6及以上版本即可。它的安装步骤如下。
(1)到Smarty官方网站http://www.smarty.net/download.php下载最新的稳定版本,所有版本的Smarty类库都可以在UNIX和Windows服务器上使用。例如,下载的软件包为Smarty-2.11.18.tar.gz。
(2)解压压缩包,解开后会看到很多文件,其中有个名称为libs的文件夹,就是存有Smarty类库的文件夹。安装Smarty只需要这一个文件夹,其他的文件都没有必要使用,如图11-2所示。
(3)在libs中应该会有三个class.php文件、一个debug.tpl、一个plugin文件夹和一个core文件夹,直接将libs文件夹复制到程序主文件夹下。
(4)在执行的PHP脚本中,通过require()语句将libs目录中的Smarty.class.php类文件加载进来,Smarty类库就可以使用了。
上面提供的安装方式适合程序移植,不用考虑主机有没有安装Smarty。
11.2.2 Smarty的配置
通过前面对Smarty类库安装的介绍,调用require()方法将Smarty.class.php文件包含到执行脚本中,并创建Smarty类的对象就可以使用了。但如果需要改变Smarty类库中一些成员的默认值,不仅可以直接在Smarty源文件中修改,也可以在创建Smarty对象以后重新为Smarty对象设置新值。Smarty类中一些需要注意的成员属性如表11-1所示。
成员属性名 | 描述 |
$template_dir | 网站中的所有模板文件都需要放置在该属性所指定的目录或子目录中。当包含模板文件时,如果不提供一个源地址,那么将会到这个模板目录中寻找。默认情况下,目录是“./templates”,也就是说它将会在和PHP执行脚本相同的目录下寻找模板目录。建议将该属性指定的目录放在Web服务器文档根之外的位置 |
$compile_dir | Smarty编译过的所有模板文件都会被存储到这个属性所指定的目录中。默认目录是“./templates_c”,也就是说它将会在和PHP执行脚本相同的目录下寻找编译目录。除了创建此目录外,在Linux服务器上还需要修改权限,使Web服务器的用户能够对这个目录有写的权限。建议将该属性指定的目录放在Web服务器文档根之外的位置 |
$config_dir | 该变量定义用于存放模板特殊配置文件的目录,默认情况下,目录是“./configs”,也就是说它将会在和PHP执行脚本相同的目录下寻找配置目录。建议将该属性指定的目录放在Web服务器文档根之外的位置 |
$left_delimiter | 用于模板语言中的左结束符变量,默认是“{”。但这个默认设置会和模板中使用的JavaScript代码结构发生冲突,通常需要修改其默认行为。例如:"<{" |
$right_delimiter | 用于模板语言中的右结束符变量,默认是“}”。但这个默认设置会和模板中使用的JavaScript代码结构发生冲突,通常需要修改其默认行为。例如:"}>" |
$caching | 告诉Smarty是否缓存模板的输出。默认情况下,它设为0或无效。也可以为同一个模板设有多个缓存,当值为1或2时启动缓存。1告诉Smarty使用当前的$cache_lifetime变量判断缓存是否过期。2告诉Smarty使用生成缓存时的cache_lifetime值。用这种方式正好可以在获取模板之前设置缓存生存时间,以便较精确地控制缓存何时失效。建议在项目开发过程中关闭缓存,将值设计为0 |
$cache_dir | 在启动缓存的特性情况下,这个属性所指定的目录中放置Smarty缓存的所有模板。默认情况下,它是"./cache",也就是说可以在和PHP执行脚本相同目录下寻找缓存目录。也可以用自己的自定义缓存处理函数来控制缓存文件,它将会忽略这项设置。除了创建此目录外,在Linux服务器上还需要修改权限,使Web服务器的用户能够对这个目录有写的权限。建议将该属性指定的目录放在Web服务器文档根之外的位置 |
$cache_lifetime | 该变量定义模板缓存有效时间段的长度(单位s)。一旦这个时间失效,则缓存将会重新生成。如果要想实现所有效果,$caching必须因$cache_lifetime需要而设为“true”。值为-1时,将强迫缓存永不过期。0值将导致缓存总是重新生成(仅有利于测试,一个更有效的使缓存无效的方法是设置$caching = 0) |
如果不修改Smarty类中的默认配置,也需要设置几个必要的Smarty路径,因为Smarty将会在和PHP执行脚本相同的目录下寻找这些配置目录。但为了系统安全,通常建议将这些目录放在Web服务器文档根目录之外的位置上,这样就只有通过Smarty引擎使用这些目录中的文件了,而不能再通过Web服务器在远程访问它们。为了避免重复地配置路径,可以在一个文件里配置这些变量,并在每个需要使用Smarty的脚本中包含这个文件即可。将以下这个文件命名为main.inc.php,并放置到主文件夹下,和Smarty类库所在的文件夹libs在同一个目录中,如下所示。
先初始化Smarty的路径,将文件命名为main.php。
<?php include "./libs/Smarty.class.php"; //包含Smarty类库所在的文件 define('SITE_ROOT', '/usr/www'); //声明一个常量指定非Web服务器的根目录 $smarty = new Smarty(); //创建一个Smarty类的对象$smarty $smarty->template_dir = SITE_ROOT . "/templates/"; //设置所有模板文件存放的目录 $smarty->compile_dir = SITE_ROOT . "/templates_c/"; //设置所有编译过的模板文件存放的目录 $smarty->config_dir = SITE_ROOT . "/config/"; //设置模板中特殊配置文件存放的目录 $smarty->cache_dir = SITE_ROOT . "/cache/"; //设置存放Smarty缓存文件的目录 $smarty->caching=1; //设置开启Smarty缓存模板功能 $smarty->cache_lifetime=60*60*24*7; //设置模板缓存有效时间段的长度为7天 $smarty->left_delimiter = '<{'; //设置模板语言中的左结束符 $smarty->right_delimiter = '}>'; //设置模板语言中的右结束符 ?>
在Smarty类中并没有对成员属性使用private封装,所以创建Smarty类的对象以后就可以直接为成员属性赋值。若按上面的设置,程序如果要移植到其他地方,只要改变SITE_ROOT值就可以了。
如果按上面规定的目录结构去存放数据,所有的模板文件都存放在templates目录中,在需要使用模板文件时,模板引擎会自动到该目录中去寻找对应的模板文件;如果在模板文件中需要加载特殊的配置文件,也会到configs目录中去寻找;如果模板文件有改动或是第一次使用,会通过模板引擎将编译过的模板文件自动写入到templates_c目录中建立的一个文件中;如果在启动缓存的特性情况下,Smarty缓存的所有模板还会被自动存储到cache目录中的一个文件或多个文件中。由于需要Smarty引擎去主动修改cache和templates_c两个目录,所以要让PHP脚本的执行用户有写的权限。