在PHP程序裡,我們常常會把"公用代碼"或"公用部分"寫進一個文件裡,前者象我們的系統配置文件,比如config.php,或者公共函數都寫入一個functions.php文件裡;後者象一個站點都需要用到的頁面頭部,尾部.這樣做的好處是可以很方便的維護站點,而如果這個公用部分要有所改動,無需再去改每一個頁面,大大減少了我們的工作量. PHPLIB Template入門系列 - 4 模板嵌套
【樓 主】
在PHP程序裡,我們常常會把"公用代碼"或"公用部分"寫進一個文件裡,前者象我們的系統配置文件,比如config.php,或者公共函數都寫入一個functions.php文件裡;後者象一個站點都需要用到的頁面頭部,尾部.這樣做的好處是可以很方便的維護站點,而如果這個公用部分要有所改動,無需再去改每一個頁面,大大減少了我們的工作量.
以前你或許用require,include(require_once,include_once)引進一個公用的頁面頭部,確實方便而有效,現在我們用Template模板類也可以實現了,並且可以很方便的把一個頁面隨意插入另一個模板的任意地方.如果你想也把要插進的頁面做成含有變量的模板的話,那麼你會發現模板類會把這個工作處理的很好.
在template目錄下新建三個文件third.html,header.html,footer.html.內容分為如下
third.html
<!-- 這是頁面頭部 -->
<BODY>
下面是一個列表
<UL>
<!-- BEGIN list -->
<li> 的成績是
<!-- END list -->
</UL>
<!-- 這是頁面腳部 -->
</BODY>
</HTML>
header.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
footer.html
<P>author © iwind
你也看到了,我們前幾節的例子中都是用
$tpl->set_file("main", "模板文件名");
來加載模板文件的。只所以命名為"main",是因為我們想給它一個意義:主模板。這裡的third.html就可以稱之為“主模板”,而欲嵌入主模板third.html的變量所在位置的模板文件header.html,則可以稱為"子模板".同樣footer.html也是一個"子模板",我們想把它放到主模板裡的位置.一個主模板內可以隨意嵌入不限內容,尺寸大小,格式等的任何多個子模板.
下面我們開始我們的PHP程序.
先是創建一個類的實例對象
//包含進模板類 template.inc
require "inc/template.inc";
//創建一個實例
$tpl = new Template("template");
//讀進三個模板文件的內容,分別給變量"main", "my_header", "my_footer"
$tpl->set_file("main", "third.html");
$tpl->set_file("my_header", "header.html");
$tpl->set_file("my_footer", "footer.html");
//執行my_header,my_footer裡的模板變量替換,並把最終結果分別賦給主模板中的header,footer
$tpl->parse("header", "my_header");
$tpl->parse("footer", "my_footer");
//然後完成主模板內變量的替換,並輸出主模板分析後的內容
$tpl->parse("mains", "main");
//輸出
$tpl->p("mains");
於是,我們便可以通過查看源文件確信header.html,footer.html兩個子模板文件的內容已經被加進主模板裡了.
<!-- 這是頁面頭部 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
<BODY>
下面是一個列表
<UL>
<!-- BEGIN list -->
<li> 的成績是
<!-- END list -->
</UL>
<!-- 這是頁面腳部 -->
<P>author © iwind
</BODY>
</HTML>
你會發現,所有的變量都沒了,包括我們未賦值的,,.這是因為我們在創建對象時,第二個參數未設置,而自動采用了"remove"
$tpl = new Template("template");
和
$tpl = new Template("template", "remove");
的效果是一樣的.
如果我們想給這些變量也賦值,那麼方法和單個模板裡變量的分析方法是一樣的.
//讀模板內容進變量
$tpl->set_file("main", "third.html");
$tpl->set_file("my_header", "header.html");
$tpl->set_file("my_footer", "footer.html");
//設置子模板header.html裡的變量title的值
$tpl->set_var("title", "這個是網頁標題");
//以下分析主模板裡的塊的內容
//設置塊
$tpl->set_block("main", "list", "lists");
$array = array("張三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);
foreach ($array as $username=>$score)
{
$tpl->set_var("username", $username);
$tpl->set_var("score", $score);
$tpl->parse("lists", "list", true);
}
所有程序為
<?php
//包含進模板類 template.inc
require "inc/template.inc";
//創建一個實例
$tpl = new Template("template");
//將整個文件讀進來
$tpl->set_file("main", "third.html");
$tpl->set_file("my_header", "header.html");
$tpl->set_file("my_footer", "footer.html");
//設置header.html裡的變量title的值
$tpl->set_var("title", "這個是網頁標題");
//設置塊
$tpl->set_block("main", "list", "lists");
$array = array("張三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);
foreach ($array as $username=>$score)
{
$tpl->set_var("username", $username);
$tpl->set_var("score", $score);
$tpl->parse("lists", "list", true);
}
//執行my_header,my_footer裡的模板變量替換,並把最終結果分別賦給主模板中的header,footer
$tpl->parse("header", "my_header");
$tpl->parse("footer", "my_footer");
//完成主模板內變量的替換
$tpl->parse("mains", "main");
//輸出
$tpl->p("mains");
?>
輸出的結果為
<!-- 這是頁面頭部 -->
<!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>
<!-- 這是頁面腳部 -->
<P>author © iwind
</BODY>
</HTML>
一切都是我們所期望的.
在這個程序裡,我們用
$tpl->set_block("main", "list", "lists");
加載一個塊.其實它的第一個參數為該塊所在父變量,如果這個塊在header.html裡,那麼恐怕要這樣寫了
$tpl->set_block("my_header", "list", "lists");
但分析方法還是一樣的.
從以往和這節中的例子,我們可以看出來,定義一個模板變量值的方法是用
$tpl->set_var("var_name", "var_value");
但把一個變量的值給另一個變量就需要用parse.
$tpl->parse("target_name", "from_name", true);
或者
$tpl->parse("target_name", "from_name", false);
使用parse就先執行from_name大變量的模板變量的替換,然後再把所得結果賦給target_name.
一個變量無論在模板的何處(塊裡面,子模板裡),定義的方法都是一樣的.
子模板裡還可以嵌入新的子模板,稱之為"多重嵌套",分析的方法都是一樣的,只是一般用不到.塊也可以多重嵌套,而且非常有用,使得模板可以設計的可以很清晰,這就是我們下一節的內容了.