PHP中Smarty模板的使用
一、 什么是模板引擎
不知道從什么時候開始,有人開始對 HTML 內嵌入 Server Script 覺得不太滿意。然而不論是微軟的 ASP 或是開放源碼的 PHP,都是屬于內嵌 Server Script 的網頁伺服端語言。因此也就有人想到,如果能把程序應用邏輯 (或稱商業(yè)應用邏輯) 與網頁呈現 (Layout) 邏輯分離的話會比較好。
其實這個問題早就存在已久,從交互式網頁開始風行時,不論是 ASP 或是 PHP 的使用者都是身兼程序開發(fā)者與視覺設計師兩種身份。
所以模版引擎就應運而生啦!模版引擎的目的,就是要達到上述提到的邏輯分離的功能。它能讓程序開發(fā)者專注于資料的控制或是功能的達成;而視覺設計師則可專注于網頁排版,讓網頁看起來更具有專業(yè)感!因此模版引擎很適合公司的網站開發(fā)團隊使用,使每個人都能發(fā)揮其專長!
就筆者接觸過的模版引擎來說,依資料呈現方式大概分成:需搭配程序處理的模版引擎和完全由模版本身自行決定的模版引擎兩種形式。
在需搭配程序處理的模版引擎中,程序開發(fā)者必須要負責變量的呈現邏輯,也就是說他必須把變量的內容在輸出到模版前先處理好,才能做 assign 的工作。換句話說,程序開發(fā)者還是得多寫一些程序來決定變量呈現的風貌。而完全由模版本身自行決定的模版引擎,它允許變量直接 assign 到模版中,讓視覺設計師在設計模版時再決定變量要如何呈現。因此它就可能會有另一套屬于自己的模版程序語法 (如 Smarty) ,以方便控制變量的呈現。但這樣一來,視覺設計師也得學習如何使用模版語言。
二、 自定義模板引擎
引擎類:Mytpl.class.php
class Mytpl{
private $data = array();
private $newFile;
//接收數據
public function assign($key,$val){
$this->data[$key] = $val;
}
//顯示模版
public function display($tpl){
/*
$userlist = $this->data['userlist'];
$title = $this->data['title'];
*/
/*
foreach($this->data as $key=>$val){
$userlist
$$key = $val;
}
*/
$this->bianyi($tpl);
extract($this->data);
include $this->newFile;
}
public function bianyi($tpl){
$html = file_get_contents($tpl);
//正則
// {$title}
$match = '/\{(.*?)\}/';
//替換
$html = preg_replace($match,'',$html);
//重新保存文件
$this->newFile = './view_c/'.md5($tpl).'.php';
file_put_contents($this->newFile,$html);
}
}
?>
執(zhí)行的PHP文件:(導入引擎類)v5.php
//查詢數據庫
//在頁面頂端做所有的邏輯處理,下面的html代碼里面只負責顯示
$arr = array(
array('id'=>1,'name'=>'bobo','age'=>18),
array('id'=>1,'name'=>'bobo','age'=>18),
array('id'=>1,'name'=>'bobo','age'=>18),
array('id'=>1,'name'=>'bobo','age'=>18),
);
$title = '測試標題';
//包含類文件
include './Mytpl.php';
//實例化對象
$tpl = new Mytpl();
//分配數據
$tpl->assign('userlist', $arr);
$tpl->assign('title', $title);
$tpl->assign('msg', '測試字符串');
$tpl->display('./view/tpl.php');
?>
調用的模板:(前端美工)index.html(后綴名也可以使用其他.tpl)
{$title}
三、 選擇Smarty模板引擎
概述:在引擎中,Smarty將模板“編譯”(基于復制和轉換)成PHP腳本。它只會發(fā)生一次,當第一次讀取模板的時候,指針前進時調取編譯版本,Smarty幫你保管它,因此模板設計者只需要編輯Smarty模板,而不必管理編譯版本。這也使得模板很容易維護,而執(zhí)行速度非?,因為它只是PHP。如果開啟模板緩存,則直接運行緩存的靜態(tài)頁面,而不再去執(zhí)行PHP的應用程序(沒有反復鏈接數據庫和執(zhí)行大量SQL語句的動作),大大提高了頁面的訪問速度。
Smarty模板引擎優(yōu)點:
1. 速度:相對于其他的模板引擎技術而言,采用Smarty編寫的程序可以獲取大速度的提高,主要的是可以提高開發(fā)速度,程序員、美工能夠快速開發(fā)部署,易于維護。
2. 編譯型:采用Smarty編寫的程序運行時要編譯(組合)成一個非模板技術的PHP文件,這個文件采用PHP和HTML混合的方式,在下一次訪問模板時將Web請求直接轉換到這個文件中,而不再進行模板重新編譯(在源程序沒有改動的情況下),使后續(xù)的調用速度更快。
3. 緩存技術:Smarty提供了一個可選擇使用的緩存技術,它可以將用戶終看到的HTML文件緩存成一個靜態(tài)的HTML頁面。當用戶開啟Smarty緩存時,并在設定的時間內,將用戶的Web請求直接轉換到這個靜態(tài)的HTML文件中來,這相當于調用一個靜態(tài)的HTML文件。
4. 插件技術:Smarty模板引擎是采用PHP面向對象技術實現的,不僅可以在源代碼中修改,還可以自定義一些功能插件(就是一些按規(guī)則自定義的功能函數)。
5. 強大的表現邏輯:PHP負責后臺,Smarty模板負責前端。在Smarty模板中能夠通過條件判斷及迭代地處理數據,它實際上也是一種自定義的程序設計語言,客戶在開發(fā)中富有彈性。并拋棄應用程序中PHP與其他語言雜糅的描述方式,使之統(tǒng)一樣式,從PHP獨立出來,比較安全。另外,語法簡單,容易理解,不必具備PHP知識。
6. 模板繼承:模板的繼承是Smarty 3的新事物,它也是諸多偉大新特性之一。在模板繼承里,我們將保持模板作為獨立頁面而不用加載其他頁面,可以操縱內容塊繼承它們。這使得模板更直觀,更有效和易管理。
四、 安裝配置并使用Smarty模板
概要:Smarty的安裝比較容易,因為它不屬于PHP的應用擴展模塊,只是采用PHP面向對象思想編寫的軟件,只要在我們的PHP腳本中加載Smarty類,并創(chuàng)建一個Smarty對象,就可以使用Smarty模板引擎了。
安裝步驟如下:
1. 需要到Smarty官網//www.smarty.net/download.php下載新穩(wěn)定版本,所有版本的Smarty類庫都可以在UNIX和Windows服務器上使用。
2. 然后解壓壓縮包,解開后看到很多文件,其中有一個名稱為libs的文件夾,就是存有Smarty類庫的文件夾。其他文件可以刪除,把libs目錄拷貝到需要使用的位置。
3. 在libs中應該會有Smarty.class.php和SmartyBC.class.php兩個文件、一個debug.tpl、一個自定義插件plugins文件夾(外部使用可以擴充)和一個系統(tǒng)插件sysplugins文件夾(內部插件)。直接將libs目錄賦值指定的位置(libs可以改名,不建議更改)
4. 在執(zhí)行的PHP腳本中,通過require()語句或include()語句將libs目錄中的Smarty.class.php類文件加載進來,Smarty類庫就可以使用了(注意Smarty.class.php中的‘S’大寫),其他的類文件都會在Smarty類中自動加載完成。
注意:Smarty3.0必須在PHP5以上的版本運行。
初始化類庫的默認設置:
//一個簡單的smarty示例
include './libs/Smarty.class.php';
//實例化對象
$smarty = new Smarty();
//修改默認配置
//定界符
$smarty->setLeftDelimiter('<{'); //方法設置推薦
//$smarty->left_delimiter = '<{'; //屬性設置
$smarty->right_delimiter = '}>'; //屬性設置
//設置模板路徑
$smarty->setTemplateDir('./view');
//設置編譯后文件路徑
$smarty->setCompileDir('./runtime/view_c');
//設置緩存路徑(要開啟緩存這個目錄才會被使用)
$smarty->setCacheDir('./runtime/cache');
//設置配置文件路徑
$smarty->setConfigDir('./config');
//分配數據
$smarty->assign('title','good');
//調用模板
$smarty->display('1.html');
?>
init.inc.php
//初始化Smarty成員屬性的公用文件init.inc.php
define('ROOT',str_replace("\\","/",dirname(_FILE_)),'/'); //指定項目的根路徑
require ROOT.'libs/Smarty.class.php'; //加載smarty類文件
$smarty = new Smarty();
//實例化smarty類對象$smarty
/*推薦使用smarty3以上版本方式設置默認路徑,設置成功后都返回$smarty對象本身,可以使用連貫操作 */
$smarty->setTemplateDir(ROOT.'templates/'); //設置所有模板文件存放的目錄
// ->addTemplateDir(ROOT.'templates2') //可以添加多個模板目錄(前后臺各一個)
->setCompileDir(ROOT.'templates_c/')//設置所有編譯過的模板文件存放目錄
->setPluginsDir(ROOT.'plugins/')//設置模板擴充插件存放目錄
->setCacheDir(ROOT.'cache/')//設置緩存文件存放的目錄(開啟緩存才被使用)
->setConfigDir(ROOT.'configs'); //設置模板配置文件存放的目錄
$smarty->caching = false; //設置smarty緩存開關1開啟 0 關閉 ture開啟 false 關閉
$smarty->cache_lifetime = 60*60*24 //設置模板緩存有時間段的長度為1天
$smarty->left_delimiter = '<{'; //設置模板語言中的左結束符號
$smarty->right_delimiter = '}>'; //設置模板語言中的右結束符號
/*初始化配置說明*/
//smarty2時的設置方式:
/*
$smarty->template_dir = "./templates"; //設置模板目錄,2.0設置方法,3.0沿用但不支持
$smarty->compile_dir = "./templates_c"; //設置編譯目錄。2.0設置方法,3.0沿用但不init持
$smarty->config_dir = "./configs/"; //設置編譯目錄。2.0設置方法,3.0沿用但不支持
$smarty->cache_dir = "./cache/"; //設置編譯目錄。2.0設置方法,3.0沿用但不支持
*/
//smarty3對屬性進行了封裝,可以使用如下方法進行訪問獲得目錄
$smarty->getCacheDir(); //得到當前緩存目錄路徑
$smarty->getTemplateDir(); //得到當前模板目錄路徑的數組
$smarty->getConfigDir(); //得到當前配置文件目錄路徑
$smarty->getCompileDir(); //得到當前編譯目錄路徑
$smarty->getPluginsDir(); //得到當前插件目錄路徑數組
//同樣下面的方法進行目錄設置:
//設置新的模板目錄,注意設置后模板目錄的數組只有該值一個,不管原來有幾個值
$smarty->setTemplateDir("./templates/");
$smarty->setCompileDir("./templates_c/"); //設置新的編譯目錄
$smarty->setConfigDir("./configs/"); //設置新的配置文件目錄
$smarty->setCacheDir("./cache/");//設置新的緩存目錄
$smarty->setLeftDelimiter('<{'); //方法設置推薦
$smarty->setRightDelimiter('<{'); //方法設置推薦
//引用的模板文件的路徑必須在模板目錄數組中,否則報錯,由于仍然用原來的模板文件,這樣模板數組中有兩個路徑。
$smarty->addTemplateDir('./templates2/');
//添加一個新的插件目錄,如果用set將取消插件數組,變?yōu)閱沃?/p>
$smarty->addPluginsDir('./myplugins');
//說明:這些Smarty對象中的設置方法,設置成功后返回的還是Smarty類對象($this),所以可以像
//init.inc.php腳本中應用的方式一樣,采用對象連貫操作方式部署smarty路徑。
/*初始化配置說明*/