色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

模板引擎smarty工作原理以及使用示例

模板引擎是用于把模板文件和數(shù)據(jù)內(nèi)容合并在一起的程序,便于網(wǎng)站開(kāi)發(fā)有利于代碼分離和維護(hù),了解一個(gè)模板最好知道其工作原理,以便于實(shí)現(xiàn)一通萬(wàn)通。

模板文件一般是HTML xml js等類型文件,如果不用模板引擎若要把數(shù)據(jù)顯示在網(wǎng)頁(yè)上,我們需要在php中輸出HTML,而使用模板則只要把數(shù)據(jù)交給模板引擎程序即可,然后告訴它用哪個(gè)模板文件,自然就會(huì)把數(shù)據(jù)和頁(yè)面結(jié)合以后返回或輸出,模板至少有以下功能1.把數(shù)據(jù)提供給模板引擎的功能。2.指定模板的功能。3.輸出結(jié)果的功能。一般來(lái)說(shuō)為了方便程序員們使用模板引擎,開(kāi)發(fā)者都會(huì)把它的功能在一定程度上封裝起來(lái),封裝成一個(gè)類,實(shí)例化之后得到一個(gè)對(duì)象,即模板引擎對(duì)象,一個(gè)對(duì)象有其屬性和方法,smarty對(duì)象的屬性和方法在smarty手冊(cè)上查找,首先說(shuō)說(shuō)其方法,assign 把數(shù)據(jù)提交給模板的方法。沒(méi)有單獨(dú)的指定模板文件的方法已經(jīng)合并到輸出的方法中,輸出的方法有兩個(gè) display 直接輸出  fetch 返回合并好的HTML代碼,對(duì)于輸出我們主要用到的是assign 因?yàn)槲覀冿@示的數(shù)據(jù)往往是多樣性的,可能是一個(gè)量,可能是一個(gè)數(shù)組量也可能是多維數(shù)組,在不同的情況下應(yīng)該如何正確提交給smarty是一個(gè)問(wèn)題,提交后如何對(duì)應(yīng)顯示也是個(gè)問(wèn)題,smarty引擎使用的解釋方法是先把HTML文件轉(zhuǎn)化為php文件,然后在賦值各個(gè)量,并且執(zhí)行這個(gè)php文件,對(duì)應(yīng)不同的數(shù)據(jù)格式,它有一套固定的書(shū)寫(xiě)方式,需要我們用這種書(shū)寫(xiě)方式在模板文件上做對(duì)應(yīng)的標(biāo)記,smarty默認(rèn)使用的模板標(biāo)記符是一對(duì){},比如{$a}這個(gè)標(biāo)記等效于echo $a;在php中我們需要有對(duì)應(yīng)的賦值過(guò)程,$smarty->assign("a","值");如果我們有多個(gè)量進(jìn)行賦值,一個(gè)個(gè)這樣寫(xiě)就很麻煩,smarty為我們考慮了這一點(diǎn),例如我們從數(shù)據(jù)庫(kù)里讀出一個(gè)文章,要顯示在頁(yè)面的內(nèi)容有標(biāo)題內(nèi)容作者時(shí)間,數(shù)據(jù)結(jié)構(gòu)大體是這樣的

復(fù)制代碼 代碼如下:
array([id]=>1,['title']=>"標(biāo)題",…);

我們的模板需要有幾個(gè)對(duì)應(yīng)的標(biāo)記,例如

復(fù)制代碼 代碼如下:
<h1>{$title}</h1>
<div>{$content}</div>

一個(gè)個(gè)賦值太麻煩,assign方法支持?jǐn)?shù)組直接賦值,$rows = 從數(shù)據(jù)庫(kù)讀出的據(jù),

$smarty->assign($rows);smarty就會(huì)取數(shù)據(jù)索引自動(dòng)一一賦值,但是這個(gè)時(shí)候?yàn)榱吮苊庖鹱兞繘_突,我們希望還是直接以數(shù)組形式賦值呢,例如

復(fù)制代碼 代碼如下:
$rows = 從數(shù)據(jù)庫(kù)讀出的據(jù),
$smarty->assign("rows",$rows);

如果此時(shí)我們?cè)谀0宓臉?biāo)記是{$rows} 那輸出的時(shí)候我們只能看到array 正如php里面直接echo數(shù)組一樣,在php輸出具體量是echo $rows['title'];smarty規(guī)定的符號(hào)是一個(gè)點(diǎn)號(hào),{$rows.title},用這種方式類似于

復(fù)制代碼 代碼如下:
echo $rows['title']

每種模板有其對(duì)應(yīng)的書(shū)寫(xiě)規(guī)則,接下來(lái)如果要顯示的是一個(gè)文章列表呢,假設(shè)mysql給我們返回了10條數(shù)據(jù),10條數(shù)據(jù)都要顯示出來(lái),而且他們的索引肯定完全相同,根據(jù)編程思路知道結(jié)果求過(guò)程,假設(shè)顯示如下

復(fù)制代碼 代碼如下:
<ul>
<li>1111</li>
<li>222</li>
<li>333</li>
<li>4444</li>
</ul>

如果這是我們希望輸出的樣子

首先這是多個(gè)量當(dāng)然用的是數(shù)組了,

復(fù)制代碼 代碼如下:
$list=array();
While($rows=數(shù)據(jù)){
$list[]=$rows;
}
$smarty->assign("list",$list);

先把數(shù)據(jù)放到一個(gè)數(shù)組中再一次性交給smarty,這樣一來(lái)list變量里面是一個(gè)二維數(shù)組,如果是我們得到一個(gè)這樣的二維數(shù)組,要把里面所有值顯示出來(lái),最好的方法是循環(huán)輸出,同樣smarty為我們提供了循環(huán)用的標(biāo)記,section和 foreach

section標(biāo)記格式

復(fù)制代碼 代碼如下:
{section name=這次循環(huán)的名字 loop=數(shù)據(jù)量名}
...
{/section}


{section name=i loop=$list}
<li>{$list[i].title}</li>
{/section}

上面的代碼看起來(lái)很像for循環(huán),但這里的i不是for循環(huán)里面的$i 只是這個(gè)循環(huán)的名字,$list[循環(huán)名]這個(gè)寫(xiě)法可以每次從數(shù)組里得到一個(gè)量,正如剛才說(shuō)的,$list是一個(gè)二維數(shù)組,$list[i]得到的還是數(shù)組。

還有一個(gè)寫(xiě)法就是foreach 其語(yǔ)法如下:

復(fù)制代碼 代碼如下:
{foreach key=索引 item=值 from=賦值變量}

{$key}:{$item}<br />

{/foreach}

{foreach  item=v from=$list}

<li>{$v.title}</li>

{/foreach}

循環(huán)list變量每個(gè)量賦值到v里,然后從變量v里面指定要顯示的索引,除了循環(huán)標(biāo)記外,它還給我們提供了一些常用的語(yǔ)法標(biāo)記,例如包含文件,條件判斷,我們知道HTML不能包含文件,比如網(wǎng)頁(yè)頭部,但smarty提供了{(lán)include}的標(biāo)記,可以像php一樣包含文件,例如{include file="文件路徑"} 這個(gè)標(biāo)記格式是固定的,而且這個(gè)路徑必須在模板引擎指定的路徑下,而條件判斷的語(yǔ)法和php一樣是if條件判斷,語(yǔ)法如下

復(fù)制代碼 代碼如下:
{if變量==值或量}
為真時(shí)顯示的值
{else}
為假是顯示的值
{/if}

也可以不寫(xiě)else只有為真時(shí)顯示的內(nèi)容,例如常見(jiàn)的一種情況是網(wǎng)頁(yè)上有一個(gè)登陸口登錄前顯示的是表單登錄后顯示的是用戶信息,假設(shè)一個(gè)量已經(jīng)賦值給模板了比如 $username 用戶登錄這個(gè)量就有用戶名沒(méi)有登錄這個(gè)量就是空的,我們可以這樣寫(xiě)

復(fù)制代碼 代碼如下:
{if $username !=""}
歡迎{$username}
{else}
請(qǐng)先登錄
{/if}

我們只要在php把這個(gè)變量準(zhǔn)備好,并賦值給smarty即可除了這些標(biāo)記外還有的標(biāo)記自行參考手冊(cè),

其次就是變量調(diào)節(jié)器了,很多時(shí)候我們從數(shù)據(jù)庫(kù)中得到的數(shù)據(jù),都要小小的處理下才輸出的,比如日期格式,只顯示年月日即可再如輸出的內(nèi)容里的換行要換成<br />才能在頁(yè)面顯示對(duì)應(yīng)的樣子,這個(gè)時(shí)候我們可以使用smarty自帶的變量調(diào)節(jié)器,格式如下

復(fù)制代碼 代碼如下:
{要輸出的變量|調(diào)節(jié)器名:參數(shù)}

假如內(nèi)容部分在顯示的時(shí)候把所有的換行顯示為<br />只需要如下寫(xiě)法

復(fù)制代碼 代碼如下:
{$content|nl2br}

日期的格式化可以用date_format 例如手冊(cè)上

復(fù)制代碼 代碼如下:
index.php:

$smarty = new Smarty;
$smarty->assign('yesterday', strtotime('-1 day'));
$smarty->display('index.tpl');

index.tpl:

{$smarty.now|date_format}
{$smarty.now|date_format:"%A, %B %e, %Y"}
{$smarty.now|date_format:"%H:%M:%S"}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:"%H:%M:%S"}

OUTPUT:

Feb 6, 2001
Tuesday, February 6, 2001
14:33:00
Feb 5, 2001
Monday, February 5, 2001
14:33:00

實(shí)在不行我們可以用php處理好之后再進(jìn)行賦值。

下面寫(xiě)上配置

復(fù)制代碼 代碼如下:
<?php
define("ROOT",str_replace('//','/',dirname(__FILE__)).'/');//定義根路徑
//加載smarty類
require ROOT.'lib/smarty.class.php';
$samrty = new smarty();//實(shí)例化一個(gè)smarty類
//配置各種目錄
$smarty ->setTemplateDir(ROOT.'templates/')
        ->setCompileDir(ROOT.'templates_c')
        ->setPluginsDir(ROOT.'plugins/')
        ->setCacheDir(ROOT.'cache/')
        ->setConfigDir(ROOT.'configs/');
$smarty->caching = false;//是否開(kāi)啟緩存
$smarty->left_delimiter = '<{';//設(shè)置左右 防止和js css 等發(fā)生沖突
$smarty->right_delimiter = '}>';
?>

php技術(shù)模板引擎smarty工作原理以及使用示例,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 建平县| 伊川县| 榆林市| 噶尔县| 平南县| 丹凤县| 保定市| 望城县| 会昌县| 瑞昌市| 安徽省| 博湖县| 金塔县| 驻马店市| 莱西市| 北票市| 恩平市| 萝北县| 五华县| 长子县| 安徽省| 巫溪县| 台北市| 江华| 宁海县| 贵港市| 惠安县| 广水市| 齐河县| 南昌县| 海安县| 土默特左旗| 甘南县| 南投县| 江山市| 来凤县| 哈巴河县| 栖霞市| 茶陵县| 成都市| 防城港市|