Smarty3 筆記 By 飛鴻影~ 2014-9-23 21:46:38
Smarty入門
1、什么是smarty?
Smarty是采用php寫的一個模版引擎,設計的目的是要將php代碼與html代碼分離,
使php程序員只專注於php代碼的編寫,網頁美工只專注於網頁的美化
2、采用模版引擎后:
1)php代碼與html代碼分離開了,php代碼放在一個單獨的php文件中,html代碼放在一個單獨的html文件中
2)數據的傳遞首現php中的數據先給了模版引擎,然后模版引擎再把接收到的數據給模版文件顯示。
3)模版文件中不再有php代碼或者說php標記的出現,模版中顯示的數據都是通過模版引擎的標記顯示出來的
index.php -> smarty模版引擎 -> index.html
3、Smarty的優點:
1)速度快:相對於其它的模版引擎而言的
2)編譯型:支持緩存技術,無需每次重新編譯(在模版文件沒有改動的情況下)
3)模版中可以使用流程控制語句。
4、Smarty模版引擎運作流程
①在php程序運行時,初始化smarty模版引擎
②smarty模版引擎讀取模版文件(.html或tpl文件)
③在讀取模版文件的時候,smarty模版引擎會自動判斷該模版文件是否需要重新編譯。
④如果不需要重新編譯,則直接進行模版變量替換。
⑤如果是第一次執行此程序文件或者說模版被改動了,那么就需要重新編譯后再進行模版變量替換。
⑥最終執行的是編譯后的php文件。
⑦輸出結果到瀏覽器。
5、如何獲得Smarty:
到官方網站去下載smarty模版引擎壓縮包
官網:http://www.smarty.net
解壓后將libs目錄拷貝至項目開發目錄
6、搭建Smarty模板示例:
1)將libs庫目錄復制過來。
2)創建一個模板目錄templates模板文件存放目錄
創建一個configs配置文件目錄
3)編寫index.php文件(入口文件)做Smarty導入和創建;templates目錄中新建index.html模板文件
++ index.php
<?php require("libs/Smarty.class.php"); //導入Smarty類 $smarty = new Smarty(); //創建對象 $smarty->assign("name","zhangsan"); //向Smarty模板中分配變量name=zhangsan $smarty->display("index.html"); //使用index.html顯示 ?>
++ index.html
<html> {$name} </html>
[小提示]
assign():主要用來將php中的標量類型的數據賦值給模版變量
display():主要用來顯示指定的模版文件,可以指定路徑
[模板中如何顯示分配的變量?]
一般的變量,使用 {$var} 形式.例如我們這里分配的name=zhangsan,
我們在模板index.html中使用 {$name} 顯示.
后面會講述更多關於模板變量顯示的內容.
4)使用瀏覽器訪問index.php,將會創建目錄templates_c和cache目錄
5)最后的結構:
根目錄
|--libs //Smarty庫
| |--Smarty.class.php
|--templates //模板目錄
| |--index.html
|--templates_c //模板編譯目錄
|--cache //模板靜態緩存目錄(注意需開啟緩存)
|--configs //配置文件目錄
|--index.php //php文件(入口)
6)其他可選配置項(不改即為默認值):
//配置 $smarty->debugging=false; //是否開啟debug調試 $smarty->template_dir="templates/"; //模板目錄 $smarty->compile_dir="templates_c/"; //編譯目錄 $smarty->config_dir="configs/"; //配置項目錄 $smarty->cache_dir="cache/"; //緩存目錄 $smarty->caching=false; //是否開啟緩存 $smarty->cache_lifetime=3600; //緩存生命周期,單位是s $smarty->left_delimiter="{"; //左定界符 $smarty->right_delimiter="}"; //右定界符
7、Smarty應用之模版變量
通常分配的變量有:字符串、數字、數組、對象
[例]2.php:
$smarty->assign("title","Smarty模板引擎實例--變量輸出");//字符串 $smarty->assign("num",100);//數字 $smarty->assign(array("name"=>"zhangsan","age"=>23));//多個值 $smarty->assign("a1",array(10,20,30));//索引數組 $smarty->assign("a2",array("name1"=>"zs","name2"=>"zs2"));//關聯數組 $smarty->assign("ob",new Demo());//對象,含有公共屬性name和age,為了節約篇幅,這里省略了類
模板里訪問分配的變量(templates/2.html):
<h2>{$title}</h2> <ul> <li><a href="index.php">返回首頁</a></li> <li>^_^{*注釋的內容不會被輸出*}</li> <li>輸出一個數值:{$num},{$num*2}</li> <li>輸出一個字符串:{$title},長度:{strlen($title)}</li> <li>輸出一個數組里面的批量值:{$name},{$age}</li> <li>輸出一個索引數組a1:{$a1[0]},{$a1[1]},{$a1[2]}</li> <li>輸出一個關聯數組a2:{$a2['name1']},{$a2['name2']}</li> <li>輸出一個關聯數組a2:{$a2.name1},{$a2.name2}</li> <li>輸出一個對象:{$ob->name},{$ob->age}</li> </ul>
8、模板里php函數使用(一般是return有結果的函數才直接使用)
(templates/3.html):
當前時間{date("Y-m-d H:i:s")}
自定義函數:{fun()}
**其中自定義函數在3.php中是
function fun(){ return "hehe"; }
9、模板里超全局變量使用(templates/4.html):
<li>session中的信息:{$smarty.session.name}</li> <li>get中的信息:{$smarty.get.id}</li> <li>post中的信息:{$smarty.post.name}</li> <li>常量PI中的信息:{$smarty.const.PI}</li>
**當然,得提前在4.php中定義才行:
$_SESSION['name']="admin"; $_GET['id']=100; $_POST['name']="yjc"; const PI=3.14;
更多還支持:
諸如 $_GET, $_POST,$_COOKIE, $_SERVER, $_ENV and $_SESSION 都可以使用 {$smarty.post.get} 類似
方法輸出,記得改為小寫
10、模板從configs/目錄讀取配置文件
模板里讀取格式: {config_load file="lang.conf" section="en"}
其中section為可選項,配置文件后綴一般是conf,ini等
舉例說明配置文件格式(configs/user.conf)
[users] username=zhangsan age=22
模板里使用配置文件定義的變量方法是:
{$smarty.config.username}或者{#username#}
{$smarty.config.age}或者{#age#}
11、模板里包含文件
例如包含當前目錄下menu.html
{include file="menu.html"}
12、模板里foreach遍歷數組
Smarty3.0新版使用格式(與php原生的基本一樣):
{foreach $data as $key=>$value}
{$value.name}
{$value.age}
{/foreach}
Smarty3.0同時兼容舊版使用方法:
{foreach from=$data key="key" item="value"}
{/foreach}
[實踐]
當然,我們可以連接數據庫后,使用之前寫的Model.class.php數據庫操作類寫一個學生信息管理系統.
通過使用switch,可以實現單個頁面display多個頁面,很類似ThnkPHP控制器的雛形.
大概思路:
switch($_GET['a']){ case "add"://添加信息表單 $smarty->display("stu/add.html"); break; case "insert"://執行添加信息 break; case "edit"://修改信息表單 $smarty->display("stu/edit.html"); break; case "update"://執行更新信息 break; case "del"://刪除信息 break; case "index": default://瀏覽信息 $s->smarty("stu/index.html"); }
Smarty高級
1、Smarty保留變量
{$smarty.now} 當前時間戳,同{$time()}
{$smarty.const} 輸出系統已定義常量,后面加上常量名
{$smarty.capture} 捕獲標簽{capture name="mycap"}一些內容{/capture}里的內容,這里使用{$smarty.capture.mycap}讀取
{$smarty.config} 讀取配置文件(如my.conf)里變量,后面加變量名。等效{#變量名#}
{$smarty.section} (后續課程模板繼承里講解)
{$smarty.template} 當前模板名(不包括目錄)
{$smarty.current_dir} 當前模板目錄
{$smarty.version} 當前Smarty版本
{$smarty.block.child} (后續課程模板繼承里講解)
{$smarty.block.parent} (后續課程模板繼承里講解)
{$smarty.ldelim}, {$smarty.rdelim} 輸出當前左、右定界符
當然,在上一節內容,我們還學習了 {$smarty.get},{$smarty.post},{$smarty.session},{$smarty.cookie},{$smarty.server},{$smarty.env},{$smarty.request} 等PHP全局變量.
2、Smarty變量調節器
1)系統提供的調節器(*號標注表示使用較多.大部分使用頻率不高,了解即可):
*capitalize [首字符大寫] cat [連接字符串] count_characters [字符計數] count_paragraphs [計算段數] count_sentences [計算句數] count_words [計算詞數] *date_format [格式化日期] default [默認值] escape [轉義] indent [縮進] lower [小寫] *nl2br [換行符替換成 <br />] regex_replace [正則替換] *replace [替換] spacify [插空] string_format [字符串格式化] strip [去除(多余空格)] strip_tags [去除html標簽] *truncate [截取] *upper [大寫] wordwrap [行寬約束]
使用方法示例(2.html):
<li>原字符串:{$str}</li> <li>首字母大寫(有點用):{$str|capitalize}</li> <li>大寫:{$str|lower}</li> <li>新聞:{$content|strip_tags|strip|truncate:0:20:"utf-8"}...</li>
2)自定義調節器(采用插件文件方式):
a)在smarty模板的libs/plugins/目錄下創建調節器:
調節器文件名:modifier.調節器名.php
注意:若是自定義的的調節器不在libs/plugins/目錄下,需要使用下面Smarty的方法追加。
如: smarty->addPluginsDir("./libs/myplugins");//追加一個插件目錄的方式
注意清除編譯緩存目錄
b)在這個文件里的函數名:
function smarty_modifier_調節器函數名(參數列表...){ //..... }
例如:
/** * 自定義調節器:字符串截取函數 * 參數: * $str:表示被截取的字符串 * $len:保留字串的長度值。默認值:10 */ function smarty_modifier_mystr($str,$len=10){ if(strlen($str)>$len){ return substr($str,0,$len)."..."; }else{ return $str; } }
注意:在使用是,要按函數的參數順序來。
c)使用 {$str|調節器名}
練習:自定義一個調節器: myfont($str,$size,$color)
如: {$str|myfont:7:"red"} =>輸出: <font size="7" color="red">$str</font>
3)自定義調節器(采用注冊調節器方式):
除了上面的方法外還有一個方式可以定義一個變量的調節器
使用Smarty的一個方法: registerPlugin("modifier","調節器名", "被指定的函數名");
例如:
$smarty->registerPlugin("modifier","mystrlen","strlen");//注冊一個調節器的函數
使用:
{$str|mystrlen} //輸出str字串的長度
4)組合調節器:
{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}
3、Smarty中的函數
(標注*號為實用的)
格式:
{函數名 屬性1="值1" 屬性2="值2" }
{/函數名}
1)內置函數
* {assign} 在模板中定義並變量,並賦值
示例:
{assign var="name" value="Bob"}{assign "name" "Bob"} {* 簡寫 *}
* {$var=} 簡寫模板中定義變量(同assign),
示例:
{$name='Bob'}{$user.name="Bob"}{$users[]="Bob"}
{append} 在模板執行期間建立或追加模板變量數組。
示例:對數組name追加成員值
{append var='name' value='Bob' index='first'}
{function} 用來在模板中創建函數,可以像調用插件函數一樣調用它們。
{call} 用來調用{function}標簽定義的模板函數
{capture} 用來捕獲模板輸出的數據並將其存儲到一個變量里,而不是將它們輸出到頁面。
* {config_load} 載入配置文件:用來從配置文件(位於configs目錄)中加載config變量(#variables#)到模版。
示例:
{config_load file="lang.conf" section="en"}
{debug} 顯示調試控制台
* {for} 簡單的循環
{for} 標簽用來創建一個簡單循環,支持 {forelse} 分支標簽且支持以下不同的格式:
{for $var=$start to $end}步長為1的簡單循環;
{for $var=$start to $end step $step}其它步長循環。
示例:
<ul> {for $foo=1 to 3} <li>{$foo}</li> {/for} </ul>
* {foreach},{foreachelse}
3.x版格式:
{foreach $data as [$k=>]$v}
//輸出$k / $v
{/foreach}
2.x版格式(仍然兼容)
{foreach from=$data item="v" key="key"}
{/foreach}
* {if},{elseif},{else}
每一個{if}必須與一個{/if}成對出現,允許使用{else}和{elseif}。
所有php條件和函數在這里同樣適用,諸如||、or、&&、and、is_array()等等。
例如:
{if $name == 'Fred' || $name == 'Wilma'}
...
{/if}
*{include} 包含其他模板
例如:
{include file="header.html"}
{include file="sider.html"}
{insert}標簽類似於{include}標簽,不同之處是即使打開caching,它所包含的內容也不會被緩存,每次調用模板都會執行.
該特性可以廣泛應用於廣告條、投票、實時天氣預報、搜索結果、反饋信息等區域。
{* 獲取一個橫幅廣告示例 *}
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
{block} 用來定義一個命名的模板繼承源區域。
{extends} 標簽用在模板繼承中子模版對父模板的繼承。
{ldelim},{rdelim} 用來轉義模版定界符,默認值為"{"和"}"。
*{literal} 標簽區域內的數據將按字面意思處理,代表性地是用在javascript/css語塊周圍
{nocache} 用來禁止模版塊緩存,每個{nocache}應與{/nocache}成對出現。
{php},{include_php}已被Smarty棄用,不應再使用。還是用你自己編寫的php腳本或插件函數來代替它吧!
*{section},{sectionelse}
{while}
2)Smarty擴展函數(Smarty自定義的,使用頻率不高,了解即可)
{counter} {cycle} {eval} {fetch} {html_checkboxes} {html_image} {html_options} {html_radios} {html_select_date} {html_select_time} {html_table} {mailto} {math} {textformat}
4、緩存
1)配置開啟緩存
$smarty = new Smarty; $smarty->caching = true;//開啟緩存 $smarty->cache_lifetime = 3600;//緩存開啟1小時
一般不建議全站開啟緩存,哪個頁面需要就開啟哪個。
所以,不要把緩存配置寫在公共配置文件里
2)Smarty里緩存相關方法
isCached() 檢測模板是否具有有效緩存
clearCache() 清除指定模板緩存
clearAllCache() 清除整個模板緩存
3)使用情況示例
比如學生信息的增刪查改操作,我們在查詢時可以緩存:
if(!$smarty->isCached("index.html")){ $data=$m->select(); $smarty->assign("data",$data); } $smarty->display("index.html");
對於增刪改,我們不應該使用緩存,所以在執行相關操作成功后,應該清除緩存:
if($res){ $smarty->clearCache("index.html"); }
但是這樣還有個Bug,就是你不管修改哪個用戶數據,進入edit頁面,表單里數據不變。
那么這時候只能使用多級緩存了,用戶修改頁面就要這樣寫了:
if(!$smarty->isCached("stu/edit.html",$_GET['id'])){ $stu = $mod->find($_GET['id']); $smarty->assign("data",$stu); } $smarty->display("stu/edit.html",$_GET['id']);
那么update更新成功后應該清除兩個緩存:
$smarty->clearCache("index.html"); //清除瀏覽緩存 $smarty->clearCache("edit.html",$_POST['id']); //清除修改表單緩存
