5. Smarty基本語法

注釋

{* 注釋內容 *}

輸出

比如,現在php文件中有一個數組,并且用assign方法賦值給了一個模板文件test.tpl

$arr=array('title'=>'smarty的學習', 'author'=>'小明')
$smarty->assign('arr', $arr);```
然后我們在模板中輸出:

{$arr.title} // 方法一
{$arr['title']} // 方法二```

變量調節器

變量調節器,寫在變量后面,用豎線|隔開。

1 - 首字母大寫 capitalize
示例:{$articleTitle|capitalize}
php文件:

$smarty->assign('articletitle', 'i ate an apple');
$smarty->display('test.tpl');```
tpl文件:```{$articletitle|capitalize}```
輸出:```I Ate An Apple```

**2 - 字符串連接 cat**
示例:```{$articleTitle|cat:"yesterday."}```
php文件:

$smarty->assign('articletitle', 'i ate an apple ');
$smarty->assign('yesterday', 'yesterday');
$smarty->assign('point', '.');
$smarty->display('test.tpl');tpl文件:{$articletitle|cat:"yesterday.":"point"}```
輸出:i ate an apple yesterday.

3 - 日期格式化 date_format
示例:{$yesterday|date_format}
{$yesterday|date_format:" :"}
php文件:

$smarty->assign('time', time());  //time()為php內置函數,用于獲取unix格式的時間
$smarty->display('test.tpl');```
tpl文件:```{$time|date_format}```
輸出:`Feb 07, 2017`
or
tpl文件:```{$time|date_format:"%B %e, %Y %H:%M:%S"}```
輸出:`Feb 07, 2017 08:05:08  //注意:時間不對是因為沒有設置時區,當前時間為格林威治時間`

**4 - 為未賦值或為空的變量指定默認值default**
示例:```{$articleTitle|default:"no title"}```
php文件:

$smarty->assign('articletitle', ' ');
$smarty->display('test.tpl');tpl文件:{$articletitle|default:"no title"}```
輸出:no title

5 - 轉碼 escape
用于html轉碼,url轉碼,在沒有轉碼的變量上轉換單引號,十六進制轉碼,十六進制美化,或者js轉碼。more為html轉碼。
php文件:

$smarty->assign('url', 'www.chuying-he.com');
$smarty->display('test.tpl');```
tpl文件:```{$url|escape:"url"}  //escape:后面跟著的是轉碼方式```
輸出:`www.chuying-he.com`

**6 - 小寫 lower 大寫 upper**
將變量字符串小 / 大寫
示例:
```{$articletitle|lower}```
```{$articletitle|upper}```
php文件:

$smarty->assign('articletitle', 'Happy New Year');
$smarty->display('test.tpl');```
tpl文件:

{$articletitle|lower}
<br/>
{$articletitle|upper}```
輸出:

happy new year
HAPPY NEW YEAR


**7 - 將所有換行符替換成<br/> nl2br**
將所有換行符替換成<br/>,與PHP中的nl2br()函數一樣
示例:```{$articletitle|nl2br}```
php文件:

