PHPLIB Template入門系列 -2 開始你的第一個應用
一個 封裝很好的類對使用者(可能不是開發人員本人)來說,最大的好處就是,你無需知道類內部是怎麼運作的,只需知道如何利用它提供的介面做你想做的事情即可.所 以,本文不打算具體講述PHPLIB Template(以下簡稱Template)是如何將"元素"轉換成"值"的,你需要瞭解的是"它能這樣做",而不是"它為什麼能這樣做".
好了,下面我們就開始它的第一個應用了.
先在我們要測試的網站的目錄下建兩個檔案夾inc和template.目錄inc下放引用檔案,比如類庫,函數庫等,這裡我們就把template.inc放如該目錄下.tempate下放模板檔案,我們先建一個模板檔案first.html,內容如下
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第一個模板檔案 </TITLE>
</HEAD>
<BODY>
真想對你說:我愛你 {lover} ,但我卻不敢說,因為我知道你愛的人是 {man}.
<P>
<font color="#0000FF">{author}</font> 於 {date}
</BODY>
</HTML>
用inc,template命名檔案目錄,都是我的個人習慣,你完全可以採取不同的方式.我用副檔名為.html的名稱命名模板檔案,是為了方便美工用frontpage或者dreamweaver修改,但這完全取決於你自己的習慣.
first.html模板中的{lover},{man},{author}可以稱為"模板變數",用花括弧({})把變數名稱括住即組成一個模板變數.模板變數就是模板元素的一種。你可能會擔心它的命名問題,其實除了空格(" "),斷行符號換行("/r", "/n"),tab(/t)外它都被視為是正確的.所以
{your-lover}
也是正確的.這點有時可能會令你很痛苦,因為模板裡的有些javascript代碼可能無意間變沒有了,比如
if(a>b){document.write("i love u");}
中的
{document.write("i love u");}
也被視為一個變數了.上面的代碼在你選的模板處理方式下,可能會變成if(a>b){},從而導致javascript錯誤.為什麼會"變沒"了呢?稍後將做解釋.
上面我們定義的三個變數{lover},{man},{author}的原因是,我們想隨時改變它們的值.下面我們就來做這個工作.建立first.php檔案,內容如下:
<?php
//包含進模板類 template.inc
require "inc/template.inc";
//建立一個執行個體
$tpl = new Template("template", "keep"); //注1
//將整個檔案讀進來
$tpl->set_file("main", "first.html"); //注2
//給檔案中的模板變數賦值
$tpl->set_var("lover", "kiki"); //注3
$tpl->set_var("man", "ccterran"); //注4
$tpl->set_var("author", "iwind"); //注5
//完成替換
$tpl->parse("mains", "main"); //注6
//輸出替換的結果
$tpl->p("mains"); //注7
?>
瀏覽器中瀏覽這個檔案,你就會發現輸出
真想對你說:我愛你 kiki ,但我卻不敢說,因為我知道你愛的人是 ccterran. iwind 於 {date} |
這一切正如我們所期望的(除了{date}).注1
$tpl = new Template("template", "keep");
是建立一個Template類的執行個體對象.它有兩個參數,都是可選的.
第一個參數是模板所在目錄,如果不設定則為"."(即目前的目錄),由於我們剛才把模板檔案first.html放到template下了,所以這裡為template.注意它一般使用相對路徑,如果你用相對於根目錄(比如 /phplib/test/template)的路徑,就會出現
Template Error: set_root: /phplib/test/template is not a directory.
Halted.
的錯誤.
第二個參數是指定模板類對"未完成處理"變數的處理方式,所謂"未完成處理"指的是模板變數未賦值,塊未完成替換工作(下面一節將講到它),它有三個值可選,分別為"keep","comment","remove":
如果設為"keep",這些變數將原封不動的保留下來.
如果設為"comment",那麼會在報錯的同時,將未完成處理的變數全部轉換成HTML的注釋.
如果設為"remove",未完成處理的變數便會被刪除(這也是預設的情況).
所以在上面的例子中,我指定的是"keep",於是{date}因為未賦值,所以還保留著.而預設的情況下是"remove",所以,如果我這樣建立執行個體對象
$tpl = new Template("template", "remove");
或者
$tpl = new Template("template");
的話,輸出就變成了
真想對你說:我愛你 kiki ,但我卻不敢說,因為我知道你愛的人是 ccterran. iwind 於 |
可以看出{date}被刪除了.如果是
$tpl = new Template("template", "comment");
它的結果將是
真想對你說:我愛你 kiki ,但我卻不敢說,因為我知道你愛的人是 ccterran. iwind 於 |
看起來和"remove"方式一樣,但查看源檔案,我們會發現
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第一個模板檔案 </TITLE>
</HEAD>
<BODY>
真想對你說:我愛你 kiki ,但我卻不敢說,因為我知道你愛的人是 ccterran.
<P>
<font color="#0000FF">iwind</font> 於 <!-- Template variable date undefined -->
</BODY>
</HTML>
其中有<!-- Template variable date undefined -->的錯誤資訊,告訴我們date變數未定義(賦值).
用"comment"或許對程式的調試很有協助.
我們再回頭看看
if(a>b){document.write("i love u");}
中
{document.write("i love u");}
會"變沒"的問題,是因為模板類視之為模板變數,但你沒有給它指定值(當然會沒有),且你沒有指定"keep"方式來處理未定義變數,所以它就被"remove"了.
所以在模板使用過程中應該多多注意這些問題.
注2是將一個模板檔案載入進來,事實上你可以一次載入多個模板(在第四節將講到這個問題).你可以想象
$tpl->set_file("main", "first.html");
把"fir