當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > PHP中Smarty模板的使用
PHP中Smarty模板的使用
時(shí)間:2018-09-27 來(lái)源:未知
PHP中Smarty模板的使用
一、 什么是模板引擎
不知道從什么時(shí)候開(kāi)始,有人開(kāi)始對(duì) HTML 內(nèi)嵌入 Server Script 覺(jué)得不太滿意。然而不論是微軟的 ASP 或是開(kāi)放源碼的 PHP,都是屬于內(nèi)嵌 Server Script 的網(wǎng)頁(yè)伺服端語(yǔ)言。因此也就有人想到,如果能把程序應(yīng)用邏輯 (或稱商業(yè)應(yīng)用邏輯) 與網(wǎng)頁(yè)呈現(xiàn) (Layout) 邏輯分離的話會(huì)比較好。
其實(shí)這個(gè)問(wèn)題早就存在已久,從交互式網(wǎng)頁(yè)開(kāi)始風(fēng)行時(shí),不論是 ASP 或是 PHP 的使用者都是身兼程序開(kāi)發(fā)者與視覺(jué)設(shè)計(jì)師兩種身份。
所以模版引擎就應(yīng)運(yùn)而生啦!模版引擎的目的,就是要達(dá)到上述提到的邏輯分離的功能。它能讓程序開(kāi)發(fā)者專注于資料的控制或是功能的達(dá)成;而視覺(jué)設(shè)計(jì)師則可專注于網(wǎng)頁(yè)排版,讓網(wǎng)頁(yè)看起來(lái)更具有專業(yè)感!因此模版引擎很適合公司的網(wǎng)站開(kāi)發(fā)團(tuán)隊(duì)使用,使每個(gè)人都能發(fā)揮其專長(zhǎng)!
就筆者接觸過(guò)的模版引擎來(lái)說(shuō),依資料呈現(xiàn)方式大概分成:需搭配程序處理的模版引擎和完全由模版本身自行決定的模版引擎兩種形式。
在需搭配程序處理的模版引擎中,程序開(kāi)發(fā)者必須要負(fù)責(zé)變量的呈現(xiàn)邏輯,也就是說(shuō)他必須把變量的內(nèi)容在輸出到模版前先處理好,才能做 assign 的工作。換句話說(shuō),程序開(kāi)發(fā)者還是得多寫一些程序來(lái)決定變量呈現(xiàn)的風(fēng)貌。而完全由模版本身自行決定的模版引擎,它允許變量直接 assign 到模版中,讓視覺(jué)設(shè)計(jì)師在設(shè)計(jì)模版時(shí)再?zèng)Q定變量要如何呈現(xiàn)。因此它就可能會(huì)有另一套屬于自己的模版程序語(yǔ)法 (如 Smarty) ,以方便控制變量的呈現(xiàn)。但這樣一來(lái),視覺(jué)設(shè)計(jì)師也得學(xué)習(xí)如何使用模版語(yǔ)言。
二、 自定義模板引擎
引擎類:Mytpl.class.php
class Mytpl{
private $data = array();
private $newFile;
//接收數(shù)據(jù)
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文件:(導(dǎo)入引擎類)v5.php
//查詢數(shù)據(jù)庫(kù)
//在頁(yè)面頂端做所有的邏輯處理,下面的html代碼里面只負(fù)責(zé)顯示
$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 = '測(cè)試標(biāo)題';
//包含類文件
include './Mytpl.php';
//實(shí)例化對(duì)象
$tpl = new Mytpl();
//分配數(shù)據(jù)
$tpl->assign('userlist', $arr);
$tpl->assign('title', $title);
$tpl->assign('msg', '測(cè)試字符串');
$tpl->display('./view/tpl.php');
?>
調(diào)用的模板:(前端美工)index.html(后綴名也可以使用其他.tpl)
{$title}
三、 選擇Smarty模板引擎
概述:在引擎中,Smarty將模板“編譯”(基于復(fù)制和轉(zhuǎn)換)成PHP腳本。它只會(huì)發(fā)生一次,當(dāng)?shù)谝淮巫x取模板的時(shí)候,指針前進(jìn)時(shí)調(diào)取編譯版本,Smarty幫你保管它,因此模板設(shè)計(jì)者只需要編輯Smarty模板,而不必管理編譯版本。這也使得模板很容易維護(hù),而執(zhí)行速度非常快,因?yàn)樗皇荘HP。如果開(kāi)啟模板緩存,則直接運(yùn)行緩存的靜態(tài)頁(yè)面,而不再去執(zhí)行PHP的應(yīng)用程序(沒(méi)有反復(fù)鏈接數(shù)據(jù)庫(kù)和執(zhí)行大量SQL語(yǔ)句的動(dòng)作),大大提高了頁(yè)面的訪問(wèn)速度。
Smarty模板引擎優(yōu)點(diǎn):
1. 速度:相對(duì)于其他的模板引擎技術(shù)而言,采用Smarty編寫的程序可以獲取大速度的提高,主要的是可以提高開(kāi)發(fā)速度,程序員、美工能夠快速開(kāi)發(fā)部署,易于維護(hù)。
2. 編譯型:采用Smarty編寫的程序運(yùn)行時(shí)要編譯(組合)成一個(gè)非模板技術(shù)的PHP文件,這個(gè)文件采用PHP和HTML混合的方式,在下一次訪問(wèn)模板時(shí)將Web請(qǐng)求直接轉(zhuǎn)換到這個(gè)文件中,而不再進(jìn)行模板重新編譯(在源程序沒(méi)有改動(dòng)的情況下),使后續(xù)的調(diào)用速度更快。
3. 緩存技術(shù):Smarty提供了一個(gè)可選擇使用的緩存技術(shù),它可以將用戶終看到的HTML文件緩存成一個(gè)靜態(tài)的HTML頁(yè)面。當(dāng)用戶開(kāi)啟Smarty緩存時(shí),并在設(shè)定的時(shí)間內(nèi),將用戶的Web請(qǐng)求直接轉(zhuǎn)換到這個(gè)靜態(tài)的HTML文件中來(lái),這相當(dāng)于調(diào)用一個(gè)靜態(tài)的HTML文件。
4. 插件技術(shù):Smarty模板引擎是采用PHP面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的,不僅可以在源代碼中修改,還可以自定義一些功能插件(就是一些按規(guī)則自定義的功能函數(shù))。
5. 強(qiáng)大的表現(xiàn)邏輯:PHP負(fù)責(zé)后臺(tái),Smarty模板負(fù)責(zé)前端。在Smarty模板中能夠通過(guò)條件判斷及迭代地處理數(shù)據(jù),它實(shí)際上也是一種自定義的程序設(shè)計(jì)語(yǔ)言,客戶在開(kāi)發(fā)中富有彈性。并拋棄應(yīng)用程序中PHP與其他語(yǔ)言雜糅的描述方式,使之統(tǒng)一樣式,從PHP獨(dú)立出來(lái),比較安全。另外,語(yǔ)法簡(jiǎn)單,容易理解,不必具備PHP知識(shí)。
6. 模板繼承:模板的繼承是Smarty 3的新事物,它也是諸多偉大新特性之一。在模板繼承里,我們將保持模板作為獨(dú)立頁(yè)面而不用加載其他頁(yè)面,可以操縱內(nèi)容塊繼承它們。這使得模板更直觀,更有效和易管理。
四、 安裝配置并使用Smarty模板
概要:Smarty的安裝比較容易,因?yàn)樗粚儆赑HP的應(yīng)用擴(kuò)展模塊,只是采用PHP面向?qū)ο笏枷刖帉懙能浖灰谖覀兊腜HP腳本中加載Smarty類,并創(chuàng)建一個(gè)Smarty對(duì)象,就可以使用Smarty模板引擎了。
安裝步驟如下:
1. 需要到Smarty官網(wǎng)//www.smarty.net/download.php下載新穩(wěn)定版本,所有版本的Smarty類庫(kù)都可以在UNIX和Windows服務(wù)器上使用。
2. 然后解壓壓縮包,解開(kāi)后看到很多文件,其中有一個(gè)名稱為libs的文件夾,就是存有Smarty類庫(kù)的文件夾。其他文件可以刪除,把libs目錄拷貝到需要使用的位置。
3. 在libs中應(yīng)該會(huì)有Smarty.class.php和SmartyBC.class.php兩個(gè)文件、一個(gè)debug.tpl、一個(gè)自定義插件plugins文件夾(外部使用可以擴(kuò)充)和一個(gè)系統(tǒng)插件sysplugins文件夾(內(nèi)部插件)。直接將libs目錄賦值指定的位置(libs可以改名,不建議更改)
4. 在執(zhí)行的PHP腳本中,通過(guò)require()語(yǔ)句或include()語(yǔ)句將libs目錄中的Smarty.class.php類文件加載進(jìn)來(lái),Smarty類庫(kù)就可以使用了(注意Smarty.class.php中的‘S’大寫),其他的類文件都會(huì)在Smarty類中自動(dòng)加載完成。
注意:Smarty3.0必須在PHP5以上的版本運(yùn)行。
初始化類庫(kù)的默認(rèn)設(shè)置:
//一個(gè)簡(jiǎn)單的smarty示例
include './libs/Smarty.class.php';
//實(shí)例化對(duì)象
$smarty = new Smarty();
//修改默認(rèn)配置
//定界符
$smarty->setLeftDelimiter('<{'); //方法設(shè)置推薦
//$smarty->left_delimiter = '<{'; //屬性設(shè)置
$smarty->right_delimiter = '}>'; //屬性設(shè)置
//設(shè)置模板路徑
$smarty->setTemplateDir('./view');
//設(shè)置編譯后文件路徑
$smarty->setCompileDir('./runtime/view_c');
//設(shè)置緩存路徑(要開(kāi)啟緩存這個(gè)目錄才會(huì)被使用)
$smarty->setCacheDir('./runtime/cache');
//設(shè)置配置文件路徑
$smarty->setConfigDir('./config');
//分配數(shù)據(jù)
$smarty->assign('title','good');
//調(diào)用模板
$smarty->display('1.html');
?>
init.inc.php
//初始化Smarty成員屬性的公用文件init.inc.php
define('ROOT',str_replace("\\","/",dirname(_FILE_)),'/'); //指定項(xiàng)目的根路徑
require ROOT.'libs/Smarty.class.php'; //加載smarty類文件
$smarty = new Smarty();
//實(shí)例化smarty類對(duì)象$smarty
/*推薦使用smarty3以上版本方式設(shè)置默認(rèn)路徑,設(shè)置成功后都返回$smarty對(duì)象本身,可以使用連貫操作 */
$smarty->setTemplateDir(ROOT.'templates/'); //設(shè)置所有模板文件存放的目錄
// ->addTemplateDir(ROOT.'templates2') //可以添加多個(gè)模板目錄(前后臺(tái)各一個(gè))
->setCompileDir(ROOT.'templates_c/')//設(shè)置所有編譯過(guò)的模板文件存放目錄
->setPluginsDir(ROOT.'plugins/')//設(shè)置模板擴(kuò)充插件存放目錄
->setCacheDir(ROOT.'cache/')//設(shè)置緩存文件存放的目錄(開(kāi)啟緩存才被使用)
->setConfigDir(ROOT.'configs'); //設(shè)置模板配置文件存放的目錄
$smarty->caching = false; //設(shè)置smarty緩存開(kāi)關(guān)1開(kāi)啟 0 關(guān)閉 ture開(kāi)啟 false 關(guān)閉
$smarty->cache_lifetime = 60*60*24 //設(shè)置模板緩存有時(shí)間段的長(zhǎng)度為1天
$smarty->left_delimiter = '<{'; //設(shè)置模板語(yǔ)言中的左結(jié)束符號(hào)
$smarty->right_delimiter = '}>'; //設(shè)置模板語(yǔ)言中的右結(jié)束符號(hào)
/*初始化配置說(shuō)明*/
//smarty2時(shí)的設(shè)置方式:
/*
$smarty->template_dir = "./templates"; //設(shè)置模板目錄,2.0設(shè)置方法,3.0沿用但不支持
$smarty->compile_dir = "./templates_c"; //設(shè)置編譯目錄。2.0設(shè)置方法,3.0沿用但不init持
$smarty->config_dir = "./configs/"; //設(shè)置編譯目錄。2.0設(shè)置方法,3.0沿用但不支持
$smarty->cache_dir = "./cache/"; //設(shè)置編譯目錄。2.0設(shè)置方法,3.0沿用但不支持
*/
//smarty3對(duì)屬性進(jìn)行了封裝,可以使用如下方法進(jìn)行訪問(wèn)獲得目錄
$smarty->getCacheDir(); //得到當(dāng)前緩存目錄路徑
$smarty->getTemplateDir(); //得到當(dāng)前模板目錄路徑的數(shù)組
$smarty->getConfigDir(); //得到當(dāng)前配置文件目錄路徑
$smarty->getCompileDir(); //得到當(dāng)前編譯目錄路徑
$smarty->getPluginsDir(); //得到當(dāng)前插件目錄路徑數(shù)組
//同樣下面的方法進(jìn)行目錄設(shè)置:
//設(shè)置新的模板目錄,注意設(shè)置后模板目錄的數(shù)組只有該值一個(gè),不管原來(lái)有幾個(gè)值
$smarty->setTemplateDir("./templates/");
$smarty->setCompileDir("./templates_c/"); //設(shè)置新的編譯目錄
$smarty->setConfigDir("./configs/"); //設(shè)置新的配置文件目錄
$smarty->setCacheDir("./cache/");//設(shè)置新的緩存目錄
$smarty->setLeftDelimiter('<{'); //方法設(shè)置推薦
$smarty->setRightDelimiter('<{'); //方法設(shè)置推薦
//引用的模板文件的路徑必須在模板目錄數(shù)組中,否則報(bào)錯(cuò),由于仍然用原來(lái)的模板文件,這樣模板數(shù)組中有兩個(gè)路徑。
$smarty->addTemplateDir('./templates2/');
//添加一個(gè)新的插件目錄,如果用set將取消插件數(shù)組,變?yōu)閱沃?/p>
$smarty->addPluginsDir('./myplugins');
//說(shuō)明:這些Smarty對(duì)象中的設(shè)置方法,設(shè)置成功后返回的還是Smarty類對(duì)象($this),所以可以像
//init.inc.php腳本中應(yīng)用的方式一樣,采用對(duì)象連貫操作方式部署smarty路徑。
/*初始化配置說(shuō)明*/
華清遠(yuǎn)見(jiàn)90+項(xiàng)目獲批!教育部2021最新協(xié)同育人項(xiàng)目名
華清遠(yuǎn)見(jiàn)榮獲2021騰訊教育“年度口碑影響力職業(yè)教育品
華清遠(yuǎn)見(jiàn)受邀參加2021年武漢民辦高校信息學(xué)科合作聯(lián)盟
溫暖同行共創(chuàng)佳績(jī) 2019華清遠(yuǎn)見(jiàn)北京總部年會(huì)大曝光
助力高校AI人工智能學(xué)科建設(shè) 華清遠(yuǎn)見(jiàn)人工智能師資班
華清遠(yuǎn)見(jiàn)受邀參加四川省物聯(lián)網(wǎng)年會(huì),榮獲優(yōu)秀企業(yè)專家
