// from: http://www.4kiki.net/php_lib_template/
PHPlib Template 模板類中文文檔 第一版 2004-10-16
iwind譯 (2004-10-24更新)
第十章. 模板(Template)
目錄
-
模板類執行個體變數
-
模板類執行個體方法
-
-
可調用的執行個體方法
-
內部執行個體方法
-
模板類應用舉例
備忘: 如果你認為它像FastTemplates,那你要認真閱讀了,其實它不是.
該模板類允許你在一些外部檔案中保留HTML代碼,這些檔案完全不包含PHP代碼,只含有用以替換的欄位(譯註:就是下文中所說的變數的"引用")。這個類就提供了一些可以讓你用任意的字串填入欲替換欄位的函數。
備忘: 該文檔的版本不再維護,請參閱template.inc 源檔案中的注釋部分,以獲得最可靠的文檔.
模板類執行個體變數
可調用的執行個體變數
| classname |
字串(String).類序列協助:類名稱. |
| debug |
整型(Integer). 標識:設為1可觀察所有變數賦值情況,設為2可觀察可調用變數,設為4可觀察內建函式調用. |
| unknowns |
為"keep","comment", "remove" (預設)三者之一.決定了在輸出環節上如何處理模板中未完成處理的變數名稱.如果設為"keep",這些變數名稱將原封不動的保留下來.如果設為"comment",那麼會在報錯的同時,將未完成處理的變數名 稱全部轉換成HTML的注釋.如果設為"remove",未完成處理的變數名稱便會被悄然刪除(這也是預設的情況). |
| halt_on_error = "yes" |
為"yes"(預設), "report", "no"三者之一. 決定了模板類錯誤處理方式.如設為"yes"(預設),錯誤就會被報告,程式執行也隨之中斷. 如果設為"report",錯誤同樣會被報告,只是程式繼續執行,並返回"false".如果設為"no",錯誤就被屏蔽掉,程式執行結果返回"false" |
| last_error = "" |
最近的一次錯誤資訊儲存在這個變數裡面. |
內部執行個體變數
| file |
字串散列.一個轉換表,可以把變數名轉換成與之相對應的檔案名稱. |
| root |
字串 (路徑名). 模板檔案被載入的主目錄. |
| varkeys |
字串散列.一個轉換表,可以把變數名轉換成與之相對應的Regex. |
| varvals |
字串散列.一個轉換表,可以把變數名轉換成它們各自的varkey對應的替代值. |
模板類執行個體方法
可調用執行個體方法
Template($root = ".", $unknowns = "remove")
建構函式.可以有兩個可選的參數.第一歌參數設定模板所在目錄,第二個參數設定未知變數的處理方式.
set_root($root)
該函數檢查$root是否為一個有效目錄,然後把這個模板存放所在目錄設為矚目路.
set_unknowns($unknowns = "remove")
該函數設定未處理的變數名稱的處理方式.必須是"remove","comment"或"keep"三者中的一個. 如果設為"keep",這些變數名稱將原封不動的保留下來.如果設為"comment",那麼會在報錯的同時,將未完成處理的變數名稱全部轉換成HTML的注釋.如果設為"remove",未完成處理的變數名稱便會被悄悄的刪除(這是預設的情況).
set_file($varname, $filename = "")
該函數為一個函數的初值定義一個檔案名稱,可以用一個$varname/$filename對或者一系列的$varname/$filename對來調用它.這些檔案只有在需要時才會被載入.
set_block($parent, $varname, $name = "")
變數$parent可包含一個以$varname命名的變數塊.該函數會從$parent中把這個塊刪除,然後用一個名稱為$name的變數代替它.如果$name被忽略了,那麼它將被假定為和$varname一樣
set_var($varname, $value = "")
該函數設定一個變數的初值.可以用一個$varname/$value對或者一系列的$varname/$value對來調用它.
subst($varname)
該函數返回一個名為$varname的變數的值,所有以定義變數的值都已經填入.結果字串並不是最終結果,而是未完全處理變數的處理還沒有應用前的結果.
psubst($varname)
這個是print $this->subst($varname)的簡寫形式.
parse($target, $varname, $append = false)
該函數替代以$varname為名中的所有已定義變數的值,並儲存或附加在以$target為變數名的結果中.
如果$varname為變數名數組,$append就會被屏蔽.以$varname為名的變數被連續的替代,每一個替代步驟的結果都存在$target裡.最終的替代結果
可在以$target為名的變數裡獲得,可以視為下一個$varname的一個中間處理環節.
pparse($target, $varname, $append = false)
這個是print $this->parse(...). 的簡寫形式
get_vars()
返回所有以定義值的序列,每個值都以其名字為鍵.
query_id()
返回以$varname命名的變數的值.如果$varname對應著一個檔案,而且檔案尚未載入,就會報告變數為空白.當用變數名稱數組調用時,會返回一個值的序列,以它們的名字為鍵.
get_undefined($varname)
該函數以$varname,名稱未鍵的方式,返回一系列未處理變數名稱(即一個含$a[$name]=$name的序列).
finish($str)
該函數將返回$str的最終版本,即針對未完全處理的處理方式將應用到$str上來.
p($varname)
該函數將輸出以$varname命名的變數的最後版本的值.
get($varname)
該函數將得到以$varname命名的變數的最後版本的值.
haltmsg($msg)
該函數可以在你的模板子類中被覆寫.它可以輸出用來調用的資訊.
內部執行個體方法
filename($filename)
當用一個相對路徑調用時,函數返回一個路徑名,附帶從$this->root中提取的合適的目錄名.如果是絕對路徑,則不加變化即被使用.
結果檔案名必須是存在的,否則就會長生一個錯誤.
varname($varname)
該函數根據所給的變數名稱構造一個變數名稱運算式(譯註:即 var -> {var}).
loadfile($varname)
如果一個變數未定義或者為空白,並且對應一個檔案,對應著的這個檔案就會被載入,檔案內容將被賦為該變數的值.
halt($msg)
無論何時發生了一個錯誤,這個函數都將被喚起,並根據 $this->halt_on_error定義的方式處理這個錯誤.
模板類應用執行個體
該模板類管理一些變數的集合,都為文本字串.這些字串可能以 {變數}的形式包含其他變數的引用.當分析或替換時,一個變數的引用就會被那個變數的值所替代.例如,如果你這樣
<?php
$t = new Template;
$t->set_var("a", "defined as hugo");
$t->set_var("b", "the value of a is {a}");
print $t->subst("b")
?>
將輸出"the value of a is defined as hugo".
一個變數的值可以以手工調用set_var('名稱", "值");的方式定義,或者可能調用set_file("名稱","filename.ihtml");從一個檔案中定義.在後一種情況中,當需要時(儘可能晚)檔案內容就被載入,並被設定為變數的值.
第三種定義變數值的方式是調用set_block("parent", "block", "name");.這種情況下,以"parent"為名的變數被當作以<!-- BEGIN block -->為開始,以<!-- END block -->為結束的塊被尋找.字串從變數"parent"中被刪除,賦給以"block"為名的變數.在"parent"裡的"name"對應的變數引用被替代了.如果可選項"name"
留空,"block"將被用於替代.
例如,如果這樣寫
<?php
$t = new Template;
$t->set_var("a", "front matter
<!-- BEGIN b -->
this is block b
<!-- END b -->
end matter");
$t->set_block("a", "b", "bb");
?>
會把變數"a"定義為"front matter {bb} end matter",變數"b"則作為一個塊.這一切使得當你在下例中設定內部變數debug為7時,跟蹤變數訪問情況變得更加清晰.
直接使用模板類或者如有需要的話,定義一個模板類的子類.
象下面一樣定義一個名為page.ihtml的模板檔案.
<html>
<head><title>{PAGETITLE}</title></head>
<body bgcolor="#ffffff">
<table border=1 cellpadding=4 cellspacing=0 bgcolor="#eeeeee">
<tr>
<td colspan=2><h1>{PAGETITLE}</h1></td>
</tr>
<tr>
<td>{OUT}</td>
<td>Content<br>{UNDEFINED_VARIABLE}</td>
</tr>
</table>
</body>
</html>
這個檔案包含一個對應變數PAGETITLET的引用和一個以OUT命名的引用.另外一個以UNDEFINED_VARIABLE為名的變數的引用不作解析.另外一個模板檔案,命名為box.ihtml,包含一個名為row的塊,含有三個變數引用. {TITLE}, {NUM} 和{BIGNUM}:
<!-- start box.ihtml -->
<table border=1 bgcolor="#cccccc" cellpadding=4 cellspacing=0>
<tr>
<td colspan=2><b>{TITLE}</b></td>
</tr>
<!-- BEGIN row -->
<tr>
<td>{NUM}</td>
<td>{BIGNUM}
</tr>
<!-- END row -->
</table>
<!-- end box.ihtml -->
下面的php檔案示範如何使用這些模板:
<?php
/* 引入模板類 */
include("template.inc");
/* 用需要的參數產生模板類的一個執行個體對象 */
$t = new Template("/home/kris/www/test.koehntopp.de/pages/template", "keep");
/* $t->debug = 7; */ /* 啟用全部調試 */
/* 從檔案中定義兩個變數 */
$t->set_file(array(
"page" => "page.ihtml",
"box" => "box.ihtml"));
/* 定義包含在另一個變數裡面的變數 */
$t->set_block("box", "row", "rows");
/* 手動定義兩個變數 */
$t->set_var(array("TITLE" => "Testseite",
"PAGETITLE" => "hugo"));
for ($i=1; $i<=3; $i++) {
$n = $i;
$nn = $i*10;
/* 給NUM和BIGNUM賦值 */
$t->set_var(array("NUM" => $n, "BIGNUM" => $nn));
/* 替換row中的NUM和BIGNUM
* 把結果附加到rows */
$t->parse("rows", "row", true);
}
/* 替換box裡的所有變數,
結果儲存在OUT裡面 */
$t->parse("OUT", array("box", "page"));
/* 列印OUT*/
$t->p("OUT");
?>
<hr>
輸出未定義變數:
<?php
print @implode(", ", $t->get_undefined("OUT"));
?>