Smarty3學習筆記


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']); //清除修改表單緩存

 


免責聲明!

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



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