smarty總結

smarty語法  1.定界符 2.註釋

 3.變量(1.通過assign分配過來的變量 2.保留變量,他是無需分配的直接在模板中使用(包括smarty本身的及超全局變量,其中常量是需要先定義,但無需分配) 3.配置變量 )

4.內置函數

(1.if/else  選擇結構。和php中if/else幾乎是一樣的。唯一不同的是現在是使用smarty語句來書寫的。{if},{elseif},{else}

2. foreach    重中之重   處理數組的情況最多,一維數組、二維數組、多維數組。   foreach是使用做多的。

格式有兩種,如下:

ü {foreach $arrayvar as $itemvar}

ü {foreach $arrayvar as $keyvar=>$itemvar}

{foreach}還有一些屬性,非常有用,有以下6

ü @index , 當前數組索引,從0開始計算

ü @iteration,當前循環的次數,從1開始計算

ü @first,首次循環時,該值爲true

ü @last,循環到最後一次時,該值爲true

ü @total,總的循環次數,可在foreach內部使用,也可以在循環完成之後使用

@show,在foreach循環執行完之後,檢測循環是否顯示數據的判斷

{foreach $arr1 as $k => $v}

<tr

{if $v@iteration is odd} class="odd" {/if}

>

<td>{$v.id}</td>

<td>{$v.name}</td>

<td>{$v['age']}</td>

</tr>

{/foreach}

3.section 也是用來循環的。只能遍歷數字連續的索引數組。

<ul>{section name = 'index' start = 2 loop = $arr}

<li>{$arr[index]}</li>

{/section}</ul>

其中,name就是下標,而loop則是循環的次數。可以通過下標來訪問我們的數組元素。結論:不要用section來遍歷關聯數組。

 

還需要注意一點,就是loop的取值可以是分配過來的數組的名字。

 

如果是關聯數組,則會報錯誤

☞ 注意細節

ü loop 後面接的通常是 分配過來的數組,也可以直接寫一個數字,如果接的是一個數組,則會計算其長度,作爲其循環總次數。

ü 而item 相當於數組的索引值,即0 12,這樣的索引值。

ü 和foreach類似,可以使用indexiterationfirstlasttotal等屬性,訪問方式$smarty.section.name.index,其中name就是name屬性的值。

 

在實際應用中,凡是能使用section的地方,都可以使用foreach,但是反之不行。所以一般我們只需要使用foreach即可。

 

 

4.變量修飾器

有的時候,我們在模板中使用數據,還需要做進一步的處理,而且只能在模板層面來處理。

比如,我們在完成無限分類的展示的時候,按照層級來進行顯示。

如果有多個參數呢,只需要使用:隔開即可。

如truncate的使用

 注意細節

ü 除了smarty自帶的一些調節器之外,php中的函數也是可以直接使用的

ü 可以在一個變量上使用多個變量調節器,多個之間使用 |隔開即可

ü 可以自定義變量修飾器函數

5.函數插件

作爲前端開發人員,經常需要根據分配過來的變量,輸出各種表現形式的html,如表單、表格等。

除了可以使用 foreach 來輸出這些內容之外,smarty還 自帶了一些自定義的函數插件,可以在模板內使用。

(1).單選html_radios

用於生成單選框組

(2).複選 html_checkboxes

用於生成複選框組

(3).下拉列表html_options

用於生成下拉列表

(4).cycle

用於循環交替某些值。)

5.Smarty實戰

站在PHP開發人員的角度學習並使用smarty

包括進階安裝(在項目中如何安裝)、模板包含、模板繼承、緩存。

1.在項目中引入smarty

[需求]:在中級項目shopcz中使用smarty思考:我們的smarty應該放在哪兒?

application還是framework呢?

答案是:都可以。

不同的程序員會有不同的考慮。如放到framework,把smarty作爲框架的一個部分,thinkphp

比如放到application中,將smarty作爲第三方文件來引入,比如CI框架。

我們採取第二種,作爲第三方的工具引入smarty

注意保證文件夾層次的簡潔性。將原來的libs更名爲smarty

具體怎麼使用呢?

2.模板包含

[需求]:把商品詳情頁中的頭部信息也顯示出來

第一步,將頭部的信息,單獨的保存爲header.html注意,剪切的位置。

第二步,在模板頁面中,使用include載入頭部即可。

 

在項目中使用smarty模板引擎。

先複製smarty文件到application下的third-party下,然後在views下的home文件下建兩個文件夾   

然後在Basecontroller類文件下的構造函數中寫引入smarty類文件,實例化smarty對象,注意讓$smarty變成BaseController的一個屬性,要不然一個函數的局部變量不能被繼承,設置模板目錄編譯目錄屬性,分配變量, 然後再多分配一個index值爲false(爲了在IndexController中用trueindex值覆蓋掉,爲了在header.html中區別要不要顯示分類數據),然後讓indexController等類文件繼承BaseController類文件,然後再從模型中取數據,分配變量,最後調用smarty方法display,去引入視圖目錄中的模板。

模板包含:在index.html中提取出頭部信息,到header.html中,然後在各模板文件中引入頭部信息{include  file= “header.html”},就是模板包含

