Smarty3.x模版引擎

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}
//去除多餘空格並用&nbsp;代替空格
{$string|strip:'&nbsp;'}

10.清楚標記
//清除 HTML 標記
{$string|strip_tags}
//false 去除多餘空格
{$string|strip_tags:false}

舉例:

建立7.php

<?php
require 'smarty.php';


$smarty->assign('string', "this is a &lt;music&gt;                <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:'&nbsp;'}
<br>
{*10清除HTML標記*}
{$string|strip_tags}

</body>
</html>

執行:http://192.168.3.62/tpl/7.php
This Is A &Lt;Music&Gt; 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 &lt;music&gt; <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.縮進
//默認縮進是空格,改爲&nbsp;產生頁面效果
{$string|indent:10:'&nbsp;'}


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.默認縮進是空格,改爲&nbsp;產生頁面效果*}
{$string|indent:10:'&nbsp;'}
<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:'&nbsp;'}

建立8.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{*多個調節器用|號隔開便可*}
{$string|truncate:10|indent:10:'&nbsp;'}

</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}

相關文章
相關標籤/搜索