smarty學習筆記


PHP自己就是一種標籤語言, <?php echo $title; ?>php

容許代碼用標籤的形式任意嵌套在html,css

所以,咱們能夠用PHP自身的這種特性,完成controllerview的分離.html

 

1:Smarty能夠協助咱們分離PHPhtml代碼就是記html製做人員看不到PHP標籤前端

 2:也能夠對網站進行緩存(重要)web

3:面試是要用到面試

4:體會模板的思想數據庫

 

 

1:Cotrollerview的分離是一種功能上的分離,是一種分工的思想.數組

phphtml代碼的分離,僅是代碼層面或視覺層面上的分離.緩存

 

2:smartyMVC有什麼關係?cookie

不要緊.

Smarty完成的僅是代碼分離.

 

3:不用smarty,仍然是可以完成MVC模式的開發

 

 

Smarty的一些負面思考:

1:混雜在HTML代碼中smarty標籤和PHP代碼.

對於web前端開發人員來講,沒有實質區別

 

2:在實際開發中,html模板-->smarty模板的製做,依然是由PHPer來完成的

 

3:解析,編譯自己消耗性能

 

4:增多了不少變量,(頁面內的變量,都要賦值到smarty對象-->_tpl_vars 屬性上,多了一個變量的副本)

 

 

Smarty模板類的工做流程

1:引入smarty模板類

2:assign賦值把外界變量傳到對象內部(存在一個屬性上)

3:display (編譯模板,把標籤模板編譯成 html+php混雜的形式)

4:運行編譯後的模板

 

 


Smarty的引入

Smarty是一個類引入過程與普通的類沒有區別

1:include,require包含此文件

2:實例化

 

 

Smarty的配置

$template_dir    =  'templates';  // 模板文件的所在目錄

$compile_dir     =  'templates_c'; // 編譯後的文件所在目錄

$config_dir      =  'configs'; // 容許獨立的配置文件存在,而且配置文件若是多了,容許單獨放在一個目錄裏,

$cache_dir = 'cache'  // 表明緩存文件的存放目錄

plugins_dir     =  array('plugins','p2','p3');  // 插件目錄(若是自行開發插件,可能會用到)

 

left_delimiter  =  '{';  // 標籤的左分界符

Right_delimiter = '}'   // 標籤的右分界符

Caching = 0/1/2 // 是否開啓緩存

cache_lifetime = 3600 秒 // 緩存生命週期

 

Smarty的賦值

1: $smarty->assign('key',value);   

發生的變化$smarty->_tpl_vars[key] = value;

 

2: 若是assign($arr)中的第一個參數是數組

則會循環數組,把數組的每個單元追加到_tpl_vars屬性上

 

3:append追加賦值

若是須要把多個值,賦給同一個標籤變量沒必要把多個值造成數組而後賦值,

能夠經過append,往一個標籤反覆追加值.

 

:

$smarty->append('goods','自行車');

$smarty->append('goods','火車');

此時推論 $smarty->_tpl_vars['goods'] = array(自行車,火車);

 

若是append進去的值是數組,而且第3merge參數爲true,則會把數組單元逐個添加到goods數組裏去.

$smarty->append('goods',array('name'=>'劉備','age'=>28),true);

此時, $smarty->_tpl_vars['goods'] = array(自行車,火車,'name'=>'劉備','age'=>28);

 

若是是$smarty->append('goods',array('name'=>'劉備','age'=>28),false);

此時, $smarty->_tpl_vars['goods'] = array(自行車,火車,array('name'=>'劉備','age'=>28));

Smarty模板中,對變量的引用 

變量來源

1:assign賦值獲得的變量 存儲在_tpl_vars屬性中

2:$smarty系統變量對於cookie,session,get,post,$_SERVER等信息,存儲在_smarty屬性中

Smarty會自動捕捉,並保存起來,造成系統變量,能夠直接用標籤來引用.

3:從配置文件讀取的變量 存儲在_config屬性中

 

1.1 對於assign賦值獲得的變量

對於字符串型,數值型直接經過 $標籤名 來引用

 

1.2 對於數組變量

若是鍵是字符串,則用$標籤名.

若是鍵是數字則用 $標籤名[]

 

1.3 對於對象方式

$標籤名->屬性名 來引用對象的屬性值

$標籤名->方法() 來調用對象的方法的返回值

 

 

