Smarty模板引擎技術
-
什么是模板引擎?
-
什么是Smarty模板引擎?
-
為何選擇Smarty模板引擎?
-
如何使用Smarty模板引擎?
一、歷史背景
場景一:回顧之前編寫PHP項目的方式
//鏈接數據的操作
//構造sql語句
//執行sql語句
$res = mysql_query($sql);
?>
<table>
<?php
while($row = mysql_fetch_assoc($res)){
?>
<tr>
<td><?php echo $row['goods_name']?></td>
</tr>
<?php
}
?>
</table>
分析:這樣的寫法的好或者不好的地方在哪里?
優點:執行效率高。
缺點:代碼組織混亂,維護成本高,幾乎無法重構(重構基本要重寫)。
場景二:那些年,我做過的項目。
在外面的做開發工作,並不是,程序員覺得項目開發完畢了就結束了,往往一個項目開發要經歷多次修改和優化。
因為一直在使用混編的方式進行開發項目,只要界面一修改,就等於項目除了固定功能部分之外的代碼就得重新寫。
既然功能都是固定的,那么有沒有什么辦法,讓我們的前端和后台進行分離,前端修改不會影響后端。
二、模板引擎概述
1、什么是模板引擎
-
模板引擎,是指利用某種模板語言將頁面制成模板,再依據業務邏輯將該模板語言翻譯成業務數據,從而生成最終展示頁面。其目的就是要把頁面(HTML)與業務數據(PHP)實現徹底分離。(模板引擎可以將我們php項目的前端和后端的開發分離)。
-
業界主流的開源cms中對模板引擎的使用是很廣泛的,如業界知名cms:dedecms,discuz,phpcms,echop等。
2、感受模板引擎
通過在html中使用標簽的方式,就可以達到不用修改php 代碼情況下,完成制作一個網站。
那么?這樣的原理是怎么樣的?
3、模板引擎核心原理
所有的模板引擎底層實現都是基於這個原理實現,不管他有多強大多復雜,最基本的核心實現思路都是一致的。
4、封裝模板引擎
為什么要封裝?為了實現代碼的重用,以更優雅的方式組織代碼。
三、Smarty模板引擎
1、什么是Smarty模板引擎
Smarty是一個基於PHP開發的PHP模板引·擎。它提供了邏輯與外在內容的分離。(實現了php項目的前端和后台開發的分離)
一個叫名字叫做Smarty,且使用php編寫的模板引擎。
2、如何獲取Smarty模板引擎
Smarty官網: http://www.smarty.net/
3、lib目錄詳解
Plugings 拓展插件目錄
Sysplugins Smarty系統插件目錄
AutoLoader.php 自動載入類
Debug.tpl Smarty提示信息模板
Smarty.class.php Smarty3.0入口文件(兼容2.0)
SmartyBC.class.php Smarty2.0入口文件
4、為什么要選擇Smarty模板引擎
從技術背景角度來說:Smarty是由php官方開發團隊開發和維護。
-
速度 相對於其他模板引擎,Smarty模板引擎的執行效率更高。
-
編譯型 第一次訪問項目,Smarty模板引擎會生成一個編譯文件,第二次訪問時會判斷項目的模板文件是否被修改,如果沒有修改,就執行編譯文件。
-
緩存技術 當項目的緩存文件在生命周期內,那么Smarty在執行的時候會直接執行緩存文件
-
插件技術:當Smarty內部功能不夠使用的時候,允許開發者自定義拓展插件
-
語句自由 if/elseif/else/endif:標簽語法很簡單。
編譯速度 < 緩存速度 < 靜態化
什么情況下使用Smarty模板引擎?那么什么情況下使用Smarty引擎不好?
-
在數據不常更新修改,非實時更新的項目可以使用Smarty模板引擎:管理系統,內容管理系統等
-
在數據實時更新的項目中使用不好:金融類型項目,數據時時更新類項目。
5、部署Smarty四步走
第一步:復制lib目錄至虛擬主機目錄
第二步:修改lib文件夾名為Smarty
第三步:創建templates文件夾
第四步:創建templates_c文件夾
6、使用Smarty模板引擎七步走
第一步:在虛擬主機目錄下創建一個index.php文件
第二步:在index.php文件中引入
第三步:Smarty類並實例化
第四步:在templates文件中創建一個index.html文件
第五步:在index.php文件中使用assign方法配置變量
第六步:在index.php文件夾中使用display方法加載模板
第七步:在index.html模板文件中編寫Smarty標簽
7、Smarty模板引擎的執行原理
我們訪問了index.php,通過在index.php文件中分配的變量,在html中顯示出來。
那么這中間發生了什么?
-
當第一次訪問index.php的時候,Smarty模板引擎會自動在templates_c文件夾中創建一個display()方法所指定的模板的緩存文件。
-
當第二次訪問index.php的時候,會判斷display()方法指定的模板文件是否 被修改,如果被修改了,則重新生成這個模板文件的編譯文件,如果沒有被修改則直接執行這個編譯文件
如何判斷模板文件被修改呢?
在unix系統和windows 系統中文件一般都有三個時間:
創建時間 修改時間 訪問時間
我們通過判斷模板文件的修改時間來確定是否被修改,從而判斷是否執行或者重新生成編譯文件。
那么如何直觀的理解這個執行過程呢?
8、一張圖理解Smarty執行流程
四、Smarty中常用的屬性與方法
-
常用屬性
<?php
include "Smarty/Smarty.class.php";
//實例化SMarty類
$Smarty = new Smarty();
$name = '我是小明';
$PHP = 'PHP是世界上最好的語言';
//修改左定界符
$Smarty->left_delimiter = '<{';
//修改右定界符
$Smarty->right_delimiter = '}>';
//修改模板文件路徑
$Smarty->template_dir = './view';
//修改的編譯路徑
$Smarty->compile_dir ='./compile';
$Smarty->assign('name',$name);
$Smarty->assign('PHP',$PHP);
$Smarty->display('demo.php');
2、相關屬性
思考:為什么我們要設置templates和templates_c兩個文件夾
答:這些目錄都是由Smarty中的下面幾個屬性決定的。
-
template_dir 模板文件目錄
-
complile_dir 編譯文件目錄
-
config_di r 配置文件目錄
-
cache_dir 緩存文件目錄
示例代碼:
<?php
include "Smarty/Smarty.class.php";
//實例化SMarty類
$Smarty = new Smarty();
$name = '我是小明';
$PHP = 'PHP是世界上最好的語言';
//修改左定界符
$Smarty->left_delimiter = '<{';
//修改右定界符
$Smarty->right_delimiter = '}>';
//修改模板文件路徑
$Smarty->template_dir = './view';
//修改的編譯路徑
$Smarty->compile_dir ='./compile';
$Smarty->assign('name',$name);
$Smarty->assign('PHP',$PHP);
$Smarty->display('demo.php');
在Smarty3.0中,這四個屬性都是private私有的,那么為什么可以在類外部修改私有屬性?
在PHP中有魔術方法__set
3、相關方法
因為Smarty3.0是為了兼容Smarty2.0版本,允許通過屬性的方式來設置相關屬性。
但是為了迎合Smarty3.0開發規范,我們一般通過使用相關方法對相關屬性的設置。。
-
setTemplateDir() 設置模板文件目錄
-
setCompileDir() 設置編譯文件目錄
-
setConfigDir() 設置配置文件目錄
-
setCacheDir() 配置緩存文件目錄
示例代碼:
<?php
include "Smarty/Smarty.class.php";
//實例化SMarty類
$Smarty = new Smarty();
$name = '我是小明';
$PHP = 'PHP是世界上最好的語言';
//修改左定界符
$Smarty->left_delimiter = '<{';
//修改右定界符
$Smarty->right_delimiter = '}>';
//修改模板的路徑
$Smarty->setTemplateDir('./tmp');
//修改編譯文件的路徑
$Smarty->setCompileDir('./c');
$Smarty->assign('name',$name);
$Smarty->assign('PHP',$PHP);
$Smarty->display('index.tpl');
4、Smarty中常用的兩個方法
Assign(`模板變量名稱`,`值`)
Display(`模板名稱`)
5、注意事項
-
一般在使用Smarty做項目的時候,如果templates_c文件不存在,那么會自動創建,但是在linux環境中因為文件權限的問題,。
-
Display方法指定的模板文件,不一定是.html 結尾的,使用任何文本文件都可以。
如在ecshop項目中的 .tpl后綴。
五、系統內置函數
1、capture內建函數
作用是捕獲一段內容。
實例代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty模板引擎</title>
</head>
<body>
{capture name='PHP'}
PHP是世界上最好的語言
我是一段被捕獲的內容
{/capture}
{$smarty.capture.PHP}
</body>
</html>
-
config_load內建函數
基本語法:{config_load file=`配置文件的名稱`}
參數詳解:file 在configs文件夾中的配置文件
示例代碼:
{config_load file="config.conf" }
{#name#}
<hr/>
{#age#}
<hr/>
{#sex#}
Configs/config.conf文件
示例代碼:
name = 王小明
[class1]
name = 王二明
[class2]
name = 王大明
[class3]
sheji_01.tpl代碼
{config_load file="config.conf" }
{#name#}
<br/>
{config_load file="config.conf" section="class1"}
{#name#}
{config_load file="config.conf" section="class2"}
<br/>
{$smarty.config.name}
-
include內建函數
一般網站的頁面設計大概分為三部分:頭部文件,內容文件,底部文件
在Smarty中我們可以使用include函數實現,將我們的頁面精細化拆分。
基本語法:{include file=模板文件名稱}
參數說明:模板文件在templates文件夾中。
示例代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty模板引擎</title>
</head>
<body>
{include file="header.tpl"}
{include file="content.tpl"}
{include file="footer.tpl"}
</body>
</html>
4、foreach內建函數
作用:遍歷從PHP中分配來的數組
示例代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty模板引擎</title>
</head>
<body>
{foreach $arr as $a}
{$a}
<hr/>
{/foreach}
</body>
</html>
六、設計篇
1、模板注釋
{*我是注釋內容*}
2、模板變量
①從php文件中分配過來的變量
$Smarty->assign('name',$name);
②從配置文件中讀取的變量
{config_load file="config.conf"}
{#name#}
<hr/>
{#sex#}
<hr/>
{#age#}
③在模板文件中直接定義的變量
{assign var="class" value="PHP15期"}
{$class}
參數說明:var 變量的名稱
Value 變量的值
-
系統中保留變量
$smarty.get.page 相當於$_GET[page]
$smarty.post.page 相當於$_POST[page]
$smarty.cookies.username $_COOKIE[username]
$smarty.server.SERVER_NAME $_SERVER[SERVER_NAME]
$smarty.env.Path $_ENV[PATH]
$smarty.session.id $_SESSION[id]
$smarty.request.username $_REQUEST[username]
{$smarty.now} 代表獲取當前時間戳
{$smarty.const} 獲取一個常量
{$smarty.capture} 獲取捕獲內容
{$smarty.config} 獲取配置文件
{$smarty.current_dir} 當前項目工作路徑
{$smarty.version} 當前Smarty版本
{$smarty.ldelim} ó {ldelim} 左定界符
{$smarty.rdelim} ó {rdelim} 右定界符
實例代碼:獲取配置文件變量的兩種方法
{config_load file="config.conf" }
{#name#}
{$smarty.config.name}
<hr/>
{$smarty.config.age}
<hr/>
{$smarty.config.sex}
-
變量調節器
變量調節器的作用:變量調節器主要是對Smarty變量進行格式化。
基本格式:{變量名稱|變量調節器:參數1:參數2|變量調節器2:參數1:參數2}
在Smarty中有21中變量調節器:
{$var|capitalize} 將變量中的單詞首字母大寫
{$var|count_characters:true}計算變量中的字符串,如果參數為true的話,那么將空格也計算在內。
{$var|cat:var2} 鏈接變量
{$var|count_paragraphs} 計算變量中的段落數量
{$var|count_sentences} 計算變量中的句子數量
{$var|count_words} 計算變量中的單詞量
{$var|date_format:"%Y%m%d"} 格式化日期
{$var|default:"value"} 默認值
{$var|escape} 轉碼
{$var|indent:10:"*"} 縮進
{$var|lower} 將變量中的所有單詞轉化為小寫
{$var|nl2br} 將變量中你的換行符轉化為<br>
{$var|regex_replace:"/[\t\n]/":""} 正則替換
{$var|replace:"aa":"bb"} 字符串替換
{$var|spacify:"^^"} 插空操作
{$var|string_format:"%d"} 字符串格式化 %d格式化為整型,%s格式化為字符串類型
{$var|strip: "*"} 去空操作
{$var|strip_tags} 去除變量中的HTML代碼
{$var|truncate:30:"…"} 字符串截取,將最后三個字符替換為三個點
{$var|upper} 將變量中的字母轉化為大寫
{$var|wordwrap:30:"<br>"} 行寬約束
示例代碼:
{*capitalize 將變量中的單詞首字母轉化為大寫*}
{$name|capitalize}
<hr/>
{*cat 鏈接變量*}
{$var1|cat:$var2:$var3}
<hr/>
{*格式化日期*}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
<hr/>
{*轉碼*}
{$var4|escape}
<hr/>
{*將變量中的單詞轉化為小寫*}
{$var5|lower}
<hr/>
{*將變量中的換行符轉化為br*}
{$var6|nl2br}
<hr/>
{*字符串替換
{$var7|replace:'小明':'老王'}
*}
{*字符串截取*}
{$var8|truncate:9:"***"}
<hr/>
{*將變量中的字母轉化為大寫*}
{$var9|upper}
6、變量調節器組合應用
{*變量調節器的綜合應用*}
{$var10|nl2br|truncate:120:'***'|lower}