|
使用PHP 模板類進(jìn)行編程很有好處,但是有時(shí)也會(huì)碰到一個(gè)問(wèn)題,比如說(shuō)輸出一個(gè)表格,但是表格行數(shù)要到運(yùn)行的時(shí)候才知道,如留言板、BBS、購(gòu)物網(wǎng)站之類,經(jīng)常會(huì)碰到這個(gè)問(wèn)題。這時(shí)做美工的人無(wú)法決定在HTML文件中用幾行表格,如果在PHP代碼文件中寫循環(huán)輸出,又會(huì)讓美工、PHP程序員看代碼都不方便,美工的人會(huì)說(shuō),這里的表格哪里去了?我要修改表格的顏色背景之類怎么辦?PHP程序員也會(huì)說(shuō),怎么這里突然有一個(gè)<tr>、<td>,做什么用?會(huì)嵌在HTML文件哪里?。 使用PHP模板類編程一般把這種不確定個(gè)數(shù)的HTML 元素當(dāng)成一個(gè)“ block ”,對(duì) bolck 的編程類似于在代碼中寫一個(gè)循環(huán)。在比較常用的PHP模板類(如 FastTemplate 和 PHPLib )都有這種功能。寫嵌套的block 類似于寫多重循環(huán),F(xiàn)在舉例說(shuō)明在 PHP4 里面的 IntegratedTemplateExtension 類中block 的編程方法,例子中用的是兩重循環(huán),外層block 是GoodsList,里層block 是GoodsListOfSomeType 。 基本設(shè)置:假設(shè)我們寫的代碼放在C:\TestPHP\PHP4\GoodsList.htm 和 C:\TestPHP\HTML\GoodsList.php 中。將C:\TestPHP\PHP4 在Web Server 上設(shè)成虛擬目錄 /testphp 并且給與腳本執(zhí)行權(quán)限,確認(rèn)C:\TestPHP\HTML\GoodsList.htm 無(wú)法通過(guò)遠(yuǎn)端瀏覽器訪問(wèn)。假定PHP4安裝在C:\php4,在 php.ini 里面設(shè)置 include_path = ".;C:\php4\pear"
以下是GoodsList.htm的內(nèi)容:
<html> <head> <title>購(gòu)物袋里的商品清單</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style type="text/css"> <!-- body,p,br,td,tr,table { font-size: 9pt} --> </style> </head> <body bgcolor="#FFFFFF" text="#000000"> <table width="700" border="0" cellspacing="0" cellpadding="0" height="90"> <tr> <td colspan="5"> </td> </tr> <tr> <td colspan="5"> <div align="center">{UserName},您的購(gòu)物袋里有以下商品:</div> </td> </tr> <tr> <td colspan="5"> <hr> </td> </tr> <tr> <td width="52"> </td> <td width="302">商品種類</td> <td width="302">商品名稱</td> <td width="299">商品價(jià)格</td> <td width="47"> </td> </tr> <!-- BEGIN GoodsList --> <!-- 說(shuō)明: block 商品列表開始 --> <tr bgcolor="#99CCFF"> <td width="52"> </td> <td width="302"><font color="#CC0066">{Type}</font></td> <td width="302"> </td> <td width="299"> </td> <td width="47"> </td> </tr> <!-- BEGIN GoodsListOfSomeType --> <!-- 說(shuō)明: block 某一類商品列表開始 --> <tr> <td width="52"> </td> <td width="302"> </td> <td width="302">{GoodsName}</td> <td width="299">{Price}</td> <td width="47"> </td> </tr> <!-- END GoodsListOfSomeType --> <!-- 說(shuō)明: block 某一類商品列表結(jié)束 --> <!-- END GoodsList --> <!-- 說(shuō)明: block 商品列表結(jié)束 --> <tr> <td colspan="5"> </td> </tr> <p> </p> </body> </html>
以下是PHP4代碼文件 GoodsList.php
<?php require_once "HTML/ITX.php"; // 以下是給變量賦值,在實(shí)際代碼中可能從Database中取得數(shù)據(jù)然后賦值 $UserName = "皮皮魯"; $GoodsTypeArray = array("家電", "書籍"); $GoodsNameArray = array(array("三星顯示器", "Sony單放機(jī)","長(zhǎng)虹彩電"), array("C++ 編程思想", "Java 2 高級(jí)開發(fā)指南", "Visual Basic 5 高級(jí)開發(fā)指南", "Flash 4 快閃勁爆網(wǎng)頁(yè)", "設(shè)計(jì)模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)" )); $GoodsPriceArray = array(array(1024, 302, 1024), array(35, 62, 76, 66.5, 55 )); //一般來(lái)說(shuō)這種全局變量放在單獨(dú)的一個(gè)文件中,便于維護(hù) $HTML_CODE_FILE_ROOT = "../HTML/"; $tpl = new IntegratedTemplateExtension($HTML_CODE_FILE_ROOT); //指定要替換 tag 的 HTML 文件 $tpl->loadTemplatefile("GoodsList.htm"); $tpl->setVariable("UserName",$UserName); //用戶名稱 //指定外層 block 名稱 $tpl->setCurrentBlock("GoodsList"); 我喜歡在循環(huán)前將循環(huán)次數(shù)單獨(dú)賦值
$GoodsTypeCount = count($GoodsTypeArray); //對(duì)外層block 進(jìn)行循環(huán) for ($i = 0 ; $i < $GoodsTypeCount ; $i++) { $tpl->setVariable("Type",$GoodsTypeArray[$i]); //貨物種類 //指定里層block 名稱 $tpl->setCurrentBlock("GoodsListOfSomeType"); $GoodsNameArrayCount = count( $GoodsNameArray[$i] ); //對(duì)里層block 進(jìn)行循環(huán) for($j = 0; $j < $GoodsNameArrayCount; $j++ ) { //替換HTML 文件中的 tag $tpl->setVariable(array ("GoodsName" =>$GoodsNameArray[$i][$j], "Price" => $GoodsPriceArray[$i][$j])); $tpl->parseCurrentBlock(); //這里也可以寫 $tpl->parse("GoodsListOfSomeType"); } $tpl->parse("GoodsList"); //結(jié)束外層 block } //輸出替換后的 HTML $tpl->show(); ?>
|