每個進(jìn)行過較大型的 php-web 應(yīng)用程序設(shè)計的開發(fā)人員大概都有如下的經(jīng)歷:花大量的時間寫超文本語句,為頁面排版,兼作美工等;或在整合的程序代碼在和html靜態(tài)頁面時花費大量的時間。的確,用腳本語言開發(fā) web 應(yīng)用不容易將數(shù)據(jù)的處理和數(shù)據(jù)的顯示分開,但在多人合作的情況下,如果無法將數(shù)據(jù)和顯示分開,將大大影響開發(fā)的效率,專業(yè)分工的發(fā)揮。為了解決這個問題,php 也提供了自己的解決方案,有多種,本文主要介紹 phplib 中的 template 類。
一、模板處理類的設(shè)計
模板處理類主要需完成以下的任務(wù):
歸納上述任務(wù),模板類的設(shè)計目標(biāo)為:從多個模板文件中讀入顯示的html代碼,將這些顯示代碼中需要動態(tài)數(shù)據(jù)的地方替換為php程序運算所得出的數(shù)據(jù),然后按照一定的順序輸出。其中,替換的部分可以自由的設(shè)定。
讀取顯示用的html代碼采用讀文件的方式
模板文件和數(shù)據(jù)的結(jié)合采用正則替換
處理多個模板用數(shù)組存儲來實現(xiàn)。
模板的嵌套的實現(xiàn)主要的想法是:將模板和輸出(任何中間的分析結(jié)果)一視同仁,都可拿來做替換,即可實現(xiàn)。
單獨部分的處理的通過在模板文件中設(shè)定標(biāo)注,然后在正則替換中結(jié)合標(biāo)注來控制,實現(xiàn)部分替換。
二、模板處理類的實現(xiàn)
請參看 phplib 中的 template.inc,總共 345 行代碼,有詳細(xì)的注釋。以下列舉一些主要的函數(shù),供研讀參考:
1) function set_file($handle,$filename=” ”) line 77, 讀取文件
2) function set_var($varname, $value = "") line 119, 設(shè)置映射數(shù)據(jù)-替換變量
3) function set_block($parent, $handle, $name = "") line 96, 設(shè)置標(biāo)注
4) function subst($handle) line 136, 執(zhí)行數(shù)據(jù)替換
5) function parse($target, $handle, $append = false) line 165, 執(zhí)行模板文件與數(shù)據(jù)的結(jié)合
6) function p($varname) line 268, 輸出處理結(jié)果
注:本人下載的php-lib7.2c的template.inc文件中的第95行少了個“/”,加上后使用正常。
三、模板處理類的使用
3.1 最基本的例子
為了簡單起見,這里假設(shè)模板文件、使用模板的php文件和模板處理類的文件都放在同一個目錄下。phplib中的習(xí)慣是使用ihtml后綴為模板文件的后綴。
下面是要使用的模板文件:
<html>
<head>
<title>使用模板的測試</title>
</head>
<body>
<h2>這是一個使用模板的測試文件!</h2>
當(dāng)前的時間是{currenttime}!
</body>
</html>
注:模板文件和通常的 html 文件差不多,唯一不同的是使用“{}”括起來的是可以被模板處理類替換的動態(tài)內(nèi)容的變量。
接下來使用模板處理類來處理上面的模板:
<?
//引入template類
include("template.inc");
//得到需要替換的數(shù)據(jù)
$timenow=date("y-m-d h:i:s",time());
//實例化一個template類
$template= new template();
//載入test.ihtml模板
$template->set_file("handle1","test.ihtml");
//使用$timenow的值替換模板中的currenttime
$template->set_var("currenttime",$timenow);
//進(jìn)行實際的模板操作
$template->parse("output","handle1");
//輸出最后結(jié)果
$template->p("output");
?>
<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</td>
</tr>
</table>
</body>
</html>
模板文件2,box.ihtml
<!-- 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 -->
模板處理文件,test.php
<?php
//引入template類
include("template.inc");
#實例化一個template類,名字叫$t
$t = new template();
# 建立包含模板文件的數(shù)組
$t->set_file(array(
"page" => "page.ihtml",
"box" => "box.ihtml"));
# 載入模板文件box中的一個塊row,引用名稱為rows
$t->set_block("box", "row", "rows");
# 設(shè)置替換
$t->set_var(array("title" => "testpage",
"pagetitle" => "hugo"));
# 生成數(shù)據(jù)num,bignum
for ($i=1; $i<=3; $i++) {
$n = $i;
$nn = $i*10;
#設(shè)置替換
$t->set_var(array("num" => $n, "bignum" => $nn));
#進(jìn)行分析,分析的結(jié)果添加到rows的后面
$t->parse("rows", "row", true);
}
# 生成box,再生成page
$t->parse("out", array("box", "page"));
# 輸出最后結(jié)果
$t->p("out");
?>
新聞熱點
疑難解答