$smarty->assign('articletitle', 'Happy
New
Year');
$smarty->display('test.tpl');```
tpl文件:

{$articletitle|nl2br}```
輸出:

Happy
New
Year


**8 - 其他函數**
可參見手冊,但原則上應該通過php或者CSS直接處理完畢,在賦值到Smarty中,盡量少用Smarty函數


##Smarty的條件判斷語句
Smarty中,```eq```表示```==```,```neq```表示```!=```,```gt```表示```>```,```lt```表示```<```,

{if isset($name) && $name == 'Blog'}
{* do something }
{elseif $name == $foo}
{
do something *}
{/if}


##Smarty的循環語句
**第一種循環 section**
```{section}```, ```{sectionelse}``` 是Smarty的內置函數,詳細文檔點擊[這里](http://www.smarty.net/docs/zh_CN/language.function.section.tpl)。
php文件:

$articlelist=array(
array(
"title" => "My first article",
"author" => "Alex",
"content" => "I'm a web developer."
),
array(
"title" => "Work Note",
"author" => "John Doe",
"content" => "Where is my home?"
)
)
$smarty->assign("articlelist", $articlelist);
$smarty->display("test.tpl");

tpl文件:

{section name=article loop=$articlelist}
{$articlelist[article].title}
{$articlelist[article].author}
{$articlelist[article].content}
<br />
{/section}

輸出:

My first article Alex I'm a web developer.
Work Note John Doe Where is my home?```

第二種循環 foreach
{foreach} {foreachelse}用于循環數組,語法上比{section}更加簡單清晰,并且可以使用非數字下標。

php文件:同上
tpl文件:

{foreach item=article from=$articlelist}
      {$article.title}
      {$article.author}
      {$article.content}
<br/>
{foreachelse}
NOTHING IN ARRAY
{/foreach}

輸出:同上
注意:{foreachelse}后面的內容會在當前數組中沒有內容時顯示

Smarty的文件引用

在PHP中,有兩種引入方式:includerequire。在Smarty中只有include這一種。把別的模板引入進來。

語法:{include file='page_header.tpl' sitename="sugar"}
解釋:file為要導入的模板名,sitename中的值會傳遞到page_header.tpl里面去,要注意的是,sitename這個值 能且只能page_header.tpl里面使用。假如page_header.tpl中有同名變量,該變量值會被sitename的值替代

Smarty類和對象的賦值與使用

assign除了能賦值一個變量 or 數組,還能把一個類的對象以變量的形式賦值到smarty的模板當中去。
php文件:

class My_Object{
    function methl($params){
        return $params[0].' is already '.$params[1];
    }
}

$myobj=new My_Object;
$smarty->assign('myobj',$myobj);  // 將對象$myobj傳入test.tpl模板的名為'myobj'的對象中
$smarty->display('test.tpl');

tpl文件:

{$myobj->meth1(array('cake','done'))}  // 這里的$myobj是從php文件中傳入的對象,該對象可使用類中的methl方法

輸出:
cake is already done

Smarty函數的使用

盡管Smarty中有大量的變量調節器,也還是有用戶希望使用其他方法,比如:
1. 使用php內置函數

使用php內置函數

php文件:

$smarty->assign('time', time());
$smarty->display('test.tpl');

tpl文件:

// date()為php的內置函數
// 第一次嘗試:{$time|date("Y-m-d")};  
// ---- 注意:該寫法被解釋成:date這個函數有兩個參數,第一個參數為$time,第二個參數為"Y-m-d" ----
// 而php的date方法應該是第一個參數為日期格式,第二個參數為unix時間戳,所以我們要變換順序如下:

{"Y-m-d"|date($time)};  

輸出:

2017-02-08```

**2. 使用自定義函數,并使用 ```registerPlugin``` 注冊到smarty模板里面使用**
![使用 ```registerPlugin``` ](http://upload-images.jianshu.io/upload_images/2662224-27e613ab79acb6fe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**注意**:```registerPlugin```的第一個參數除了function,還有modifier,block等,下面在smarty的插件制作中會詳細講到
php文件:

function test($params){
$p1=$params['p1'];
$p2=$params['p2'];
return 'the first para is '.p1.', the second para is '.p2;
}
// 第一個參數表示被注冊程序的類型(plugin/modifier/block),第二個參數表示注冊到smarty中后函數的名字,第三個參數表示要傳入的參數名。
$smarty->registerPlugin('function', 'f_test', 'test');
$smarty->display('test.tpl');

tpl文件:

{f_test p1='abc' p2='edf'}; // {函數名 第一個參數 第二個參數} 即,將兩個參數傳送到函數f_test中

輸出:
```the first para is abc, the second para is edf```


**3. 自定義插件**
在第一和第二種方法中,我們發現,在最終的模板調用函數的時候,方法不同,格式也不同,這是非常不友好的書寫方式,為了解決該問題,我們需要一樣新的東西:smarty插件。

*-------- 什么是插件 --------*
插件是遵循原來的系統主體接口的編寫規范,編寫出來的程序,它能夠調用主系統的數據和函數庫。他的好處是可執行力強,可重復利用率高,本身的增刪改不影響主系統的結構。
Smarty中也提供了這種插件機制,能夠在不改變smarty主程序的前提下,增加更多豐富的功能。 Smarty的本質其實是function函數,它的書寫方式完全遵照php的函數語法。

*-------- Smarty插件類型 --------*
 - functions 函數插件
 - modifiers 修飾插件
 - block functions 區塊函數插件

*-------- 插件制作方法 --------*
1. 使用```registerPlugin```方法注冊寫好的自定義函數(即方法2)
2. 將寫好的插件放入Smarty解壓目錄的lib下的plugins目錄中
3. php內置函數,可以作為修飾插件(變量調節器插件)的形式在模板中使用

*-------- 在```wamp/www/smarty/smarty/plugins```目錄中,可以看到許多php文件 --------*
 - 以```function```開頭類似```function.counter.php```為函數插件
 - 以```modifier```開頭類似```modifier.capitalize.php```為修飾插件
 - 以```block```開頭類似```block.textformat.php```為區塊函數插件
注意:命名規則為```插件類型.插件名.php```

*--------  functions 函數插件舉例 --------*

// 名為 function.test1.php 的函數插件
<?php
// 命名規則: smarty_function_插件名(要和文件中的插件名一樣)
function smarty_function_test1($params){
$width = $params['width'];
$height = $param['height'];
$area = $width * $height;
return $area;
}
?>```

// test.php文件
$smarty->display('area.tpl');
// area.tpl 模板文件
//smarty對該語句的處理是:調用test函數,然后將兩個參數放在一個數組里面傳遞到test函數中array('width'=>150, 'height'=>200)
{test1 width=150 height=200}

-------- modifier 函數插件舉例 --------

// 名為modifier.test2.php的modifier插件
<?php
    // 命名規則: smarty_modifier_插件名(要和文件中的插件名一樣)
    // 該modifier定義兩個參數,第一個為unic時間戳,第二個為時間形式
    function smarty_modifier_test2($utime, $format){    
        return date($format, $utime);
    }
?>```

// test.php文件
$smarty->assign('time',time());
$smarty->display('datetime.tpl');```

// datetime.tpl 模板文件
{$time|test2:'Y-m-d H:i:s'}```

*--------  block 函數插件舉例 --------*

// 名為block.test3.php的block插件
<?php
function smarty_block_test3($params, $content){
$replace=$params['replace'];
$maxnum=$params['maxnum'];
if($replace=='true'){
$content=str_replace(',', ',', $content); // 將中文的逗號替換成英文的逗號
$content=str_replace('。','.', $content); // 將中文的句號替換成英文的句號
}

    $content=substr($content, 0, $maxnum);
    return $content;
}

?>```

// test.php文件
$smarty->assign('str','Hello, my name is HanMeiMei。What is your name?');
$smarty->display('content.tpl');```

// content.tpl 模板文件
{test3 replace='true' maxnum=29}
{$str}
{/test3}```

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容