2.1 smarty中的系統變量

$smarty開頭

: $smarty.now, 被 解析成 time();

$smarty.get.key ---> $_GET[key]

$smarty.const.常量名 ---> echo 常量名

 

 

3.1 從配置文件獲得的變量

配置文件能夠用來存儲經常使用且不多變的數據,好比網站名,備案號

經過配置文件獲得這些信息,沒必要去讀數據庫,能夠省一些數據庫的開銷.

 

配置文件的寫法;

配置項1=1

配置項2=2

 

配置文件的載入

Config_load  file="xxx.conf" 

 

配置文件中變量的引用

$smarty.config.配置項

或者 #配置項#

 

 


模板中的邏輯控制

MVC的角度看,在模板中加邏輯控制不正確的,

可是有時,不一樣的場景下,模板的差別很是小時就比較適合在模板里加邏輯控制,

能夠減小模板的數量.

 

If控制結構

{if 表達式}

....

....

{/if}

 

If else 控制結構

{if 表達式}

...

....

{else}

....

....

{/if}

 

If elseif 控制結構

{if  表達式}

...

...

{else if 表達式}

...

...

{/if}

 

 

 


Smarty中的foreach控制結構

要循環誰某個數組 A

當前循環的單元的鍵賦給哪一個臨時變量 B

當前循環的單元的值賦給哪一個臨時變量 C

 

