3.5 认识Smarty模板引擎
如果你说学过PHP而没学过Smarty模板引擎,我相信所有的面试官都会觉得你在撒谎。虽然PHP语言本身就可以嵌入到HTML页面中去进行数据展现,但是这样做我们不仅需要书写大量的<?php ?>标签,而且在某些地方还需要嵌入大量的冗余代码,另外也不利于逻辑的解耦和分离。所以,在项目中我们还是需要一个专门的模板引擎,而Smarty就是PHP语言在这个领域的不二选择了。
目前,最新的Smarty版本已经出到3.x,应该说与2.x版本相比做了很大的改进,接下来简单介绍一下Smarty的使用。实际上,Smarty的下载包中本来就包含了一些实例代码。首先,从官方下载地址(http://www.smarty.net/download)下载最新的稳定的开发包版本(Latest Stable Release),我们在这里使用的是Smarty 3.1.5版本,该版本必须运行于PHP 5.2以上的版本中。
解压之后,我们把Smarty-3.1.5重新命名为smarty并放入我们前面配置好的站点目录,然后在浏览器中打开demo地址(http://php-demo/smarty/demo/),打开的界面如图3-15所示。
小贴士:如果你找不到站点目录,请返回查看3.2.3节中Apache配置虚拟主机的部分内容。
以上这个界面就是由Smarty模板引擎渲染出来的页面,其对应的PHP文件的代码,见代码清单3-15,已添加注释,方便读者阅读。
代码清单 3-15
<?php
// 包含 Smarty 类库
require('.../libs/Smarty.class.php');
// 初始化 Smarty 对象
$smarty = new Smarty;
// 初始化 Smarty 配置
//$smarty->force_compile = true;
$smarty->debugging = true;
$smarty->caching = true;
$smarty->cache_lifetime = 120;
// 各种变量赋值
$smarty->assign("Name","Fred Irving Johnathan Bradley Peppergill",true);
$smarty->assign("FirstName",array("John","Mary","James","Henry"));
$smarty->assign("LastName",array("Doe","Smith","Johnson","Case"));
$smarty->assign("Class",array(array("A","B","C","D"),array("E","F","G","H"),
array("I","J","K","L"),array("M","N","O","P")));
$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell"
=> "3"),array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")));
$smarty->assign("option_values", array("NY","NE","KS","IA","OK","TX"));
$smarty->assign("option_output", array("New York","Nebraska","Kansas","Iowa",
"Oklahoma","Texas"));
$smarty->assign("option_selected", "NE");
// 渲染相应模板
$smarty->display('index.tpl');
?>
从上面的代码我们可以很清晰地看到Smarty的一般使用过程:先初始化Smarty对象,然后配置Smarty参数,接着就是进行各种变量的赋值,最后在模板页面展现出来。对于本例,大家可以看看index.tpl中的模板写法,当然Smarty的用法还是很丰富的,想学好它,最好的老师就是官方文档了,请参考“http://www.smarty.net/docs/en/”。以下我们也简单介绍几种在开发时需要掌握的核心要点。
- 常用配置选项
在使用Smarty模板引擎之前,我们必须先学习如何配置Smarty的选项。而在Smarty的常见选项中,我们首先必须了解4个最基本的目录选项。
模板目录(template):本目录用于存储模板文件,需要渲染对应文件时把文件相对地址作为参数传入display方法即可。比如,我们有一个模板文件地址位于template/test/index.tpl,那么我们则应当使用“$smarty->display('test/index.tpl');”语句来渲染该模板。
编译模板目录(template_c):本目录主要用于存储Smarty模板引擎产生的模板编译文件,Smarty也正是使用这种方法来提高执行效率的。当然,我们在部署项目时一定要注意该目录必须是可写的。
缓存目录(cache):Smarty允许把展示过的模板缓存起来,使用此功能将进一步提高模板引擎的运行速度。当然,我们还可以通过设置cache_lifetime属性来控制缓存文件的有效时间。
配置目录(configs):这个目录可以用于保存Smarty模板引擎的配置文件,不过在实际项目中使用得比较少,我们经常会把配置放入项目统一的配置目录。
在实际项目中我们经常使用继承和重载的方式来定制和配置我们自己的Smarty模板类。比如,在代码清单3-16中,我们就实现了一个自定义的My_Smarty类,此类中设置了Smarty模板的必要目录和缓存的生效时间。
代码清单 3-16
<?php
// 包含 Smarty 类库
require 'Smarty.class.php';
// 定义自己的模板类
class My_Smarty extends Smarty
{
function __construct()
{
// 重载 Smarty 基类
parent::__construct();
// 配置目录
$this->setTemplateDir('/path/to/templates/');
$this->setCompileDir('/path/to/templates_c/');
$this->setConfigDir('/path/to/configs/');
$this->setCacheDir('/path/to/cache/');
// 配置缓存
$this->caching = true;
$this->cache_lifetime = 60;
// 设置默认变量
$this->assign('app_name', 'My App');
}
}
?>
在上述代码中,setTemplateDir方法用于设置模板目录,setCompileDir方法用于设置编译过的中间模板目录,setConfigDir和setCacheDir方法分别用于设置Smarty模板的配置文件和缓存文件的目录。
- 常用模板语法
Smarty 3.0中的语法实际上和PHP的语法已经比较接近了,使用起来相当方便。接下来让我们来熟悉一下Smarty模板语言的基本用法。首先,我们要知道所有的Smarty的默认界限符号是大括号(当然这个也是可以设置的)。因此,我们可以通过类似于“{$var}”的写法来获取Smarty变量“var”的值。其次,Smarty中为我们提供了大量的字符串辅助标签,非常方便,例如,如果需要把某个变量的首字母大写,使用方法如代码清单3-17所示。
代码清单 3-17
{$articleTitle|capitalize}
另外,如果我们想把时间戳转化为需要的时间格式,使用方法如代码清单3-18所示。
代码清单 3-18
{$smarty.now|date_format}
{$smarty.now|date_format:"%Y-%m-%d"}
此外,我们还可以使用代码清单3-19中的类似方法来过滤非法字符,避免XSS(跨站攻击)的风险。
代码清单 3-19
{$articleTitle|escape:'html'}
{$articleTitle|escape:'htmlall'}
接下来,我们还会介绍一下在展示过程中最常用到的循环语句的写法。实际上在Smarty中有两种最常用到的循环语句写法,一种是“{section}”,另一种是“{foreach}”。现在假设我们需要循环一个散列数组列表“$userList”,散列数组中包含“id”和“name”两个字段,示例见代码清单3-20,大家可以好好理解一下。
代码清单 3-20
{* 注释:使用section标签循环 *}
{section name=user loop=$userList}
ID : {$userList[user].id}
NAME : {$userList[user].name}
{/section}
{* 注释:使用foreach标签循环 *}
{foreach $userList as $user}
ID : {$user.id}
NAME : {$user.name}
{/foreach}
从上面的代码中可以看出,Smarty 3.0的foreach用法已经和PHP的语法非常类似了,既容易理解又方便实用,推荐大家使用。另外,在Smarty中注释默认使用的是“{...}”标签,这个也需要大家了解一下。
由于篇幅限制,Smarty模板引擎的基本使用我们介绍到这里,关于其更多的信息请大家参考官方的文档并动手实践一下,毕竟Smarty模板也是使用PHP进行服务端开发的必不可少的一项技能。