Smarty的基本使用與總結

一、簡介

含義:Smarty是PHP的一個引擎模板,能夠更好的進行邏輯與顯示的分離,即咱們常說的MVC,這個引擎的做用就是將C分離出來。css

環境需求:PHP5.2或者更高版本html

我使用的環境是:PHP5.3,windows 環境ios

二、安裝

     在網上下載Smarty包直接將其解壓,咱們須要的僅僅是裏面的libs文件夾。Libs文件裏面都是庫文件,咱們不該該修改裏面的任何內容。解壓完畢後就直接將libs文件夾放入到咱們須要使用的網站根目錄。windows

 

三、基本狀況簡介

     首先打開Smarty.class.php文件看看裏面的一些代碼:數組

Smarty的構造器:瀏覽器

  

templates:默認存放模板文件夾緩存

templates_c:默認存放混編文件的文件夾安全

cache:存放緩存cookie

configs:存放配置文件

默認左右邊界符:

  

 

四、使用

     從上文了解到Smarty須要一些文件夾用來分別存放不一樣類別的文件。有templates、templates_c、cache、configs等文件夾。這是默認文件夾名稱,你能夠根據你的喜愛對它們進行更改。

一、下是我創建的文件夾:

二、簡單實例

先在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中的簡單使用。

五、Smarty經常使用的語法

5.一、普通變量的聲明與使用

  一共有兩種聲明變量的方法。

  第一種:上面的例子已經使用過,即$smarty->assign('name','值');

  第二種:在模板文件中聲明(html中),即{assign var='name'  value='值'} 

  使用:{$name}

  注意:也能夠定義與使用數組。倘若上面定義的name爲一個一維數組,使用時即:{$name[2]}、{$name['aa']}={$name.aa}等等使用方式。

5.二、註釋

     {* 這裏面是註釋內容 *}

     Smarty的註釋是不會在最終頁面輸出顯示的,即:若在html裏則效果像<!--註釋-->同樣,不過也有必定的區別,Smarty的註釋在瀏覽器裏查看源代碼也是不顯示的,而html的註釋是顯示的。例如:

                 

 

5.三、數組

  Smarty對數組的使用:數組[下標]、數組.下標

5.四、對象

  對象的聲明和變量同樣,經過assign來聲明

  使用採用 ->  來調用對象的屬性

  

  

   

5.五、保留變量

      Smarty中有一個特殊的變量(就是smarty)能夠經過這個變量很容易就能夠訪問到一些環境變量。就像PHP中的超全局變量同樣神奇。

      注意:在使用這個保留變量的時候:smarty是對於大小寫敏感的,咱們須要的是小寫的smarty

例子:

1、使用smarty訪問PHP中的超全局數組變量:

  一、獲取$_GET     {$smarty.get.name}    獲取get中的name值

  二、獲取$_POST    {$smarty.post.name}   獲取post中的name值

  三、獲取$_COOKIE  {$smarty.cooke.name}  獲取cookie中的name值

  同理,還能夠獲取$_SERVER$_ENV 和 $_SESSION等等

注意:雖然Smarty提供了較方便直接訪問PHP超全局變量的方法,但必須謹慎使用。 直接訪問超全局變量會弄亂應用程序底層代碼和模板語法。 最佳的實踐是從PHP將須要的變量對模板進行賦值再使用。

2、獲取當前時間戳

  {$smarty.now}其原理就是調用了timr()函數

3、直接訪問PHP常量

  {$smarty.const.常量名}即{$smarty.const.AGE}

PHP定義常量

  

smarty直接調用常量

  

結果

  

4、其餘

  獲取配置變量:{$smarty.config}

  返回當前模板名稱:{$smarty.template}

  返回當前模板對象:{$smarty.template_object}

  返回當前目錄名稱:{$smarty.current_dir}

  等等

5.六、配置文件

  以前根據需求創建的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>
複製代碼

訪問結果:

  

注意:

  一、若全局變量與被加載的段落變量有相同的變量名,則段落名的值將覆蓋全局變量的值。

  二、若某個段落變量裏含有相同的變量名,則最後一個的變量的值將會覆蓋前面的值。

  三、在整個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解析。

  解決方法:

  一、更換定界符

  二、在({)前面加一個空格,

  三、使用{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.七、判斷{if}{elseif}{else}

  Smarty的{if}條件判斷和PHP的if很是類似,只是增長了一些特性。 每一個{if}必須有一個配對的{/if}. 也可使用{else} 和 {elseif}. 所有的PHP條件表達式和函數均可以在if內使用,如||or&&andis_array(), 等等. 

注意:若是開啓了安全機制,那麼只有在$php_functions設置容許的php函數纔可以使用。

運算符表:

  

5.八、for

{for}{forelse}用於建立簡單的循環

{forelse}在循環不能遍歷的時候使用

例子:

  

  

5.九、while

  Smarty的while循環和PHP中的while循環是幾乎同樣的,smarty中須要在後面增長</while>來結束

  

  例子:

  

  

結果:

  

5.十、{section}{sectionelse}

能夠循環遍歷連續數字索引的數組,不能循環關聯數組

基本使用:

   

   

訪問結果:

  

不使用賦值數組直接輸出:

  

結果:

  

遍歷關聯數組:

  

  

結果:

  

  Section還有不少關鍵字強大的功能尚未一一列出來,具體能夠參考smarty手冊。Foreach相對於section來講顯得更增強大,能用section作到的,foreach也能作到,而且foreach使用起來更加方便簡單,接下來咱們來學習瞭解foreach。

 

5.十一、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具備一些內部關鍵字:

一、@iteration,當前循環次數,從1開始

二、@index,表示當前索引,從零開始

三、@first當前是首次循環是,first爲true

四、@last循環最後一次時,last爲true

五、@show,是在{foreach}循環執行後,,檢測循環是否有輸出,show是一個布爾值

六、@total,{foreach}的循環次數,total能夠在{foreach}內部,或者以後使用

七、{break},中止循環

八、{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.十二、自定義函數

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.1三、模板佈局

便是模板的繼承問題。使用的關鍵字主要有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='文件路徑'}

 

(以上是本身的一些看法,如有不足或者錯誤的地方請各位指出)

做者:那一葉隨風

轉載自:https://www.cnblogs.com/phpstudy2015-6/p/6216107.html

相關文章
相關標籤/搜索