在視圖模板中通過smarty的定界符,內置函數,傳過來的變量來輸出數據

3.模板繼承

先回憶一下php中的機制:

ü 首先,需要定義一個基類(父類),在父類中定義通用的屬性或方法。

ü 其次,子類要通過extends來繼承父類,父類中非私有的屬性和方法都可以被繼承過來。

ü 如果在子類中定義了一個和父類相同的方法時,則會覆蓋父類的。

注意事項:

ü 佈局頁面可以有許多block,子級頁面也可以有許多block,通過name屬性進行關聯。

ü 子級頁面除了extendsblock其他內容不予顯示

ü 佈局頁面的block可以有默認內容,子級頁面不實現就直接顯示,實現就覆蓋。

ü 佈局頁面的block可以彼此嵌套,子級實現可以有針對性實現。

ü {$smarty.block.child}佈局可以調用子級的內容,{$smarty.block.parent}子級頁面可以調用父級頁面內容

 

我們如何來選擇使用模板包含和模板繼承?

ü 如果頁面的公共部分比較少的時候,用包含就可以了。

ü 如果頁面的公共部分比較多的時候,使用繼承會好一些。

4.插件擴展

smarty中,有這麼幾種函數,內置函數、變量修飾器、插件函數。通常內置函數不用擴展。擴展較多的是變量修飾器。

有時候,我們在頁面中輸出的時候,發現smarty提供的變量修飾器以及php函數都不能滿足我們的需求,此時就擴展。

擴展寫在什麼地方?plugins

五.Smarty緩存

常見的緩存形式有哪些?

數據緩存,站在數據庫的角度(mysql),有些數據不是經常變化的,我們就可以把它緩存起來,下次再訪問的時候,就直接訪問緩存,極大了提升了效率。Memcached

文件緩存,也稱頁面緩存,有些頁面,一旦生成,就不再變化,我們可以將這些頁面緩存起來,就是直接將其轉成靜態頁面,後續的訪問就直接訪問靜態頁面,極大了提升訪問的效率。

頁面靜態化技術。

我們的smarty也實現了緩存,實現的是文件緩存

什麼情況下緩存會失效呢?

已經過了有效期cache_lifetime的設置值.    緩存文件被刪除.    模板文件被修改、

2.局部不緩存

一旦頁面使用了緩存之後,那整個頁面的內容就不會變化。

但實際上,在某些頁面,需要動態的展示信息,比如時間、用戶的狀態。

意味着在我們的頁面中, 有一小塊內容是不緩存。

Smarty提供了一個局部不緩存的用法。

有三種方式:標籤的緩存控制,即在標籤中使用 nocache屬性,適用於單個標籤

ü 變量的緩存控制,即在分配變量時設置第三個參數爲 true,適用於單個變量

ü 模板區域緩存控制,即在模板頁面中使用{nocache} {/nocache},適用於一塊

3.單模板多緩存

[需求]:在我們的商品詳情頁中使用緩存

原因:所有的商品都共享一個模板頁面,所以就都使用了同一個緩存文件

需要將每個商品單獨的生成一個緩存文件,這個就是單模板多緩存

實現很簡單,只需要在display的時候,傳遞第二個參數,用來標識當前的內容。

4.緩存組

[需求]:對我們的列表頁實現緩存    載入我們的列表頁

還是可以使用緩存的。該怎麼緩存呢?---smarty提供了緩存組的用法,實際上它是單模板多緩存的一種更爲精細的用法。

 

自定義模板引擎

首先是模板類中屬性有: //保存變量的數組屬性

private $tpl_vars = array();

//模板目錄

public $template_dir = "templates";

//編譯目錄

public $compile_dir = "templates_c";

方法://分配變量方法

public function assign($name,$value)作用:將變量的值存到模板類的數組屬性中,

//載入模板方法

public function display($file)

display只是把模板文件內容取出來$content = file_get_content($file),經過引入解析類Parse,做了替換處理,此時的模板文件中的$title已經變成了<?php echo $this->tpl_vars[‘title’];?>,再將此時的$content放到編譯文件了file_put_contents($compileFile, $content);,然後再載入編譯文件,此時的編譯文件就是php文件了。也就是編譯文件與index.php文件在一個頁面中

 

模板引擎就是把php代碼和html代碼分開,php中的變量值怎樣到html中呢,通過模板引擎解決.   php中的變量值沒有傳到html中,只是保存到自己的數組屬性了,然後在編譯文件中要輸出的變量值替換成了<?php echo $this->tpl_vars[‘title’];?>這種格式,所以就在視圖層輸出了php的變量值

就是運用了正則表達式匹配,字符串的搜索和替換preg_match(),preg_replace(),將模板文件變成了htmlphp混編格式的編譯文件

display方法就是把模板文件拿到php文件中來,在display方法中引入解析類parse,調用解析方法parse,解析方法中調用瞭解析if,foreach,而且返回值是變量值


php中如何來使用正則

使用正則的時候,注意兩個小的細節:

ü 正則表達式應該放在//之間

ü 使用單引號引用

(4).正則表達式

http://deerchao.net/tutorials/regex/regex.htm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章