Smarty模板引擎技術


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中常用的屬性與方法

 

  1. 常用屬性

<?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后綴。

 

五、系統內置函數

1capture內建函數

作用是捕獲一段內容。

實例代碼:

<!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>

 

 

 

  1. 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}
  1. 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>

 

4foreach內建函數

作用:遍歷從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    變量的值

  1. 系統中保留變量

$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}
  1. 變量調節器

變量調節器的作用:變量調節器主要是對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}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM