Smarty概述
1.Smarty是什麼?
Smarty是一種從程序邏輯層(php)抽出外在(html/css)描述的PHP框架,這意味着php代碼只負責邏輯應用,從外在描述中分離了出來。
2.Smarty的設計理念?
(1)拋棄應用程序中php與其它語言雜揉的描述方式,使之統同樣式;
(2)php負責後臺,Smarty模版負責前端;
(3)向php致意,而不是取代它;
(4)程序員、美工可以快速開發部署;
(5)快速和易於維護;
(6)語法簡單、容易理解,沒必要具有php知識;
(7)客戶在開發中富有彈性;
(8)安全:從php獨立出來;
(9)免費,開源。
3.爲何要分離HTML和PHP?
(1)語法:模版由像 html 同樣的語義標記構成。php語法在應用程序中運行得很好,
但一旦與 html 結合則迅速惡化。Smarty簡單的{tag}語法專門爲外在描述而設計。Smarty專於模版表現而少於「代碼」,這能夠加快模版開發同時易於維護。Smarty語法無須懂得php知識,它對程序員與非程序員都是直觀的。
(2).隔離:當php與模版混合,就沒有了何種邏輯類型能夠注入到模版的限制。Smarty從php中獨立出了模版,建立了一種從業務邏輯中分離外在表現的控制。Smarty一樣具備安全特性,可以進一步增強模版的約束。
4.Smarty的工做方式
在引擎中,Smarty將模版「編譯」(基於複製和轉換)成php腳本。它只發生一次,當第一次讀取模版的時候,指針前進時調取編譯版本,Smarty幫你保管它,所以,模版設計者只須編輯 Smarty 模版,而沒必要管理編譯版本。這也使得模版很容易維護,而執行速度很是快,由於它只是php。固然,php腳本也利用了諸如APC的緩存。
5.從Smarty3.1.28開始就全面支持PHP7了。
6.學習Smarty須要有[PHP核心基礎篇][PHP核心進階篇][PHP面向對象基礎]。php
Smarty安裝與配置
一.工做流程圖
1.PHP 程序和模版互相賦值調用;
2.判斷是否有編譯文件,若是編譯文件裏沒有它們之間的編譯文件會通過Smarty引擎解析生成編譯文件;
3.若是有編譯文件,直接訪問編譯文件;
4.而後輸出編譯文件的內容;
5.在輸出時,若是開啓的緩存功能,會生成一個靜態緩存;
6.最後顯示在瀏覽器端。
7.第二次訪問時,會直接訪問編譯文件,而後輸出,而後顯示,跳過Smarty引擎編譯
8.第二次訪問時,若是緩存開啓,會直接跳過編譯文件,直接訪問緩存文件(靜態)。css
二.安裝方式
1.先建立一個目錄叫:tpl,而後把smarty文件夾總體拖入;
2.刪除demo目錄,這個是一個演示目錄,瘦身必刪;
3.建立一個測試文件1.php,鍵入如下代碼:html
<?php //引入Smarty核心類文件 require 'smarty/libs/Smarty.class.php'; //實例化Smarty $smarty = new Smarty(); //給模版賦一個值傳遞過去 $smarty->assign('name', 'Mr.Wang'); //調用模版頁面 $smarty->display('1.tpl');
此時,會報告一個錯誤:Smarty: Unable to load templates 'file:1.tpl'前端
5.在根目錄下建立一個模版文件夾templates。
6.在templates目錄下建立1.tpl文件,這個文件其實一個html文件,並鍵入如下代碼:html5
//html5模版代碼 <!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>模版調用成功</title> </head> <body> </body> </html>
7.當你刷新頁面時,頁面出現了想要的結果,並在根目錄下又自動建立了templates_c的編譯文件夾,裏面還有一個編譯文件。至此,初步的安裝就已經完畢了。
三.配置目錄
1.咱們並不喜歡Smarty默認的目錄結構名稱,咱們能夠經過字段屬性從新設置。mysql
舉例:ios
建立1.php程序員
<?php require 'smarty/libs/Smarty.class.php'; $smarty = new Smarty(); //設置模版目錄 $smarty->template_dir = 'view'; //設置編譯目錄 $smarty->compile_dir = 'compile'; //設置緩存目錄 $smarty->cache_dir = 'cache'; //設置變量目錄 $smarty->config_dir = 'config'; //是否開啓緩存 $smarty->caching = false; $smarty->assign('name', 'Mr.Wang'); $smarty->display('1.tpl');
建立1.tplweb
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>模版調用成功</title> </head> <body> {$name} </body> </html>
執行:http://192.168.3.62/tpl/1.php
Mr.Wangsql
2.能夠把smarty配置代碼放到根目錄下的smarty.php中,分離調用。
建立smarty.php
<?php require 'smarty/libs/Smarty.class.php'; $smarty = new Smarty(); $smarty->template_dir = 'view'; $smarty->compile_dir = 'compile'; $smarty->cache_dir = 'cache'; $smarty->config_dir = 'config'; $smarty->caching = false;
1.php調用smarty.php
<?php require 'smarty.php'; $smarty->assign('name', 'Mr.Wang'); $smarty->display('1.tpl');
Smarty分配變量
Smarty變量賦值的一些問題,包括普通變量、數組、對象。以及怎樣控制分配變量的可見範圍。
一.普通變量
1.通常性變量賦值。
舉例:
建立2.php
<?php //引入smarty.php require 'smarty.php'; //給模版頁賦值 $smarty->assign('name', 'Mr.Wang'); $smarty->display('2.tpl');
建立2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配變量</title> </head> <body> {*模版頁取值{$name}*} 個人名字叫:{$name} </body> </html>
訪問:http://192.168.3.62/tpl/2.php
個人名字叫:Mr.Wang
2.數組變量賦值。
舉例1:
建立2.php
<?php //引入smarty.php require 'smarty.php'; //一個數值索引數組 $array = array('王西西', '詩詩', '堯堯', '西西'); //給模版頁賦值 $smarty->assign('array', $array); $smarty->display('2.tpl');
建立2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配變量</title> </head> <body> {*能夠用中括號取值*} 你的名字:{$array[0]} {*也能夠用.符號取值*} 個人名字:{$array.1} </body> </html>
訪問:http://192.168.3.62/tpl/2.php
你的名字:王西西 個人名字:詩詩
舉例2:
建立1.php
<?php //引入smarty.php require 'smarty.php'; //一個字符串索引數組 $stringArray = array('蘋果'=>'iphoneX', '小米'=>'mix', 'meizu'=>'pro6s'); //給模版頁賦值 $smarty->assign('stringArray', $stringArray); $smarty->display('2.tpl');
建立2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配變量</title> </head> <body> {*可使用中括號,須要單引號*} 蘋果最新產品:{$stringArray['蘋果']} {*.符號中文不支持*} 魅族最新產品:{$stringArray.meizu} </body> </html>
訪問:http://192.168.3.62/tpl/2.php
蘋果最新產品:iphoneX 魅族最新產品:pro6s
3.對象賦值
建立Test.class.php
<?php //一個類 class Test { public $name = 'test'; public function run() { return 'running...'; } }
建立2.php
<?php //引入smarty.php require 'smarty.php'; require 'Test.class.php'; //實例化這個類 $test = new Test(); //給模版賦值這個對象 $smarty->assign('obj', $test); $smarty->display('2.tpl');
建立2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配變量</title> </head> <body> {*輸出字段和方法*} {$obj->name} {$obj->run()} </body> </html>
訪問:http://192.168.3.62/tpl/2.php
test running...
二.變量範圍
1.使用createData方法能夠控制是否在模版中可見變量。
建立3.php
<?php require 'smarty.php'; //建立數據對象 $data = $smarty->createData(); //在數據對象做用域下分配變量 $data->assign('name', 'Mr.Lee'); //只有把這個對象分配到模版中,才能可見變量 $smarty->display('3.tpl', $data);
建立3.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>變量範圍</title> </head> <body> 個人名字叫:{$name} </body> </html>
訪問:http://192.168.3.62/tpl/3.php
個人名字叫:Mr.Wang
2.使用createTemplate方法能夠控制在哪一個模版中可見變量。
建立4.php
<?php require 'smarty.php'; //設置要控制的模版文件 $tpl = $smarty->createTemplate('4.tpl'); //給這個模版文件分配變量 $tpl->assign('name', 'Mr.Wang'); //引入模版 $smarty->display($tpl);
建立4.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>變量範圍</title> </head> <body> 個人名字叫:{$name} </body> </html>
訪問:http://192.168.3.62/tpl/4.php
個人名字叫:Mr.Wang
Smarty保留變量
一.請求變量
1.使用{smarty.get.xxx}來獲取get請求變量。
建立5.php
<?php session_start(); require 'smarty.php'; $smarty->display('5.tpl');
建立5.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留變量</title> </head> <body> {*/?page=1則能夠獲取到*} {$smarty.get.page} </body> </html>
執行:http://192.168.3.62/tpl/5.php?page=1
1
2.使用{smarty.post.xxx}來獲取post請求變量。
建立5.php
<?php
session_start(); require 'smarty.php'; $smarty->display('5.tpl');
建立form.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="5.php" method="post"> 姓名:<input type="text" name="user"><input type="submit" value="提交"> </form> </body> </html>
建立5.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留變量</title> </head> <body> {*表單post提交則能夠獲取到*} {$smarty.post.user} </body> </html>
訪問:http://192.168.3.62/tpl/form.html點擊提交的內容會返回這個內容
3.使用{smarty.cookies.xxx}來獲取cookie請求變量。
建立5.php
<?php session_start(); require 'smarty.php'; setcookie('name', 'Mr.Wang'); $smarty->display('5.tpl');
建立5.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留變量</title> </head> <body> {*獲取一個cookie值*} {$smarty.cookies.name} </body> </html>
訪問:http://192.168.3.62/tpl/5.php
Mr.Wang
4.使用{$smarty.session.xxx}來獲取session請求變量。
建立6.php
<?php session_start(); require 'smarty.php'; $_SESSION['admin'] = '西西'; $smarty->display('6.tpl');
建立6.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留變量</title> </head> <body> {*獲取一個session值*} {$smarty.session.admin} </body> </html>
訪問:http://192.168.3.62/tpl/6.php
西西
5.使用{$smarty.env.xxx}來獲取env的環境變量。
6.使用{$smarty.server.xxx}來獲取server的環境變量
smarty還有一個request的獲取方式,是聯合了上面幾種,智能獲取。固然,因爲安全性的隱患,這種方式不推薦。
二.保留變量
1.使用{$smarty.now}來獲取當前時間戳。
//獲取當前時間戳
{$smarty.now}
2.使用{$smarty.contst.xxx}獲取常量值。
建立7.php
<?php session_start(); require 'smarty.php'; define('PI', 3.14); $smarty->display('7.tpl');
建立7.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留變量</title> </head> <body> {*獲取常量*} {$smarty.const.PI} </body> </html>
訪問:http://192.168.3.62/tpl/7.php
3.14
3.使用{$smarty.current_dir}獲取模版目錄名
//獲取當前的模版目錄名
{$smarty.current_dir}
4.使用{$smarty.version}獲取smarty版本信息。
//獲取smarty版本信息
{$smarty.version}
Smarty基本語法
Smarty基本語法的一些問題,包括註釋、變量、函數和運算等等
一.基本語法
1.Smarty註釋功能。
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <!--我是HTML註釋,可是不會在編譯中消失--> {*我是smarty註釋,編譯後會自動消失*} </body> </html>
2.忽略Smarty解析。
//讓smarty變量原樣輸出 <!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {literal} {$name} {/literal} </body> </html>
執行原樣輸出:http://192.168.3.62/tpl/6.php
{$name}
3.能夠直接使用函數。
//直接使用函數
{time()}
4.能夠作運算。
//變量作加法運算
建立6.php
<?php require 'smarty.php'; $smarty->assign('x', 5); $smarty->assign('y', 8); $smarty->display('6.tpl');
建立6.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {$x + $y} </body> </html>
執行:http://192.168.3.62/tpl/6.php
13
5.也能夠直接在模版聲明變量和輸出。
建立6.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*聲明變量*} {$name = 'Mr.Wang'} {*輸出*} {$name} {*數組也能夠在模版聲明*} {$array = array(1, 2, 3)} {*輸出*} {$array[0]} </body> </html>
執行:http://192.168.3.62/tpl/6.php
Mr.Wang1
Smarty變量調節器
一.變量調節器
1.英文單詞首字母大寫
//每一個英文單詞首字母大寫
{$string|capitalize}
//包含數字的英文字母,首字母和數字後第一個字母大寫
{$string|capitalize:true}
2.英文單詞所有大寫
//大寫
{$string|upper}
3.英文單詞所有小寫
//小寫
{$string|lower}
4.字符串鏈接
//鏈接字符串
{$string|cat:' Yes!'}
5.設置字符行寬
//設置 10 個字符換行,默認換行爲\n,若是不是 10,則默認 80
{$string|wordwrap:10}
//換行使用<br>
{$string|wordwrap:10:'<br>'}
6.設置換行
//將\n 或換行設置成<br>
{$string|nl2br}
7.將 HTML 實體轉義
//轉義字符串
{$string|escape}
8.反轉義
//反轉義字符串
{$string|unescape}
9.去除多餘空格
//去除多餘空格
{$string|strip}
//去除多餘空格並用 代替空格
{$string|strip:' '}
10.清楚標記
//清除 HTML 標記
{$string|strip_tags}
//false 去除多餘空格
{$string|strip_tags:false}
舉例:
建立7.php
<?php require 'smarty.php'; $smarty->assign('string', "this is a <music> <strong>tea2cher</strong>!"); $smarty->display('7.tpl');
建立7.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*1.每一個英文單詞首字母大寫*} {$string|capitalize} <br> {*2.英文單詞所有大寫*} {$string|upper} <br> {*3.英文單詞所有小寫*} {$string|lower} <br> {*4.鏈接字符串*} {$string|cat:' Yes!'} <br> {*5.設置10個字符換行,默認換行爲\n,若是不是10,則默認8*} {$string|wordwrap:10:'<br>'} <br> {*6.將\n 或換行設置成<br>*} {$string|nl2br} <br> {*7.將HTML實體轉義*} {$string|escape} <br> {*8.反轉義字符串*} {$string|unescape} <br> {*9.去除多餘空格*} {$string|strip:' '} <br> {*10清除HTML標記*} {$string|strip_tags} </body> </html>
執行:http://192.168.3.62/tpl/7.php
This Is A ≪Music≫ tea2cher!
THIS IS A <MUSIC> TEA2CHER!
this is a <music> tea2cher!
this is a <music> tea2cher! Yes!
this is a
<music>
tea2cher!
this is a <music> tea2cher!
this is a <music> <strong>tea2cher</strong>!
this is a tea2cher!
this is a <music> tea2cher!
this is a <music> tea2cher !
11.計算字符的數量
//獲取字符數量
{$string|count_characters}
//將空格也算進去
{$string|count_characters:true}
12.計算字符段落
//就是字符的段落數
{$string|count_paragraphs}
13.就是字符句數
//換行+結束符號算一個句子
{$string|count_sentences}
14.計算詞數
//單詞的數量
{$string|count_words}
15.格式化時間
//將時間戳格式化成日期時間
{time()|date_format}
//添加參數,更加利於理解
{time()|date_format:'Y-m-d H:i:s'}
16.默認值
//但數據爲空時,設置一個默認值
{$string|default:'沒有數據'}
17.縮進
//默認縮進是空格,改爲 產生頁面效果
{$string|indent:10:' '}
18.在字符之間插空
//在每一個字符之間插一個空格
{$string|spacify}
//在買個字符之間插入一個指定的字符
{$string|spacify:'&'}
19.格式化
//小數點保留 2 位
{'45.678'|string_format:'%.2f'}
20.截取字符串
//10 位後截取,自動添加...(含三個點共 10 位),默認 80
{$string|truncate:10}
//10 位後截取,沒有添加...
{$string|truncate:10:true}
//總體保留 10 位,頭尾保留,中間裁剪
{$string|truncate:10:'...':true:true}
建立8.php
<?php require 'smarty.php'; $smarty->assign('string', "this is a teacher!"); $smarty->display('8.tpl');
建立8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*11.獲取字符數量*} {$string|count_characters} <br> {*11.將空格也算進去*} {$string|count_characters:true} <br> {*12.就是字符的段落數*} {$string|count_paragraphs} <br> {*13.換行+結束符號算一個句子*} {$string|count_sentences} <br> {*14.單詞的數量*} {$string|count_words} <br> {*15.將時間戳格式化成日期時間*} {time()|date_format:'Y-m-d H:i:s'} <br> {*16.數據爲空時,設置一個默認值*} {$string|default:'沒有數據'} <br> {*17.默認縮進是空格,改爲 產生頁面效果*} {$string|indent:10:' '} <br> {*18.在每一個字符之間插入一個指定的字符*} {$string|spacify:'&'} <br> {*19.小數點保留2位*} {'45.678'|string_format:'%.2f'} <br> {*20.10位後截取,自動添加___(含三個_共10位),默認80*} {$string|truncate:10:'___'} <br> {*20.10位後截取,自動添加三個空格(含三個空格共10位),默認80*} {$string|truncate:10:''} <br> {*20.總體保留10位,頭尾保留,中間裁剪*} {$string|truncate:10:'...':true:true} <br> </body> </html>
執行:http://192.168.3.62/tpl/8.php
15
18
1
1
4
2018-03-01 10:14:56
this is a teacher!
this is a teacher!
t&h&i&s& &i&s& &a& &t&e&a&c&h&e&r&!
45.68
this is___
this is a
thi...er!
二.組合調節器
顧名思義,即多個調節器做用於變量。
//多個調節器用|號隔開便可
{$string|truncate:10|indent:10:' '}
建立8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*多個調節器用|號隔開便可*} {$string|truncate:10|indent:10:' '} </body> </html>
執行:http://192.168.3.62/tpl/8.php
this is...
Smarty的內置函數功能
一.內置函數
1.使用{$var=...}來建立一個變量。
//在模版中建立變量
{$name = 'Mr.Lee'}
//輸出變量
{$name}
2.使用{assign}來爲變量賦值。
//這又是一種建立變量方式
{assign var='name' value='Mr.Lee'}
//輸出
{$name}
3.使用{append}來建立數組變量。
//value 表示值,index 表示字符串索引
{append var='name' value='Mr.' index='first'}
{append var='name' value='Lee' index='last'}
//輸出
{$name.first}
4.使用{literal}來避免模版解析。
//避免模版解析
{literal}
{$name}
{/literal}
5.左右花括號轉義
//直接輸出左右花括號
{ldelim}{rdelim}
6.加載其它模版頁面
//加載一個模版頁面
{include file='hr.tpl'}
7.清除標記中的空格
//清除空格和換行
{strip}
<table>
<tr>
<td>1</td>
</tr>
</table>
{/strip}
8.加載配置文件
舉例:
建立配置文件web.conf
webname='淘寶' keywords='購物_低價' [base] name='Miss.Wang';
建立1.php
<?php require 'smarty.php'; $smarty->assign('string', "this is a teacher!"); $smarty->display('1.tpl');
建立1.tpl配置文件全局變量加載方式
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*加載配置文件*} {config_load file='web.conf'} {*輸出配置文件全局變量*} {#webname#},{#keywords#} </body> </html>
打印輸出:http://192.168.3.62/tpl/1.php
淘寶,購物_低價
建立1.tpl節點塊全局變量輸出方式
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*加載節點塊*} {config_load file='web.conf' section='base'} {*輸出節點塊全局變量*} {#name#} </body> </html>
打印輸出:http://192.168.3.62/tpl/1.php
Miss.Wang
9.在模版中使用if條件語句
//簡單的if語句
{if $name=='Mr.Lee'}
找到此人
{/if}
//else
{if $name=='Mr.Lee'}
找到此人
{else}
找不到此人
{/if}
注意:除了簡單的if語句也能夠加入elseif和else。只不過複雜的邏輯判斷,不太推薦在模版端進行了
10.使用while循環語句
//表達式和if同樣
{while $num < 10}
{$num++}
{/while}
11.使用for循環語句
//for 循環
{for $i = 1 to 10}
{$i}
{/for}
12.使用foreach遍歷
//數組賦值
$smarty->assign('array', array('red', 'green', 'blue'));
//簡單的遍歷數組
{foreach $array as $value}
{$value}
{/foreach}
//打印出索引值
{foreach $array as $key=>$value}
{$key}->{$value}
{/foreach}
//關聯數組
$smarty->assign('array',
array('btx'=>'red', 'opd'=>'green', 'wya'=>'blue'));
//另外一種索引值獲取方式,Smarty3 新語法
{foreach $array as $value}
{$value@key}
{/foreach}
//獲取從0開始的索引,即便是關聯數組,也會獲取數值索引
{foreach $array as $value}
{$value@index}
{/foreach}
//獲取從 1 開始的迭代值,不是索引
{foreach $array as $value}
{$value@iteration}
{/foreach}
//獲取第一個元素
{foreach $array as $value}
{if $value@first}
{$value}
{/if}
{/foreach}
//獲取最後一個元素
{foreach $array as $value}
{if $value@last}
{$value}
{/if}
{/foreach}
//判斷數組是否有輸出
{foreach $array as $value}
{$value}
{/foreach}
//能夠在外部
{$value@show}
//獲取數組元素總數
{foreach $array as $value}
{$value}
{/foreach}
//遍歷內部或外部都可
{$value@total}
//終止迭代
{foreach $array as $value}
{if $value == 'green'}
{break}
{/if}
{$value}
{/foreach}
//終止當前迭代
{foreach $array as $value}
{if $value == 'green'}
{continue}
{/if}
{$value}
{/foreach}
//若是沒有數據的狀況下
{foreach $array as $value}
{$value}
{foreachelse}
沒有數據
{/foreach}
13.使用section來遍歷數組
{foreach}能夠作{section}能作的全部事,並且語法更簡單、更容易。它一般是循環數組的首選。
{section}循環不能遍歷關聯數組,(被循環的)數組必須是數字索引,像這樣(0,1,2,...)。對於關聯數組,請用{foreach}循環。
終上所述:推薦使用foreach,而section的一些foreach沒有的功能其實都應該在PHP程序下編寫而不是在模版中。
1.簡單的遍歷
//索引數組,關聯數組沒法獲取
$smarty->assign('array', array('red', 'green', 'blue'));
//遍歷
{section loop=$array name=value}
{$array[value]}
{/section}
2.未分配變量的遍歷
//輸出 10,12,14,16,18
{section start=10 loop=20 step=2 name=value}
{$smarty.section.value.index}
{/section}
Smarty的自定義函數功能
一.自定義函數
1.計數函數
//默認從1開始,每次累加1
{counter}
{counter}
{counter}
{counter}
{counter}
//設置開始數字,步長和遞增遞減,從中間設置或屢次設置也能夠
{counter start=3 skip=2 direction=up}
//設置不輸出
{counter print=false}
//設置爲變量值輸出
{counter assign=a}
{$a}
2.交替使用一組值
//經過複製多行一下單元格,能夠交替三種背景,實現斑馬效果
<td style="background:{cycle values='#eee,#ccc,#fff'}">1</td>
<td style="background:{cycle}">1</td>
<td style="background:{cycle}">1</td>
<td style="background:{cycle}">1</td>
//重置交替
{cycle reset=true}
//values 改變分割符號
{cycle delimiter='|' values='#eee|#ccc|#fff'}
//是否讓當前這條不交替到下一個值
{cycle advance=false}
剩下的一些屬性:print、assign等常規屬性,再也不演示。
3.變量的另外一種函數形式
//模版變量
{eval var=$name}
//配置文件變量,可使用assign分配一個新變量名
{eval var=#webname# assign=c}
4.引入其餘文件的源代碼
//引入其餘源代碼,可使用assign賦值給變量
{fetch file='http://www.baidu.com'}
5.電子郵件生成
//使用電子郵件功能
{mailto address='bnbbs@163.com'}
//郵件鏈接的文字和郵件的主題設置
{mailto address='bnbbs@163.com' text="個人郵箱" subject="一封家書"}
6.計算功能
//最終獲得0
{math equation='x+y' x=20 y=30}
//數值格式化
{math equation='x+y' x=20 y=30 format='%.2f'}
注意:{math}函數性能較低,不推薦使用。還有一個{textformat}文字格式化,好比縮進換行之類的,也沒什麼用,都是 CSS 控制。
7.開啓調試模式
//開啓
{debug}
二.自定義函數
1.使用{html_checkboxes}建立複選框。
舉例:
建立8.php
<?php require 'smarty.php'; //先建立一個數組 //先建立一個數組 $smarty->assign('array', array( '測試1'=>'東東', '測試2'=>'南南', '測試3'=>'西西', '測試4'=>'北北' )); //設置首選值,先設置一個首選變量 $smarty->assign('id', '測試2'); $smarty->display('8.tpl');
建立8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*模版載入數組,options屬性能夠將索引做爲value值做爲做爲text*} {html_checkboxes options=$array} {*若是設置value和text均爲數組的元素值,或者兩個數組分別設置*} {html_checkboxes values=$array output=$array} {*name屬性能夠設置name名稱*} {html_checkboxes options=$array name="user"} {*模版設置首選項*} {html_checkboxes options=$array selected=$id} {*去除默認的label*} {html_checkboxes options=$array labels=false} {*添加分隔符,好比<br>換行*} {html_checkboxes options=$array labels=false separator='<br>'} </body> </html>
2.使用{html_radios}建立單選框。
//模版處,其它屬性和複選框一致
{html_radios options=$array checked=$id}
3.使用{html_options}建立select下拉列表選項。
//option的列表,還包含name、values、output這幾個屬性
<select>
{html_options options=$array selected=$id}
</select>
//實現optgroup羣組下拉
舉例:建立8.php
<?php require 'smarty.php'; $smarty->assign('id', '測試4'); $smarty->assign('array2', array( 'a'=>array( '測試1'=>'111', '測試2'=>'222', '測試3'=>'333', ), 'b'=>array( '測試4'=>'444', '測試5'=>'555', '測試6'=>'666' ) )); $smarty->display('8.tpl');
建立8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <select> {html_options options=$array2 selected=$id} </select> </body> </html>
4.使用{html_select_date}建立日期
//經過屬性設置,調整時間
{html_select_date month_format='%m' start_year='1999'
end_year='2016' field_order='YMD'}
5.使用{html_select_time}建立時間
{html_select_time}
Smarty的緩存功能
一.頁面緩存
1.先使用數據庫加載一組數據。
//PDO 數據庫鏈接 $pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456'); //設置字符集 $pdo->query('SET NAMES UTF8'); //獲得準備對象 $stmt = $pdo->prepare("SELECT * FROM one"); //執行SQL語句 $stmt->execute(); //初始化 $object = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $object[] = $rows; } $smarty->assign('object', $object); $smarty->display('8.tpl');
輸出顯示8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>使用緩存</title> </head> <body> {*輸出顯示*} <table border="1"> <tr> <th>姓名</th> <th>數學</th> <th>語文</th> <th>外語</th> </tr> {foreach from=$object item=obj} <tr> <td>{$obj->user}</td> <td>{$obj->math}</td> <td>{$obj->chinese}</td> <td>{$obj->english}</td> </tr> {/foreach} </table> </body> </html>
暴露問題:這張數據表,可能很長時間不會有所改動,好比一天,一週,一個月都不會改動。可是,用戶每次訪問,都要通過數據庫,形成性能上的極大浪費。這時,咱們想經過緩存技術,將第一次生成的頁面靜態化,而後之後就訪問這個靜態頁面,從而避免執行數據庫操做。
2.開啓緩存
第一步:在配置文件smarty.php裏開啓緩存設置
<?php require 'smarty/libs/Smarty.class.php'; $smarty = new Smarty(); $smarty->template_dir = 'view'; $smarty->compile_dir = 'compile'; //緩存目錄 $smarty->cache_dir = 'cache'; $smarty->config_dir = 'config'; //開始緩存true $smarty->caching = true; //創建緩存週期 $smarty->cache_lifetime = 3600; $smarty->left_delimiter = '{'; $smarty->right_delimiter = '}';
刷新頁面後,會自動生成cache目錄。並生成了一個靜態頁面,下次訪問是會訪問這個靜態頁面。不會由於數據庫數據改變,而發生變化。可是,這個地方仍是有問題的,雖然訪問的是靜態頁面。但並無說,不執行PHP鏈接數據庫,執行數據庫這個步驟,因此,咱們還須要進行靜態頁面的判斷工做。
3.判斷緩存
第二步:if判斷8.tpl緩存是否存在
<?php require 'smarty.php'; //判斷緩存存在的話,就不執行PHP的數據庫連接和操做 if (!$smarty->isCached('8.tpl')) { //PDO 數據庫鏈接 $pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456'); //設置字符集 $pdo->query('SET NAMES UTF8'); //獲得準備對象 $stmt = $pdo->prepare("SELECT * FROM one"); //執行SQL語句 $stmt->execute(); //初始化 $object = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $object[] = $rows; } $smarty->assign('object', $object); }
$smarty->display('8.tpl');
先判斷緩存是否存在,而後再執行PHP代碼(包括執行數據庫鏈接和執行)。若是存在緩存,就直接忽略PHP代碼部分,直接讀取緩存,這樣避免數據庫執行浪費。
二.局部不緩存1.使用{nocache}...{/nocache}讓局部不緩存。{nocache}{$smarty.now|date_format:"Y-m-d H:i:s"}{/nocache}2.若是不緩存的內容自己是標籤,能夠在標籤後直接加上nocache便可。{$smarty.now|date_format:"Y-m-d H:i:s" nocache}