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 ,1,2,這樣的索引值。
ü 和foreach類似,可以使用index、iteration、first、last、total等屬性,訪問方式$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中用true將index值覆蓋掉,爲了在header.html中區別要不要顯示分類數據),然後讓indexController等類文件繼承BaseController類文件,然後再從模型中取數據,分配變量,最後調用smarty方法display,去引入視圖目錄中的模板。
模板包含:在index.html中提取出頭部信息,到header.html中,然後在各模板文件中引入頭部信息{include file= “header.html”},就是模板包含
在視圖模板中通過smarty的定界符,內置函數,傳過來的變量來輸出數據
3.模板繼承
先回憶一下php中的機制:
ü 首先,需要定義一個基類(父類),在父類中定義通用的屬性或方法。
ü 其次,子類要通過extends來繼承父類,父類中非私有的屬性和方法都可以被繼承過來。
ü 如果在子類中定義了一個和父類相同的方法時,則會覆蓋父類的。
注意事項:
ü 佈局頁面可以有許多block,子級頁面也可以有許多block,通過name屬性進行關聯。
ü 子級頁面除了extends和block其他內容不予顯示
ü 佈局頁面的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(),將模板文件變成了html與php混編格式的編譯文件
display方法就是把模板文件拿到php文件中來,在display方法中引入解析類parse,調用解析方法parse,解析方法中調用瞭解析if,foreach,而且返回值是變量值
在php中如何來使用正則
使用正則的時候,注意兩個小的細節:
ü 正則表達式應該放在//之間
ü 使用單引號引用
(4).正則表達式
http://deerchao.net/tutorials/regex/regex.htm