序言
刚开始接触样版引擎的 PHP 设计师,听到 Smarty 时,都会觉得很难。其实笔者也不例外,碰都不敢碰一下。但是后来在剖析 XOOPS 的程序架构时,开始发现 Smarty 其实并不难。只要将 Smarty 基础功练好,在一般应用上就已经相当足够了。当然基础能打好,后面的进阶应用也就不用怕了。
这篇文章的主要用意并非要深入探讨 Smarty 的使用,这在官方使用说明中都已经写得很完整了。笔者仅在此写下一些自己使用上的心得,让想要了解 Smarty 却不得其门而入的朋友,可以从中得到一些启示。就因为这篇文章的内容不是非常深入,会使用 Smarty 的朋友们可能会觉得简单了点。
目前本文已经第三次修订了,本想多加一些料进来;不过碍于时间的关系,很多 Smarty 的进阶技巧笔者并没有研究得很透彻,所以也不敢拿出来现眼,但笔者相信这篇文章应该能够满足大多数想学习 Smarty 的初学者了。当然本文有谬误的地方也欢迎告知,笔者会在下一次的修订中更正的。
P.S. 请在 1024 x 768 的环境下看会比较好。
jaceju@seed.net.tw 2004/02/09
Smarty介绍
什么是样版引擎
不知道从什么时候开始,有人开始对 HTML 内嵌入 Server Script 觉得不太满意。然而不论是微软的 ASP 或是开放源码的 PHP,都是属于内嵌 Server Script 的网页伺服端语言。因此也就有人想到,如果能把程序应用逻辑 (或称商业应用逻辑) 与网页呈现 (Layout) 逻辑分离的话,是不是会比较好呢?
其实这个问题早就存在已久,从交互式网页开始风行时,不论是 ASP 或是 PHP 的使用者都是身兼程序开发者与视觉设计师两种身份。可是通常这些使用者不是程序强就是美工强,如果要两者同时兼顾,那可得死掉不少脑细胞...
所以样版引擎就应运而生啦!样版引擎的目的,就是要达到上述提到的逻辑分离的功能。它能让程序开发者专注于数据的控制或是功能的达成;而视觉设计师则可专注于网页排版,让网页看起来更具有专业感!因此样版引擎很适合公司的网站开发团队使用,使每个人都能发挥其专长!
就笔者接触过的样版引擎来说,依数据呈现方式大概分成:需搭配程序处理的样版引擎和完全由样版本身自行决定的样版引擎两种形式。
在需搭配程序处理的样版引擎中,程序开发者必须要负责变量的呈现逻辑,也就是说他必须把变量的内容在输出到样版前先处理好,才能做 assign 的工作。换句话说,程序开发者还是得多写一些程序来决定变量呈现的风貌。而完全由样版本身自行决定的样版引擎,它允许变量直接 assign 到样版中,让视觉设计师在设计样版时再决定变量要如何呈现。因此它就可能会有另一套属于自己的样版程序语法 (如 Smarty) ,以方便控制变量的呈现。但这样一来,视觉设计师也得学习如何使用样版语言。
样版引擎的运作原理
首先我们先看看以下的运作图:
一般的样版引擎 (如 PHPLib) 都是在建立样版对象时取得要解析的样版,然后把变量套入后,透过 parse() 这个方法来解析样版,最后再将网页输出。
对 Smarty 的使用者来说,程序里也不需要做任何 parse 的动作了,这些 Smarty 自动会帮我们做。而且已经编译过的网页,如果样版没有变动的话, Smarty 就自动跳过编译的动作,直接执行编译过的网页,以节省编译的时间。
使用Smarty的一些概念
在一般样版引擎中,我们常看到区域的观念,所谓区块大概都会长成这样:
区域内容
这些区块大部份都会在 PHP 程序中以 if 或 for, while 来控制它们的显示状态,虽然样版看起来简洁多了,但只要一换了显示方式不同的样版, PHP 程序势必要再改一次!
在 Smarty 中,一切以变量为主,所有的呈现逻辑都让样版自行控制。因为 Smarty 会有自己的样版语言,所以不管是区块是否要显示还是要重复,都是用 Smarty 的样版语法 (if, foreach, section) 搭配变量内容作呈现。这样一来感觉上好象样版变得有点复杂,但好处是只要规划得当, PHP 程序一行都不必改。
由上面的说明,我们可以知道使用 Smarty 要掌握一个原则:将程序应用逻辑与网页呈现逻辑明确地分离。就是说 PHP 程序里不要有太多的 HTML 码。程序中只要决定好那些变量要塞到样版里,让样版自己决定该如何呈现这些变量 (甚至不呈现也行) 。
Smarty的基础
安装Smarty
首先,我们先决定程序放置的位置。
Windows下可能会类似这样的位置:「 d:\appserv\web\demo\ 」。
Linux下可能会类似这样的位置:「 /home/jaceju/public_html/ 」。
到Smarty的官方网站下载最新的Smarty套件:http://smarty.php.net。
解开 Smarty 2.6.0 后,会看到很多档案,其中有个 libs 资料夹。在 libs 中应该会有 3 个 class.php 檔 + 1 个 debug.tpl + 1 个 plugin 资料夹 + 1 个 core 资料夹。然后直接将 libs 复制到您的程序主数据夹下,再更名为 class 就可以了。就这样?没错!这种安装法比较简单,适合一般没有自己主机的使用者。
至于 Smarty 官方手册中为什么要介绍一些比较复杂的安装方式呢?基本上依照官方的方式安装,可以只在主机安装一次,然后提供给该主机下所有设计者开发不同程序时直接引用,而不会重复安装太多的 Smarty 复本。而笔者所提供的方式则是适合要把程序带过来移过去的程序开发者使用,这样不用烦恼主机有没有安装 Smarty 。
程序的数据夹设定
以笔者在Windows安装Appserv为例,程序的主数据夹是「d:\appserv\web\demo\」。安装好Smarty后,我们在主数据夹下再建立这样的数据夹:
在 Linux 底下,请记得将 templates_c 的权限变更为 777 。Windows 下则将其只读取消。
第一个用Smarty写的小程序
我们先设定 Smarty 的路径,请将以下这个档案命名为 main.php ,并放置到主数据夹下:
main.php:
include "class/Smarty.class.php";
define('__SITE_ROOT', 'd:/appserv/web/demo'); // 最后没有斜线
$tpl = new Smarty();
$tpl->template_dir = __SITE_ROOT . "/templates/";
$tpl->compile_dir = __SITE_ROOT . "/templates_c/";
$tpl->config_dir = __SITE_ROOT . "/configs/";
$tpl->cache_dir = __SITE_ROOT . "/cache/";
$tpl->left_delimiter = ' $tpl->right_delimiter = '}>';
?>
照上面方式设定的用意在于,程序如果要移植到其它地方,只要改 __SITE_ROOT 就可以啦。 (这里是参考 XOOPS 的 )
Smarty 的样版路径设定好后,程序会依照这个路径来抓所有样版的相对位置 (范例中是 'd:/appserv/web/demo/templates/' ) 。然后我们用 display() 这个 Smarty 方法来显示我们的样版。
接下来我们在 templates 数据夹下放置一个 test.htm:(扩展名叫什么都无所谓,但便于视觉设计师开发,笔者都还是以 .htm 为主。)
templates/test.htm: