1、簡介
含義:Smarty是PHP的一個引擎模板,可以更好的進行邏輯與顯示的分離,即我們常說的MVC,這個引擎的作用就是將C分離出來。
環境需求:PHP5.2或者更高版本
我使用的環境是:PHP5.3,windows 環境
2、安裝
在網上下載Smarty包直接將其解壓,我們需要的僅僅是里面的libs文件夾。Libs文件里面都是庫文件,我們不應該修改里面的任何內容。解壓完畢后就直接將libs文件夾放入到我們需要使用的網站根目錄。
3、基本情況簡介
首先打開Smarty.class.php文件看看里面的一些代碼:
Smarty的構造器:
templates:默認存放模板文件夾
templates_c:默認存放混編文件的文件夾
cache:存放緩存
configs:存放配置文件
默認左右邊界符:
4、使用
從上文了解到Smarty需要一些文件夾用來分別存放不同類別的文件。有templates、templates_c、cache、configs等文件夾。這是默認文件夾名稱,你可以根據你的喜好對它們進行更改。
1、下是我建立的文件夾:
2、簡單實例
先在templates文件夾下准備自己需要的模板文件。test1.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 </head> 7 <body> 8 它的名字叫{$name} 9 </body> 10 </html>
接着在根目錄下建立訪問的邏輯文件。test1.php
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $name='劉二狗'; 5 $smarty->assign( 'name' , $name ); 6 $smarty->display('./test1.html');
訪問test1.php結果為:
當訪問完后將會在templates_c中生成一個相應的混編文件
這就是Smarty在PHP中的簡單使用。
5、Smarty常用的語法
5.1、普通變量的聲明與使用
一共有兩種聲明變量的方法。
第一種:上面的例子已經使用過,即$smarty->assign('name','值');
第二種:在模板文件中聲明(html中),即{assign var='name' value='值'}
使用:{$name}
注意:也可以定義與使用數組。假若上面定義的name為一個一維數組,使用時即:{$name[2]}、{$name['aa']}={$name.aa}等等使用方式。
5.2、注釋
{* 這里面是注釋內容 *}
Smarty的注釋是不會在最終頁面輸出顯示的,即:若在html里則效果像<!--注釋-->一樣,不過也有一定的區別,Smarty的注釋在瀏覽器里查看源代碼也是不顯示的,而html的注釋是顯示的。例如:
5.3、數組
Smarty對數組的使用:數組[下標]、數組.下標
5.4、對象
對象的聲明和變量一樣,通過assign來聲明
使用采用 -> 來調用對象的屬性
5.5、保留變量
Smarty中有一個特殊的變量(就是smarty)可以通過這個變量很容易就可以訪問到一些環境變量。就像PHP中的超全局變量一樣神奇。
注意:在使用這個保留變量的時候:smarty是對於大小寫敏感的,我們需要的是小寫的smarty
例子:
一、使用smarty訪問PHP中的超全局數組變量:
1、獲取$_GET {$smarty.get.name} 獲取get中的name值
2、獲取$_POST {$smarty.post.name} 獲取post中的name值
3、獲取$_COOKIE {$smarty.cooke.name} 獲取cookie中的name值
同理,還可以獲取$_SERVER
, $_ENV
和 $_SESSION
等等
注意:雖然Smarty提供了較方便直接訪問PHP超全局變量的方法,但必須謹慎使用。 直接訪問超全局變量會弄亂應用程序底層代碼和模板語法。 最佳的實踐是從PHP將需要的變量對模板進行賦值再使用。
二、獲取當前時間戳
{$smarty.now}其原理就是調用了timr()函數
三、直接訪問PHP常量
{$smarty.const.常量名}即{$smarty.const.AGE}
PHP定義常量
smarty直接調用常量
結果
四、其他
獲取配置變量:{$smarty.config}
返回當前模板名稱:{$smarty.template}
返回當前模板對象:{$smarty.template_object}
返回當前目錄名稱:{$smarty.current_dir}
等等
5.6、配置文件
之前根據需求建立的Configs文件夾可以派上用處啦!我們在這個文件夾下建立Smarty.conf配置文件(命名任意,木有明確規定),配置文件可以讓設計者將全局的模板變量以文件的方式管理起來。
首先我們先來定義一些配置變量來對它進行簡單的了解:
定義如下所示:
引入配置文件:{config_load file=’Smarty.conf’}
引用配置變量:{#配置變量#}、{$smarty.config.配置變量}
顯示結果:
了解段落變量定義與引用:
在Smarty配置文件中大體分為兩種變量,一種為全局變量,另一種為段落變量。全局全局變量故名思議就是就是每次載入這個配置文件的時候這些變量都會被加載。而段落變量則有選擇的進行加載。
段落變量的定義語法:
[段落名字]
段落名字:這里可以是任意字符但不包括’[‘和’]‘,具體定義看下面Smarty.conf
調用段落變量:在引入配置文件后面加上這段代碼 section='段落名字'。
注意:section只能使用一次,若有多個section引入多個段落變量則最后一個會覆蓋前面的所有section引入的段落變量,即只有最后一個引入的段落變量有用其他作廢。
Smarty.conf文件
1 #這里是注釋,#為注釋符號 2 #這里是全局變量,也就是說title和bodyColor變量每次都會被加載 3 title='標題' 4 bodyColor='#eee' 5 6 #段落變量 7 [firstStyle] 8 color='#00f' 9 width='200px' 10 height='300px' 11 12 [.secondStyle] 13 color='#00f' 14 width='200px' 15 height='300px' 16 17 [other] 18 other='這是其他'
test1.html文件
1 {config_load file='Smarty.conf' section='firstStyle'} 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <meta charset="utf-8"> 6 <title>smarty test1</title> 7 </head> 8 <body> 9 <!-- 這里是html注釋 --> 10 {*這是Smarty注釋*} 11 名字:{$jane->name }<br/> 12 性別:{$jane->sex}<br/> 13 年齡:{$jane->age} 14 <hr/> 15 常量年齡:{$smarty.const.AGE} 16 <hr/> 17 使用配置變量1:{#title#}<br/> 18 使用配置變量2:{$smarty.config.bodyColor} 19 <hr/> 20 段落變量加載:<br/> 21 {#color#} 22 <br/> 23 {#other#} 24 </body> 25 </html>
訪問結果:
注意:
1、若全局變量與被加載的段落變量有相同的變量名,則段落名的值將覆蓋全局變量的值。
2、若某個段落變量里含有相同的變量名,則最后一個的變量的值將會覆蓋前面的值。
3、在整個smarty.conf文件中,點(.)擁有相對較高的權限的。點的作用是將一個變量或者整個段落隱藏,不能被使用。(我的理解就是相當於被注釋掉不能被使用)
段落變量的一個簡單應用:
假若我們要使一個網站可以在多種風格的界面轉換,這時我們使用段落變量就可以很容易就實現了。
test1.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 <style type="text/css"> 7 #aa{width: 200px;height: 200px;background: red;} 8 </style> 9 </head> 10 <body> 11 <div id='aa'> 12 這是一個div 13 </div> 14 </body> 15 </html>
訪問結果:
訪問結果出現一個錯誤。由於使用了smarty模板,所以在html的所有{}將會被smarty解析。
解決方法:
1、更換定界符
2、在({)前面加一個空格,
3、使用{literal}{/literal} literal:原樣的,原義的
簡單應用,讓一個div實現兩種背景顏色:
test1.php
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $smarty->display('./test1.html');
Smarty.conf
1 #段落變量 2 #第一種顏色風格 3 [firstStyle] 4 color='#00f' 5 width='300px' 6 height='300px' 7 content='第一種風格' 8 9 #第二種顏色風格 10 [secondStyle] 11 color='#0f0' 12 width='500px' 13 height='500px' 14 content='第二種風格'
測試1:
test1.html
1 {config_load file='Smarty.conf' section='firstStyle'} 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <meta charset="utf-8"> 6 <title>smarty test1</title> 7 <style type="text/css"> 8 #aa{ width: {#width#};height: {#height#};background: {#color#};} 9 </style> 10 </head> 11 <body> 12 <div id='aa'> 13 14 這是一個div<br/><br/> 15 {#content#} 16 </div> 17 </body>
結果:
測試2:
test2.html
1 {config_load file='Smarty.conf' section='secondStyle'} 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <meta charset="utf-8"> 6 <title>smarty test1</title> 7 <style type="text/css"> 8 #aa{ width: {#width#};height: {#height#};background: {#color#};} 9 </style> 10 </head> 11 <body> 12 <div id='aa'> 13 14 這是一個div<br/><br/> 15 {#content#} 16 </div> 17 </body> 18 </html>
結果:
5.7、判斷{if}{elseif}{else}
Smarty的{if}
條件判斷和PHP的if非常相似,只是增加了一些特性。 每個{if}
必須有一個配對的{/if}
. 也可以使用{else}
和 {elseif}
. 全部的PHP條件表達式和函數都可以在if內使用,如||, or, &&, and, is_array(), 等等.
注意:如果開啟了安全機制,那么只有在$php_functions設置允許的php函數才能夠使用。
運算符表:
5.8、for
{for}{forelse}用於創建簡單的循環
{forelse}在循環不能遍歷的時候使用
例子:
5.9、while
Smarty的while循環和PHP中的while循環是幾乎一樣的,smarty中需要在后面增加</while>來結束
例子:
結果:
5.10、{section}{sectionelse}
可以循環遍歷連續數字索引的數組,不能循環關聯數組
基本使用:
訪問結果:
不使用賦值數組直接輸出:
結果:
遍歷關聯數組:
結果:
Section還有很多關鍵字強大的功能還沒有一一列出來,具體可以參考smarty手冊。Foreach相對於section來說顯得更加強大,能用section做到的,foreach也能做到,並且foreach使用起來更加方便簡單,接下來我們來學習了解foreach。
5.11、foreache與foreachelse
通過類比的方法可以知道foreache是用來循環數組的。如果不存在遍歷的數組則執行{foreachelse}部分
注意:這里不存在的數組指的是定義后這個數組沒有數據。假若這個數組沒有定義,則會發出警告。
簡單例子:
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $arr=array('name'=>'小明','sex'=>'男','age'=>'18'); 5 $smarty->assign( 'arr' , $arr ); 6 $smarty->assign('arr0',array()); 7 $smarty->display('./test1.html');
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 </head> 7 <body> 8 {foreach $arr as $k=>$v} 9 {$k}=>{$v}<br/> 10 {foreachelse} 11 99999 12 {/foreach} 13 <hr/> 14 {foreach $arr0 as $k=>$v} 15 {$k}=>{$v}<br/> 16 {foreachelse} 17 此處輸出foreachelse,無數據 18 {/foreach} 19 </body> 20 </html>
訪問結果:
在smarty中使用foreach和我們在PHP中的foreach循環幾乎是一樣的,就是書寫的方式不一樣,但形式上是一樣的!
foreach具有一些內部關鍵字:
1、@iteration,當前循環次數,從1開始
2、@index,表示當前索引,從零開始
3、@first當前是首次循環是,first為true
4、@last循環最后一次時,last為true
5、@show,是在{foreach}循環執行后,,檢測循環是否有輸出,show是一個布爾值
6、@total,{foreach}的循環次數,total可以在{foreach}
內部,或者之后使用
7、{break},停止循環
8、{continue},跳出此次循環
例子:
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $arr=array('name'=>'狗蛋','sex'=>'男','age'=>'18','from'=>'廣東','tel'=>'123456789'); 5 $smarty->assign( 'arr' , $arr); 6 $smarty->display('./test1.html');
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 </head> 7 <body> 8 {foreach $arr as $k=>$v} 9 10 11 {if $v@iteration==2} 12 <b>{$k}=>{$v}</b>---這里iteration,從1開始計算<br/> 13 {continue} 14 {/if} 15 16 {if $v@index==2} 17 <b>{$k}=>{$v}</b>---這里index,從0開始計算<br/> 18 {continue} 19 {/if} 20 21 {if $v@first} 22 <b>{$k}=>{$v}</b>---這里first,數組第一個元素<br/> 23 {continue} 24 {/if} 25 26 {if $v@last} 27 <b>{$k}=>{$v}</b>---這里last,數組最后一個元素<br/> 28 {break} 29 break將已經跳出去了,不能在輸出這里的內容了【這個例子跳出整個循環的現在不能夠檢驗,讀者可自己進行測試】 30 {/if} 31 32 {$k}=>{$v}<br/> 33 34 {/foreach} 35 <hr/> 36 總循環次數:{$v@total} 37 {if $v@show} 38 <hr/> 39 判斷上面循環有輸出<br/> 40 {/if} 41 42 </body> 43 </html>
訪問結果:
5.12、自定義函數
Smarty自帶了一些自定義的函數插件,可以在模板內使用。
以下是參考smarty手冊所列的自定義函數:
a、{counter},用於顯示一個計數器。 {counter}
可以記住foreach循環的次數。
b、{cycle},用於交替循環一系列值。
c、{fetch},用於獲取文件內容、HTTP或者FTP內容,以便輸出。
d、{html_checkboxes},是一個自定義函數,用於創建HTML的多選框組和提供數據。
e、{html_image},用於生成HTML的<img>標簽。
f、{html_options},可以提供數據,生成HTML<select><option>標簽,還可以設置選中項等屬性。
g、{html_radios},用於創建HTML的單選框和提供數據。
h、{html_select_data},用於創建一個選擇日期的下拉框。 它可以顯示任何或者全部的年、月、日。 任何不在上面列表中的鍵值對屬性,都會被輸出到<select>
標簽中作為屬性和值。
i、{html_select_time},用於創建一個選擇時間的下拉框。 它可以顯示任何或全部的小時、分鍾、秒和上下午。
j、{html_table},可以使用數組的形式的數據來創建一個HTML的<table>。
k、{mailto},可以自動創建一個mailto:
鏈接,而且可以選擇編碼方式。 對郵件編碼可以使郵件地址更難以被網絡爬蟲抓取。
l、{math},可以讓模板設計者在模板中進行一些數學運算。
m、{textformat},是一個用於格式化文本的塊函數。
以上是smarty的自定義函數,具體的使用方法請參考smarty手冊。
5.13、模板布局
即是模板的繼承問題。使用的關鍵字主要有block、extends
首先,我們先在站點建立一個layout文件夾(主要用來存放父模板文件),然后在文件夾下建立一個模板文件template.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>這個是模板文件</title> 6 </head> 7 <body> 8 <h2>這個是模板文件輸出的</h2> 9 10 <hr/> 11 子輸出一:{block name='first'}{/block} 12 <hr/> 13 <hr/> 14 子輸出二:{block name='second'}{/block} 15 <hr/> 16 17 <h2>這個是模板文件輸出的</h2> 18 </body> 19 </html>
接着再建立模板文件test.html,此模板需要繼承上面的父模板
1 {extends file='layout/template.html'} 2 {block name='first'} 3 這里是test中的first 4 {/block} 5 {block name='second'} 6 這里是test中的second 7 {/block}
邏輯文件調用smarty,test.php
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $smarty->display('./test.html');
訪問結果:
小結:若含較多的公共部分,則采用布局文件;含公共部分較少,則采用包含文件{include file='文件路徑'}
(以上是自己的一些見解,若有不足或者錯誤的地方請各位指出)
作者:那一葉隨風
聲明:本博客文章為原創,只代表本人在工作學習中某一時間內總結的觀點或結論。轉載時請在文章頁面明顯位置給出原文鏈接。