【摘要】隨著當(dāng)今社會(huì)網(wǎng)絡(luò)化、信息化的不斷深入,構(gòu)建動(dòng)態(tài)網(wǎng)站已經(jīng)普及到整個(gè)網(wǎng)站制作領(lǐng)域。本文是介紹PHP技術(shù)下的Smarty模板引擎,在分析其特點(diǎn)、工作原理的基礎(chǔ)上,簡(jiǎn)要介紹了該引擎的安裝、配置以及應(yīng)用實(shí)現(xiàn)。
【關(guān)鍵詞】Smarty,PHP,Smarty安裝配置,Smarty應(yīng)用實(shí)現(xiàn)
【中圖分類號(hào)】G434 【文獻(xiàn)標(biāo)識(shí)碼】B 【論文編號(hào)】1009—8097(2007)09—0080—03
一、引言
在當(dāng)今的動(dòng)態(tài)網(wǎng)頁(yè)制作領(lǐng)域,無(wú)論是ASP 、JSP或是PHP,都是屬于內(nèi)嵌 Server Script 的網(wǎng)頁(yè)編程語(yǔ)言。因此也就有人設(shè)想,如果能把程序應(yīng)用邏輯與網(wǎng)頁(yè)呈現(xiàn)邏輯分離的話,會(huì)不會(huì)比較好呢?其實(shí)Smarty就能為我們解決這個(gè)問(wèn)題。
那讓我們先來(lái)了解一下什么是Smarty?Smarty有什么樣的作用?
Smarty指的是一種PHP模板引擎,它的作用是能夠使程序邏輯與外在內(nèi)容的分離。在實(shí)際應(yīng)用中,使用Smarty目的就是要使PHP程序員同模板設(shè)計(jì)者分離,也就是說(shuō)當(dāng)程序員改變程序的邏輯內(nèi)容時(shí),不會(huì)影響到美工的頁(yè)面設(shè)計(jì);當(dāng)美工修改頁(yè)面也不會(huì)影響到程序邏輯。這為團(tuán)隊(duì)合作完成項(xiàng)目打下了更加堅(jiān)實(shí)的基礎(chǔ),使每個(gè)人都能發(fā)揮其專長(zhǎng)?!?】
為了更好的理解Smarty,筆者認(rèn)為有必要把模板的概念重新介紹一下。看完下面這個(gè)例子,您也許會(huì)對(duì)模板有一個(gè)更好的認(rèn)識(shí)。
1996年CGI在中國(guó)開始流行的時(shí)候,早期的WEB程序員都是從HTML開始自學(xué)成材 的,在PERL中print一行行的HTML也是可以實(shí)現(xiàn)的,但是隨著網(wǎng)絡(luò)的不斷發(fā)展,頁(yè)面大小暴漲了十幾倍。于是寫CGI程序就產(chǎn)生了一個(gè)迫切的要求:分開PERL和HTML源碼。由于需求的驅(qū)動(dòng),網(wǎng)頁(yè)制作領(lǐng)域取得了很大的進(jìn)步,主要體現(xiàn)在開發(fā)小組內(nèi)部的分工上。在大型網(wǎng)站制作中,由于網(wǎng)頁(yè)美工和程序員對(duì)互相的工作相對(duì)分離,因此在進(jìn)行合作的過(guò)程中需要用一種約定的\"語(yǔ)言\"進(jìn)行交流。這種語(yǔ)言術(shù)語(yǔ)叫做\"模板\",程序邏輯和內(nèi)容表示依靠它聯(lián)系。它是一種結(jié)合了HTML和腳本語(yǔ)言特征的一種表達(dá)方式。通過(guò)這種方式,表示層可以按照用戶所希望的格式來(lái)顯示經(jīng)過(guò)邏輯層處理過(guò)的數(shù)據(jù)。通過(guò)這個(gè)例子,我們熟悉了模板的含義,進(jìn)而對(duì)Smarty的理解也就沒有問(wèn)題了?!?】
Smarty構(gòu)思相當(dāng)前衛(wèi),它已經(jīng)成為PHP設(shè)計(jì)的全新路線。Smarty可以用在多種操作系統(tǒng)平臺(tái)下,本文基于windows平臺(tái)進(jìn)行Smarty的安裝、配置和應(yīng)用實(shí)現(xiàn)。筆者所采用的開發(fā)工具:PHP語(yǔ)言(php 5.0.3)、MySQL數(shù)據(jù)庫(kù)和UltraEdit等開發(fā)工具;操作系統(tǒng)采用Windows XP;Web服務(wù)器采用IIS5.1。當(dāng)然您可以使用其它版本的工具進(jìn)行學(xué)習(xí)和制作。
二、Smarty的運(yùn)行機(jī)制
在網(wǎng)頁(yè)制作領(lǐng)域,特別是動(dòng)態(tài)網(wǎng)頁(yè)制作領(lǐng)域,對(duì)各種開發(fā)工具、組件、平臺(tái)的原理的理解以及對(duì)其特點(diǎn)的把握就顯得相當(dāng)重要。因此,我們必須對(duì)Smarty運(yùn)行機(jī)制進(jìn)行了解。
(1) Smarty的特點(diǎn)
Smarty的特點(diǎn)可以從它的優(yōu)點(diǎn)和缺點(diǎn)兩個(gè)方面來(lái)分析。
優(yōu)點(diǎn)是:運(yùn)行速度極快;效率高;模板只需被解析一次,無(wú)需重復(fù);只需重新編譯一次修改過(guò)的模板文件;它是一種可擴(kuò)展的模板語(yǔ)言,你可以自定義函數(shù)和自定義變量格式;任意模板源文件;自定義緩存處理函數(shù);可以在模板文件中嵌入PHP代碼。這些優(yōu)點(diǎn)可以使您在網(wǎng)頁(yè)制作中更加靈活、方便。
當(dāng)然,Smarty也有自己的缺點(diǎn):需要實(shí)時(shí)更新的內(nèi)容,這類型的程序使用smarty會(huì)使模板處理速度變慢;美工與程序員兼于一人的小項(xiàng)目,使用smarty會(huì)喪失php開發(fā)迅速的優(yōu)點(diǎn)?!?】
(2)Smarty的運(yùn)行機(jī)制如圖1所示,大家流程圖中可以清楚看出Smarty的工作過(guò)程,這里就不作詳述了。【4】
三、Smarty的安裝和配置
首先到Smarty的官方網(wǎng)站(http://smarty.php.net/download.php)下載最新的版本 。筆者以Smarty-2.6.13版本為例進(jìn)行介紹。下載后,解壓縮到一個(gè)指定目錄,解壓目錄可以任意選擇,這里是D:\\web\\smarty目錄。
解壓文件目錄下有四個(gè)主要文件目錄demo\\、libs\\ 、misc\\、unit_test\\。其中l(wèi)ibs目錄是主要的庫(kù)目錄,也是我們使用最多的目錄。Libs\\目錄里的庫(kù)文件主要有:
Smarty.class.php
Smarty_Compiler.class.php
Config_File.class.php
debug.tpl
\\internals\\*.php
\\plugins\\*.php
這些PHP文件可被所有應(yīng)用程序共享,因此我們千萬(wàn)不要隨意修改其中的內(nèi)容。
接下來(lái)我們來(lái)分析Smarty的基本設(shè)置。
(1)在include_path加入庫(kù)文件目錄
編輯你的php.ini文件,加入你的smarty目錄到include_path。方法是:
include_path = \".;c:\\php\\includes;c:php\\smarty\\libs\"
(2) 設(shè)置SMARTY_DIR
Smarty使用一個(gè)叫做'SMARTY_DIR'的PHP常量作為它的系統(tǒng)庫(kù)目錄.如果你的程序可以找到 Smarty.class.php文件,你不需要設(shè)置SMARTY_DIR,Smarty 將會(huì)自己運(yùn)作.但是,如果 Smarty.class.php沒有在你的include_path(php.ini里的一項(xiàng)設(shè)置)里,或者沒有在你的應(yīng)用程序里設(shè)置它的絕對(duì)路徑的時(shí)候,就必須手動(dòng)配置SMARTY_DIR 。(注意:SMARTY_DIR必須包含結(jié)尾斜杠)
手工設(shè)置SMARTY_DIR常量方法是:
define('SMARTY_DIR',' \\php\\Smarty\\');
(3)在php腳本里創(chuàng)建一個(gè)smarty的例子:
require(‘Smarty.class.php’);
$smarty = new Smarty;
?>
試著運(yùn)行一下以上腳本,如果你發(fā)現(xiàn)\"未找到Smarty.class.php 文件\"的錯(cuò)誤時(shí),你應(yīng)該這樣做,加入庫(kù)文件所在目錄的絕對(duì)路徑,方法是:
require(' \\php\\Smarty\\Smarty.class.php');
$smarty = new Smarty;
?>【5】
至此,基本配置已經(jīng)完成。
四、應(yīng)用實(shí)現(xiàn)
我們通過(guò)一個(gè)“文字傳遞”的實(shí)例來(lái)講解Smarty的應(yīng)用。
本例以D:\\web\\wenzi\\為根目錄。它要求四個(gè)目錄,默認(rèn)下命名為:tempalates, templates_c, configs ,cache. 每個(gè)都是可以自定義的,當(dāng)然也可以修改Smarty的類屬性: $template_dir, $compile_dir, $config_dir, 和 $cache_dir。Smarty的四個(gè)目錄只可以被那些庫(kù)文件訪問(wèn),不可以被網(wǎng)絡(luò)上的瀏覽器訪問(wèn)的目錄。因此為防止不安全因素,建議將那4個(gè)目錄和網(wǎng)頁(yè)文件目錄區(qū)分開來(lái)。
(1)我們?cè)贒:\\web\\wenzi\\分別建立tempalates, templates_c, configs 和 cache四個(gè)文件夾。通常使用.tpl來(lái)標(biāo)識(shí)smarty模板,下面我們就在tempalates目錄下自編一個(gè).tpl文件,取名為index.tpl。編輯內(nèi)容如下:
{* smarty 變量標(biāo)志符中用*包含的文字轉(zhuǎn)化為注釋內(nèi)容 *}
{include file=\"header.tpl\"}{*頁(yè)面開始*}
Welcome!My name is{$name}, We can help each oether.Thanks!
{include file=\"foot.tpl\"}{*頁(yè)面結(jié)束*}
上邊這個(gè)例子是一個(gè)tpl模板,其中:
①{**}是模板頁(yè)的注釋內(nèi)容,模板進(jìn)行解析時(shí)不進(jìn)行任何輸出,僅供模板設(shè)計(jì)者對(duì)模板進(jìn)行注釋,這有利于閱讀和區(qū)分其中的內(nèi)容。
②{include file=\"X.tpl\"}使用此句將一個(gè)模板文件包含到當(dāng)前頁(yè)面中,例子中將在網(wǎng)站中公用事的head.tpl與foot.tpl進(jìn)行了包含,你可以這樣想,使用這一句將X.tpl中的內(nèi)容全部復(fù)制在當(dāng)前語(yǔ)句處。當(dāng)然,你不使用這一句也可以,將X.tpl中的內(nèi)容復(fù)制到當(dāng)前語(yǔ)句處
也是完全可以了。
③{$name}: 模板變量,它是smarty中的核心部分,并且以PHP變量形式給出,這將在smarty程序中將使用。
(2)本例完整源程序如下:
①新建header.tpl,并進(jìn)行編輯:
②新建foot.tpl,并進(jìn)行編輯:
③新建index.tpl,并進(jìn)行編輯:
{include file=\"header.tpl\"}{*頁(yè)面頭*}
Welcome!My name is{$name}, We can help each oether.Thanks!
{include file=\"foot.tpl\"}{*頁(yè)面尾*}
(4)新建Index.php,并進(jìn)行編輯:
//文件名: Index.php
//作 用: 實(shí)現(xiàn)文字傳遞
include_once(\".\\Smarty.class.php\"); //包含smarty類文件
$smarty = new Smarty(); //建立smarty實(shí)例對(duì)象$smarty
$smarty->template_dir = \".\emplates\";//設(shè)置模板目錄
$smarty->compile_dir = \".\emplates_c\"; //設(shè)置編譯目錄
$smarty->left_delimiter = \"{\";
$smarty->right_delimiter = \"}\";
$smarty->assign(\"name\", \"張三\"); //進(jìn)行模板變量替換
//編譯并顯示位于.\emplates下的index.tpl模板
$smarty->display(\"index.tpl\");
?>
④最終執(zhí)行這個(gè)程序時(shí)將顯示為:
Welcome!My name is張三, We can help each other.Thanks!
感謝您的光臨!【6】
盡管這只是一個(gè)簡(jiǎn)單實(shí)現(xiàn),但是筆者卻希望它能夠起到拋磚引玉的功效,使大家都能夠了解它、使用它。只有這樣,Smarty才能發(fā)揮出耀眼的光芒。
五、結(jié)束語(yǔ)
Smarty最有意義之處在于它是PHP新體系的一部份,Smarty自官方發(fā)布以來(lái),已經(jīng)得到了廣泛的應(yīng)用和迅速的發(fā)展,其版本不斷更新。Smarty發(fā)展飛速的原因是多方面的。就其技術(shù)本身而言,具有其它PHP模板引擎不可比擬的優(yōu)點(diǎn);更實(shí)際也是最重要的是市場(chǎng)更需要Smarty這種速度快、 效率高、方便易用的PHP模板引擎。鑒于Smarty諸多的優(yōu)點(diǎn),對(duì)它的掌握就顯得相當(dāng)重要,讓Smarty技術(shù)成為我們構(gòu)筑動(dòng)態(tài)網(wǎng)站的有利臂膀!
參考文獻(xiàn)
[1] [2]陳俊宏.《PHP4網(wǎng)站實(shí)作深度研究篇》[M].北京:人民郵電出版社,2001
[3] 南順成,劉敏.《PHP網(wǎng)絡(luò)編程技術(shù)》[M].北京:國(guó)防工業(yè)出版社,2002
[4] 臺(tái)灣聯(lián)盟 http://www.twpug.net/modules/mylinks
[5] [6]Smarty官方網(wǎng)址 http://smarty.php.net