{foreach from=$tag key=k ietm=c

.....

.....

....

{/foreach}

 

foreach完成表格隔行換色功能

$smarty->_foreach 屬性是一個數組

若是smartyforeachname屬性name="abc"

smarty->_foreach['abc'] = array(total=>循環體個數,iteration=0);  

而後每循環一次,iteration 遞增1

 

能夠引用$smarty.foreach.foreahcname.key的屬性

Key =

total : 循環個數

Iteration: 當前循環次數

Index : 當前索引, iteration-1

First: 判斷是不是第1次循環

Last: 判斷是不是最後一次循環

 

 

注意:foreachname不能重複

 

Foreach中的key=k, item=v

會影響到同名的標籤,請注意,標籤不要和foreach中的標籤同名.

 


Smarty中數學運算 &比較運算 邏輯運算

Smarty比較運算符

>,<,>=,<=,!=,==,PHP中同樣.

Smarty對比較運算符作了一個擴充

如 gt(>),lt(<), gte(>=), eq(==), 不一一列舉,能夠在smarty_comilper.class.php1330

左右看到比較運算符的擴充狀況.

|| &&, or and

 

標籤中能夠進行數學的+1*/%運算,

可是注意,

1:運算符兩邊不要有空格

2:運算表達式應以標籤開頭

Smarty中的"變量調節器"

:{$intro|upper},會把$info的內容轉換爲大寫

原理:$intro做爲參數,傳給upper調節器對應的函數,

並顯示該函數值,而不是$intro

 

$標籤變量自己 會當成 調節器的第1個參數自動傳入,

若是須要傳更多參數,在調節器後面,':'隔開更多參數.

例  {$news|truncate:7:"..."}

 

經常使用變量調節器

date_format [格式化日期

default [默認值

escape [編碼

indent [縮進

lower [小寫

nl2br [換行符替換成 <br />] 

replace [替換

strip [去除(多餘空格)] 

strip_tags [去除html標籤

upper [大寫

動手寫一個變量調節器

 

*:如何作到中文截取無亂碼(常見的一道面試題)

 


Smarty模板編譯的特色

Phplib也是一種模板引擎

Smarty的一個特色先編譯成.php文件,再執行該 PHP

Phplib是把變量直接替換模板中的標籤.

 

Smarty在第一次運行的時候,稍慢 ,包含了 編譯模板+包含執行

後面的運行中速度會快,由於直接包含PHP文件.

 

: smarty什麼時間從新編譯模板?

根據模板修改的時候.

spacer.gifspacer.gifspacer.gif 

spacer.gifspacer.gif 

spacer.gifspacer.gifspacer.gifspacer.gif 

 

 

 

 

若是想強制編譯好比在開發過程當中

能夠force_compile=true 強制編譯
Display, fetch的區別

Display ftech方法第4個參數爲true的調用.

Fetch4個參數爲true,則把編譯後文件的運行結果輸出!

.......           false,則把編譯後文件的運行,返回,不輸出.

 

: display() = echo fetch();

 

如何實現頁面靜態化?

就是把.php的輸出內容,保存成html

但須要考慮如下細節:

1:生成的靜態頁面的地址,

:253新聞若是是動態狀況下,News.php?nid=253

若是生成了靜態頁面 253.html

不能直接放一個目錄下要按規律分目錄,例如 年/月日/類別/253.html

spacer.gifspacer.gif 

spacer.gif 

 

 

 

 

 

大批量生成靜態頁面,以織夢爲例

新聞表

有個字段標誌是否已生成靜態頁面 ,

另個字段記錄生成後靜態頁面的地址

 

生成列表頁面或主頁時重新聞表取地址

 

注意目錄的深度目錄深不利於SEO,淺的話,每一個目錄放的頁面過多.

 

 

Smarty如何獲取PHP編譯文件要輸出的內容

:利用輸出緩衝來實現

Ob_*系列函數

 


緩存

1:首選打開緩存配置項  $smarty->caching = true;

2:緩存生命週期的配置選項: $smarty->cache_lifetime = 整數秒

3:$smarty->is_cached()判斷是否緩存,若是緩存,則避免IO操做

 

單模板多緩存

1個模板還能夠根據其餘參數,緩存多個結果,好比商品頁面根據商品id來爲每一個商品緩存一個頁面.

原則凡是可以影響到頁面內容的參數,就要根據此參數影響cached_id

這樣,不一樣參數才能對應不一樣的緩存內容.

 

用法:

Display(模板名[,緩存名]);

同一個模板名,若是不加緩存名,只能生成一個緩存文件.

若是有緩存名,則會按 緩存名+模板名 生成緩存文件.

若是同一個模板,提供不一樣的緩存名

則一個模板會產生多個緩存.

 

同理在判斷某個模板是否已被緩存的時候,也須要注意,

要傳一個緩存名.

即 is_cached(模板名,緩存名)  才能合理判斷.

 

緩存判斷原理

當前時間 緩存生成時間 生命週期 

 

 

局部緩存

在模板中,不須要緩存的地方,{insert name="nocachedid"}來表示那麼該處最終的值是 insert_nocachedid()的返回值

spacer.gif 

 

經過hash,"局部不緩存"的數組包圍起來,

用該hash,把整個緩存文件 explode拆成數組

Arrray(

'html代碼'

不緩存內容,

Html代碼

不緩存內容

)

 

循環該數組分析"不緩存內容",把數組分析出來,讀取數組的$arr['name'],

name就是不緩存內容,並且是待調用函數的名稱.

調用 insert_name(), 把函數的返回值替換掉"不緩存內容"

數組循環替換一遍以後,就把頁面上全部不緩存的部分都替換成了函數的返回值,

最後,

再把數組implode拼接起來,就是最終的頁面內容.

 

 

 

 


 

 

清除緩存

清除緩存就把"模板名+緩存名"對應的緩存文件刪除掉

Clear_cache(模板名[,緩存名]);

 

Clear_all_cache();

 

 

 

 

 

 


Smarty定界符衝突的解決

若是smarty用定界符,好比 {,},

此定界在js,css裏都有極可能碰到,若是碰到,會當成smarty標籤來解析,進而引起錯誤發生.

 

解決方法:

1:換定界符,如 {> <}

2:literal標籤,"原義","字符意義的","無誇張的"

 

 

模板的包含

include標籤來包含

具體語法 {include file="xxx.html"}

注意,也能夠有多級目錄來放置模板若是有多級目錄,

以哪個目錄來定位?

:$smarty->template_dir目錄來定位
:緩存

按緩存位置分:文件緩存或者內存緩存

1:文件緩存就是把數據以文件形式保存,

這個過程,是消耗IO資源.

 

2:頁面緩存或者靜態頁面 ,緩存的是總體html代碼,有大量的冗餘的緩存.

 

按緩存內容分頁面緩存和數據緩存

3:真正應該緩存的是數據,而不是文件

 

例如:1500W條數據中,300W條被頻繁訪問,

能夠把這300W條數據(不是靜態頁面 ),緩存到內存

甚至把300W條數據緩存到數據庫'

 

4:p_w_picpaths,js,css,等文件進行 前端緩存

相關文章
相關標籤/搜索