11.3 Smarty的使用
安装好Smarty模板引擎之后,本节学习如何使用Smarty技术进行PHP的MVC程序设计。这里主要对Smarty显示技术、Smarty语法及常用方法进行阐述。
11.3.1 Smarty使用示例
通过前面的介绍,如果了解了Smarty并学会安装,就可以通过一个简单的示例测试一下,使用Smarty模板编写的大型项目也会有同样的目录结构。按照11.2节的介绍需要创建一个项目的主目录shop,并将存放Smarty类库的文件夹libs复制这个目录中,还需要在该目录中分别创建Smarty引擎所需要的各个目录。如果需要修改一些Smarty类中常用成员属性的默认行为,可以在该目录中编写一个类似11.2节中介绍的main.php文件。
在本例中,要执行的是在PHP程序中替代模板文件中特定的Smarty变量。首先在项目主目录下的templates目录中创建一个模板文件,这个模板文件的扩展名可以自定义。注意,在模板中声明了$title和$content两个Smarty变量,都放在大括号“{}”中,大括号是Smarty的默认定界符,但为了在模板中嵌入CSS及JavaScript的关系,最好是将它换掉,如改为“<{”和“}>”的形式。这些定界符只能在模板文件中使用,并告诉Smarty要对定界符所包围的内容完成某些操作。在templates目录中创建一个名为“shop.html”的模板文件,代码如下所示。
简单的Smarty设计模板(templates/shop.html):
<html> <head> <meta http-equiv="Content-type" content="text/html; charset= gb2312"> <title> { $title } </title> </head> <body> { $content } </body> </html>
这里要注意,shop.html这个模板文件一定要位于templates目录或它的子目录内,除非通过Smarty类中的$template_dir属性修改了模板目录。另外,模板文件只是一个表现层界面,还需要PHP变量值传入Smarty模板。直接在项目的主目录中创建一个名为index.php的PHP脚本文件,作为templates目录中shop.html模板的应用程序。
在项目的主目录中创建index.php代码如下所示。
<?php //第一步:加载 Smarty 模板引擎 require("libs/Smarty.class.php"); //第二步:建立 Smarty 对象 $smarty=new Smarty(); //第三步:设定Smarty的默认属性(上面已举例,这里略过) $smarty->assign("title", "HBSI综合多用户商城"); //第四步:用assign()方法将变量置入模板里 $smarty->assign("content", " HBSI综合多用户商城V2.6版上线了"); //也属于第四步,用assign()方法将变量置入模板里 $smarty->display("shop.html"); //利用Smarty的display()方法将网页输出 ?>
这个示例展示了Smarty能够完全分离Web应用程序逻辑层和表现层。用户通过浏览器直接访问项目目录中的index.php文件,就会将模板文件shop.html中的变量替换后显示出来。再到项目主目录下的templates_c目录底下,会看到一个经过Smarty编译生成的文件%%6D^6D7^6D7C5625%%shop.html.php。打开该文件后的代码如下所示。
Smarty编译过的文件(templates_c/%%6D^6D7^6D7C5625%%shop.html.php):
<?php /* Smarty version 2.11.18, created on 2009-04-15 09:19:13 compiled from shop.html */ ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=gb2312"> <title> <?php echo $this->_tpl_vars['title']; ?> </title> </head> <body> <?php echo $this->_tpl_vars['content']; ?> </body> </html>
这就是Smarty编译过的文件,是在第一次使用模板文件shop.html时由Smarty引擎自动创建的,它将我们在模板中由特殊定界符声明的变量转换成了PHP的语法来执行,它是一个PHP动态脚本文件。下次再读取同样的内容时,Smarty就会直接抓取这个文件来执行了,直到模板文件shop.html有改动时,Smarty才会重新编译生成编译文件。
11.3.2 Smarty的使用步骤
在PHP程序中,使用Smarty需要以下5个步骤。
(1)加载Smarty模板引擎,例如:require("Smarty.class.php");。
(2)建立Smarty对象,例如:$smarty=new Smarty();。
(3)修改Smarty的默认行为,例如:开启缓存机制、修改模板默认存放目录等。
(4)将程序中动态获取的变量,通过Smarty对象中的assign()方法置入模板里。
(5)利用Smarty对象中的display()方法将模板内容输出。
在这5个步骤中,可以将前三个步骤定义在一个公共文件中,像前面介绍过的用来初始化Smarty对象的文件main.php。因为前三步是Smarty在整个PHP程序中应用的核心,像常数定义、外部程序加载、共享变量建立等,都是从这里开始的。所以通常都是先将前三个步骤做好放入一个公共文件中,之后每个PHP脚本中只要将这个文件包含进来就可以了,因此在程序流程规划期间,必须好好构思这个公用文件中设置的内容。后面的两个步骤是通过访问Smarty对象中的方法完成的。这里有必要介绍一下assign()和display()方法。
1.assign()方法
在PHP脚本中调用该方法可以为Smarty模板文件中的变量赋值。它的使用比较容易,原型如下所示。
void assign (string varname, mixed var)
它是Smarty对象中的方法,用来赋值到模板中,通过调用Smarty对象中的assign()方法,可以将任何PHP所支持的类型数据赋值给模板中的变量,包含数组和对象类型。使用的方式有两种,可以指定一对“名称/数值”或指定包含“名称/数值”的联合数组,如下所示。
$smarty->assign("name","HBSI"); //将字符串"HBSI"赋给模板中的变量{$name} $smarty->assign("name1",$name); //将变量$name的值赋给模板中的变量{$name1}
2.display()方法
基于Smarty的脚本中必须用到这个方法,而且在一个脚本中只能使用一次,因为它负责获取和显示由Smarty引擎引用的模板。该方法的原型如下所示。
void display (string template [, string cache_id[, string compile_id]]) //用来获取和显示Smarty模板
第一个参数template是必选的,需要指定一个合法的模板资源的类型和路径。还可以通过第二个可选参数cache_id指定一个缓存标识符的名称,第三个可选参数compile_id在维护一个页面的多个缓存时使用,在下面的示例中使用多种方式指定一个合法的模板资源,如下所示。
//获取和显示由Smarty对象中的$template_dir属性所指定目录下的模板文件index.html $smarty->display("index.html"); //获取和显示由Smarty对象中的$template_dir变量所指定的目录下子目录admin中的模板 文件 index.html $smarty->display("admin/index.html"); //绝对路径,用来使用不在$template_dir模板目录下的文件 $smarty->display("/usr/local/include/templates/header.html"); //绝对路径的另外一种方式,在Windows平台下的绝对路径必须使用"file:"前缀 $smarty->display("file:C:/www/pub/templates/header.html");
在使用Smarty的PHP脚本文件中,除了基于Smarty的内容需要上面5个步骤外,程序的其他逻辑没有改变。例如,文件处理、图像处理、数据库连接、MVC的设计模式等,使用形式都没有发生变化。