文章教程

11.3Smarty的使用

9/17/2020 9:49:37 PM 人评论 次浏览

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的设计模式等,使用形式都没有发生变化。

教程类别