PHPLIB Template入門系列 - 3 塊的應用 - -
在上一節中,我們知道模板元素的一種:模板變數,並知道如何在程式中給它賦值,使之呈現我們想要的東西.這對一般的簡單網頁來說,或許就已經夠用了.現在我們設想一稍微複雜的一種情況,在template目錄下建立一個second.html模板檔案,內容為:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二個模板檔案 </TITLE>
</HEAD> <BODY>
下面是一個列表
<UL>
<li>張三 的成績是 82
<li>李四 的成績是 90
<li>王兒 的成績是 60
<li>麻子 的成績是 77
</UL>
</BODY>
</HTML>
上面的列表中列出了"張三","李四","王二","麻子"四人的成績.假設要用PHP代碼嵌入HTML的方式輸出的話,你可能是這樣寫的:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二個模板檔案 </TITLE>
</HEAD>
<BODY>
下面是一個列表
<?php
$result = mysql_query("SELECT username,score FROM my_tbl");
?>
<UL>
<?php
while ($row = mysql_fetch_array($result))
{
?>
<li><?=$row["username"]?> 的成績是 <?=$row["score"]?>
<?php
}
?>
</UL>
</BODY>
</HTML>
這樣寫很適合PHP新手,但你很快發現你或者美工改這個列表樣式的時候需要多麼的小心翼翼,特別是美工,如果他不懂你寫得PHP代碼,那麼他會終日生在恐懼之中!因為稍微的不小心,可能就會帶來程式的運行錯誤.而且如果他想把這個列表從一個地方移到另一個地方,也是相當不容易的.於是作為程式員的你不得不把美工(雖然你做的可能性更大)修飾過的頁面重新審查一次,無形中就造成費時費力。
現在好了,有了Template模板類,你可以把你的代碼從模板中抽取出來了.你可能會這樣修改second.html模板:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二個模板檔案 </TITLE>
</HEAD>
<BODY>
下面是一個列表
<UL>
<li>{username1} 的成績是 {score1}
<li>{username2} 的成績是 {score2}
<li>{username3} 的成績是 {score3}
<li>{username4} 的成績是 {score4}
</UL>
</BODY>
</HTML>
顯然,你採取了一個良好的命名方式,用1,2,3..來表示每一行資料,然後你在你的程式裡迴圈給這些變數賦值,也是不難的,比如:(second.php)
<?php
//包含進模板類 template.inc
require "inc/template.inc";
//建立一個執行個體
$tpl = new Template("template");
//將整個檔案讀進來
$tpl->set_file("main", "first.html");
//串連資料庫,選擇資料庫略
省略.....
//查詢結果
$result = mysql_query("SELECT username,score FROM my_tbl");
//給檔案中的模板變數賦值
$i=0;
while ($row = $idb->fetch_array($result))
{
$i++;
$tpl->set_var("username" . $i, $row["username"]);
$tpl->set_var("score" . $i, $row["score"]);
}
//完成替換
$tpl->parse("mains", "main");
//輸出
$tpl->pparse("mains", "main");
?>
這樣你也能得到正確結果.在特殊情況下你或許需要這樣做.但Template提供了一個更方便的"大的模板變數",那就是塊.我之所以稱之為"大的模板變數",是因為它也可以視為可以包含其他模板變數的變數.形式如
<UL>
<!-- BEGIN list -->
<li>{username} 的成績是 {score}
<!-- END list -->
</UL>
即用<!-- BEGIN 塊名稱 -->和<!-- END 塊名稱 -->定義了一個名為list的塊,(注意:我在這裡為了方便理解,只稱之為塊名稱).這個塊裡面又包含一些HTML代碼(<li>等等)以及模板變數({username},{score}).
在講述如何用塊輸出資料行表之前,我們先談一下塊的定義格式.
首先<!-- BEGIN list -->和<!-- END list --> 都要各自為一行,亦即下面的塊的定義是錯誤的
1,
同行的 <!-- BEGIN list -->
<li>{username} 的成績是 {score}
<!-- END list -->
2,
<!-- BEGIN list -->
<li>{username} 的成績是 {score}
<!-- END list --> 同行的
<!--和-->都是固定的,也就是說只能是兩個中劃線("-"),且它們與BEGIN list之間都至少有一個空(空格或tab),看下面的例子
<!--BEGIN list -->
<!-- BEGIN list-->
它們都是錯誤的塊的定義方法,因為第一個<!--與BEGIN之間至少應該有一個空,第二個-->與list之間至少有一個空.
BEGIN/END和list之間也應該有一個空格,注意是有且僅有一個空格,不能多也不能少.
塊的名稱建議你只使用字元,數字,底線以及它們的組合.
BEGIN和END兩個詞語都應該是大寫的。
好了,下面開始探討如何是這個塊變成一個列表.我們可以這樣
<?php
//包含進模板類 template.inc
require "inc/template.inc";
//建立一個執行個體
$tpl = new Template("template");
//將整個檔案讀進來
$tpl->set_file("main", "second.html");
//載入塊list
$tpl->set_block("main", "list", "lists");
//串連資料庫,選擇資料庫略
省略.....
//查詢結果
$result = mysql_query("SELECT username,score FROM my_tbl");
//給檔案中的模板變數賦值
while ($row = $idb->fetch_array($result))
{
$tpl->set_var("username", $row["username"]);
$tpl->set_var("score", $row["score"]);
$tpl->parse("lists", "list", true);
}
//完成替換
$tpl->parse("mains", "main");
//輸出
$tpl->pparse("mains", "main");
?>
記住把你的資料庫連接寫在我省略的部分,就可以列印正確的結果,一如
下面是一個列表
* 張三 的成績是 82
* 李四 的成績是 90
* 王兒 的成績是 60
* 麻子 的成績是 77
可以看到在PHP代碼裡有兩個東西
$tpl->set_block("main", "list", "lists"); //代碼1
$tpl->parse("lists", "list", true);
就不可思議的將整個塊迴圈輸出了.代碼1用來載入模板main中的塊list,並給其一個名字lists,list就是模板中的一個大變數,它的內容就是<li>{username} 的成績是 {score}即:
"list" = "<li>{username} 的成績是 {score}"
之所以用lists命名,是為了程式的可讀性,也就是說我很容易就知道XXXs是XXX塊的名稱.
使用set_block後,模板中的塊內容
<!-- BEGIN list -->
<li>{username} 的成績是 {score}
<!-- END list -->
就被lists代替了.於是我們的模板就變成了
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二個模板檔案 </TITLE>
</HEAD>
<BODY>
下面是一個列表
<UL>
{lists}
</UL>
</BODY>
</HTML>
塊變成了一個變數(lists)!下面只要將lists變數替換成我們想要的就行了.
代碼二所處的迴圈
while ($row = $idb->fetch_array($result))
{
$tpl->set_var("username", $row["username"]);
$tpl->set_var("score", $row["score"]);
$tpl->parse("lists", "list", true); //代碼2
}
每一次迴圈,兩個set_var分別給username,score賦值,然後"list"就變成了
"list" = "<li>具體的名字 的成績是 具體的分數"
代碼2就是將list分析後的內容賦給lists,這樣就完成了整個塊的分析.
parse第三個參數可以設定list中的值是直接存在lists裡面,還是附加在原有值之後.我們這裡設定為true,說明是附加在原有值之後,才得以每個list的值都會顯示出來.反之設為false的話,後面的值會覆蓋掉以前的值.最終的結果會是
下面是一個列表
* 麻子 的成績是 77
綜上所述,Template模板類的替換方式是:
1,用set_block將模板中的list塊(或者你命名的其他塊)替換成變數lists.
2,用set_var給list塊中的變數賦值
3,把賦值並執行替換後的list內容依次給lists
4,完成分析
-