模板引擎是用於把模板文件和數據內容合並在一起的程序,便於網站開發有利於代碼分離和維護,了解一個模板最好知道其工作原理,以便於實現一通萬通。
模板文件一般是HTML xml js等類型文件,如果不用模板引擎若要把數據顯示在網頁上,我們需要在php中輸出HTML,而使用模板則只要把數據交給模板引擎程序即可,然後告訴它用哪個模板文件,自然就會把數據和頁面結合以後返回或輸出,模板至少有以下功能1.把數據提供給模板引擎的功能。2.指定模板的功能。3.輸出結果的功能。一般來說為了方便程序員們使用模板引擎,開發者都會把它的功能在一定程度上封裝起來,封裝成一個類,實例化之後得到一個對象,即模板引擎對象,一個對象有其屬性和方法,smarty對象的屬性和方法在smarty手冊上查找,首先說說其方法,assign 把數據提交給模板的方法。沒有單獨的指定模板文件的方法已經合並到輸出的方法中,輸出的方法有兩個 display 直接輸出 fetch 返回合並好的HTML代碼,對於輸出我們主要用到的是assign 因為我們顯示的數據往往是多樣性的,可能是一個量,可能是一個數組量也可能是多維數組,在不同的情況下應該如何正確提交給smarty是一個問題,提交後如何對應顯示也是個問題,smarty引擎使用的解釋方法是先把HTML文件轉化為php文件,然後在賦值各個量,並且執行這個php文件,對應不同的數據格式,它有一套固定的書寫方式,需要我們用這種書寫方式在模板文件上做對應的標記,smarty默認使用的模板標記符是一對{},比如{$a}這個標記等效於echo $a;在php中我們需要有對應的賦值過程,$smarty->assign("a","值");如果我們有多個量進行賦值,一個個這樣寫就很麻煩,smarty為我們考慮了這一點,例如我們從數據庫裡讀出一個文章,要顯示在頁面的內容有標題內容作者時間,數據結構大體是這樣的
array([id]=>1,['title']=>"標題",…);
我們的模板需要有幾個對應的標記,例如
<h1>{$title}</h1>
<div>{$content}</div>
一個個賦值太麻煩,assign方法支持數組直接賦值,$rows = 從數據庫讀出的據,
$smarty->assign($rows);smarty就會取數據索引自動一一賦值,但是這個時候為了避免引起變量沖突,我們希望還是直接以數組形式賦值呢,例如
$rows = 從數據庫讀出的據,
$smarty->assign("rows",$rows);
如果此時我們在模板的標記是{$rows} 那輸出的時候我們只能看到array 正如php裡面直接echo數組一樣,在php輸出具體量是echo $rows['title'];smarty規定的符號是一個點號,{$rows.title},用這種方式類似於
echo $rows['title']
每種模板有其對應的書寫規則,接下來如果要顯示的是一個文章列表呢,假設mysql給我們返回了10條數據,10條數據都要顯示出來,而且他們的索引肯定完全相同,根據編程思路知道結果求過程,假設顯示如下
<ul> <li>1111</li> <li>222</li> <li>333</li> <li>4444</li> </ul>
如果這是我們希望輸出的樣子
首先這是多個量當然用的是數組了,
$list=array(); While($rows=數據){ $list[]=$rows; } $smarty->assign("list",$list);
先把數據放到一個數組中再一次性交給smarty,這樣一來list變量裡面是一個二維數組,如果是我們得到一個這樣的二維數組,要把裡面所有值顯示出來,最好的方法是循環輸出,同樣smarty為我們提供了循環用的標記,section和 foreach
section標記格式
{section name=這次循環的名字 loop=數據量名}
{/section}
{section name=i loop=$list}
<li>{$list[i].title}</li>
{/section}
上面的代碼看起來很像for循環,但這裡的i不是for循環裡面的$i 只是這個循環的名字,$list[循環名]這個寫法可以每次從數組裡得到一個量,正如剛才說的,$list是一個二維數組,$list[i]得到的還是數組。
還有一個寫法就是foreach 其語法如下:
{foreach key=索引 item=值 from=賦值變量}
{$key}:{$item}<br />
{/foreach}
{foreach item=v from=$list}
<li>{$v.title}</li>
{/foreach}
循環list變量每個量賦值到v裡,然後從變量v裡面指定要顯示的索引,除了循環標記外,它還給我們提供了一些常用的語法標記,例如包含文件,條件判斷,我們知道HTML不能包含文件,比如網頁頭部,但smarty提供了{include}的標記,可以像php一樣包含文件,例如{include file="文件路徑"} 這個標記格式是固定的,而且這個路徑必須在模板引擎指定的路徑下,而條件判斷的語法和php一樣是if條件判斷,語法如下
{if變量==值或量}
為真時顯示的值
{else}
為假是顯示的值
{/if}
也可以不寫else只有為真時顯示的內容,例如常見的一種情況是網頁上有一個登陸口登錄前顯示的是表單登錄後顯示的是用戶信息,假設一個量已經賦值給模板了比如 $username 用戶登錄這個量就有用戶名沒有登錄這個量就是空的,我們可以這樣寫
{if $username !=""}
歡迎{$username}
{else}
請先登錄
{/if}
我們只要在php把這個變量准備好,並賦值給smarty即可除了這些標記外還有的標記自行參考手冊,
其次就是變量調節器了,很多時候我們從數據庫中得到的數據,都要小小的處理下才輸出的,比如日期格式,只顯示年月日即可再如輸出的內容裡的換行要換成<br />才能在頁面顯示對應的樣子,這個時候我們可以使用smarty自帶的變量調節器,格式如下
{要輸出的變量|調節器名:參數}
假如內容部分在顯示的時候把所有的換行顯示為<br />只需要如下寫法
{$content|nl2br}
日期的格式化可以用date_format 例如手冊上
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
實在不行我們可以用php處理好之後再進行賦值。
下面寫上配置
<?php define("ROOT",str_replace('\\','/',dirname(__FILE__)).'/');//定義根路徑 //加載smarty類 require ROOT.'lib/smarty.class.php'; $samrty = new smarty();//實例化一個smarty類 //配置各種目錄 $smarty ->setTemplateDir(ROOT.'templates/') ->setCompileDir(ROOT.'templates_c') ->setPluginsDir(ROOT.'plugins/') ->setCacheDir(ROOT.'cache/') ->setConfigDir(ROOT.'configs/'); $smarty->caching = false;//是否開啟緩存 $smarty->left_delimiter = '<{';//設置左右 防止和js css 等發生沖突 $smarty->right_delimiter = '}>'; ?>