20.3 PHP开发中的模板技术
在基于MVC模型的Web应用开发中,模板是不可或缺的。模板定义了一个并不完全的类HTML文件,它为用户视图提供了最基本内容的框架,一些重要的数据需要在程序中添加到模板中,从而形成完整的用户视图。本节将首先向读者介绍模板的基本概念和其在PHP程序中的用法,然后介绍一个优秀的模板引擎——Smarty。
20.3.1 什么是模板
对于什么是模板这个问题,可以这样解释:模板是一组插入了HTML的PHP脚本,或者说是插入了PHP脚本的HTML,通过插入的内容来表示变化的数据。例如下列代码展示的就是一个简单模板文件的例子。
01 <html> 02 <head> 03 <title>{pagetitle}</title> 04 </head> 05 <body> 06 {greetings} 07 <body> 08 </html>
【代码解析】当用户浏览时,由PHP程序文件打开该模板文件,将模板文件中定义的变量进行替换,动态生成内容,从而向用户显示一个完整的HTML页面。本例中的模板变量就是{greetings}和{pagetitle},这两个变量是在PHP程序使用该模板时,根据具体的内容来替换。
20.3.2 在PHP程序中使用模板
这一小节通过一个具体实例来演示如何在PHP程序中使用模板文件。首先需要定义一个模板文件,这里就使用20.3.1小节中的示例代码,将其按文件名temp.html保存。接下来编写PHP文件,用来处理模板,如代码20-1所示。
代码20-1 在PHP程序中使用模板20-1.php
01 <?php 02 $template_file = "temp.html"; // 模板文件 03 04 $fs = fopen($template_file,"r"); // 打开文件 05 $content = fread($fs, filesize($template_file)); // 读取文件内容 06 fclose($fs); // 关闭文件 07 08 $content = print_page($content,"pagetitle"," 模板应用"); 09 $page = print_page($content,"greetings"," 你好,这个页面由模板生成"); 10 echo $page; 11 12 function print_page($temp_c,$temp_v,$str_c) 13 { 14 return ereg_replace("\{".$temp_v."\}",$str_c,$temp_c); 15 } 16 ?>
图20-2 在PHP程序中使用模板
【代码解析】代码在程序中打开一个模板文件,读出模板文件的内容。然后定义一个函数用来处理模板中的模板变量,如代码第12~15行所示,函数print_page()非常简单,只有一行代码,这行代码通过正则表达式替换函数将模板变量替换为程序中的实际数据。
通过浏览器访问20-1.php,可以看到如图20-2所示的效果。
虽然这个示例程序很小,却体现了模板在PHP程序中的处理思想。当然实际的模板引擎要比这个复杂得多,也更能满足实际需要。
20.3.3 Smarty模板引擎介绍
对PHP来说,有很多模板引擎可供选择,比如最早的PHPLIB template和后起之秀Fast template,经过数次升级,已经相当成熟稳定。本小节要介绍的是一款易于使用且功能强大的PHP模板引擎——Smarty。它使逻辑程序和外在的内容分离,提供了一种Web页面易于管理的方法。Smarty显著特点之一是“模板编译”,这意味着Smarty读取模板文件后用它们创建PHP脚本,这些脚本创建以后将被执行,而不是去解析模板文件的语法。通过Smarty的官方网站可以获取Smarty模板引擎,官方网站的网址是http://www.smarty.net/。本书关于Smarty的介绍基于稳定的2.5版本。
下载Smarty安装包,解压后有3个目录,其中libs模板文件目录下有4个类文件1个目录。Smarty.class.php是整个Smarty模板的核心类,通常需要在Web应用程序目录下建立如下所示的目录结构。
·appdir/smarty/libs,此目录对应压缩包下的libs目录,存放smarty需要的类文件。
·appdir/smarty/templates_c,此目录存放模板文件,程序用到的模板文件都放在这里。
·appdir/smarty/templates,存放模板属性文件。
·appdir/smarty/configs,存放相关配置文件。
20.3.4 Smarty模板引擎的使用
下面通过一个实例程序介绍Smarty模板引擎在PHP程序中的使用。首先定义一个简单模板文件,命名为20-2.tpl,并保存在当前目录下的template子目录下。.tpl是Smarty模板文件的后缀名。该模板文件如代码20-2所示。
代码20-2 一个简单的Smarty模板文件20-2.tpl
01 {* 这里是Smarty 模板的注释 *} 02 <html> 03 <head> 04 <title>{$page_title}</title> 05 </head> 06 07 <body> 08 大家好,我是{$name} 模板引擎, 欢迎大家在PHP 程序中使用{$name} 。 09 </body> 10 11 </html> 12 {* 模板文件结束 *}
【代码解析】{*与*}之间的部分是模板页的注释,它在Smarty对模板进行解析时不进行任何处理,仅起说明作用。{$name}是模板变量,它是Smarty中的核心组成,用左边界符“{”与右边界符“}”包含着,以PHP变量的形式给出。
接下来完成显示模板的PHP程序,如代码20-3所示。
代码20-3 在PHP程序中使用Smarty模板引擎20-3.php
01 <?php 02 include("./Smarty/libs/Smarty.class.php"); // 包含smarty 类文件 03 04 $smarty = new Smarty(); // 建立Smarty 类的实例$smarty 05 $smarty->template_dir = "./templates"; // 设置模板目录 06 $smarty->compile_dir = "./templates_c"; // 设置编译目录 07 08 $smarty->left_delimiter = "{"; // 设定左右边界符为{} ,Smarty 推荐使用的是<{}> 09 $smarty->right_delimiter = "}"; 10 11 $smarty->assign("name", "Smarty"); // 进行模板变量替换 12 $smarty->assign("page_title", "Smarty 的使用"); // 进行模板变量替换 13 14 $smarty->display("20-2.tpl"); // 编译并显示位于./templates 下的20-2.tpl 模板 15 ?>
图20-3 使用Smarty模板引擎输出的HTML页面
【代码解析】代码第02行将Smarty类新的类文件Smarty.class.php包含到当前文件中。代码第04行生成Smarty类的实例$smarty,它代表了一个Smarty模板。代码第05、06行分别设置模板文件所在目录及模板文件编译后存放目录。代码第08、09行设定了模板变量的界定符为“{”和“}”。第11、12行将模板变量替换为实际内容,最后在代码第14行显示最终用户看到HTML视图。代码20-3的执行结果如图20-3所示。
如果转到当前目录下的子目录template_c,可以看到其中有一个由Smarty模板引擎生成的PHP文件,这个文件最终由Smarty模板引擎调用,向浏览器段输出。打开这个文件,可以看到如下代码。
<html> <head> <title><?php echo $this->_tpl_vars['page_title']; ?> </title> </head> <body> 大家好,我是<?php echo $this->_tpl_vars['name']; ?> 模板引擎, 欢迎大家在PHP 程序中使用<?php echo $this->_tpl_vars['name']; ?> 。 </body> </html>
从这段代码可以看到,20-2.tpl中的模板变量都被Smarty模板引擎换成了PHP普通的输出数据的用法,即使用echo语句输出Smarty模板引擎获取的实际变量。从这个文件的内容,读者应该看到一点Smarty模板引擎处理模板的机制。
本小节只是举了一个很简单的例子,告诉读者Smarty模板引擎的使用方法及其实现机理,有兴趣的读者还需要通过Smarty模板引擎的官方网站,获取更多的如何应用Smarty模板引擎的知识,并在较大规模的实际应用中尝试使用Smarty模板引擎。