用PHP製作靜態網站的模板框架

来源:互联网 发布:软件群发 编辑:程序博客网 时间:2024/04/29 23:37
模板能夠改善網站的結構。本文闡述如何通過PHP 4的一個新功能和模板類,在由大量靜態HTML頁面構成的網站中巧妙地運用模板控制頁面佈局。

提綱:

===================================

分離功能和佈局


避免頁面元素重復


靜態網站的模板框架

===================================

分離功能和佈局

   首先我們來看看應用模板的兩個主要目的:

分離功能(PHP)和佈局(HTML)

避免頁面元素重復

   第一個目的是談論得最多的目的,它設想的情形是:一組程式師編寫用於生成頁面內容的PHP腳本,同時另一組設計人員設計HTML和圖形以控制頁面的最終外觀。分離功能和佈局的基本思想就是使得這兩組人能夠各自編寫和使用獨立的一組文件:程式師只需關心那些只包含PHP代碼的文件,無需關心頁面的外觀;而頁面設計人員可以用自己最熟悉的視覺化編輯器設計頁面佈局,無需擔心破壞任何嵌入到頁面的PHP代碼。

   如果你曾經看過幾個關於PHP模板的教程,那麼你應該已經明白模板的工作機制。考慮一個簡單的頁面局部:頁面的上方是頁頭,左邊是導航條,其餘部分是內容區域。這種網站可以擁有如下模板文件:


<!-- main.htm -->
<html>
<head><title>模板示例</title></head>
<body>
<table><tr><td>{HEADER}</td></tr>
<tr><td>{LEFTNAV}</td><td>{CONTENT}</td></tr>
</table>
</body></html>

<!-- header.htm -->
<img src="sitelogo.jpg">

<!-- leftnav.htm -->
<br><a href="foo">Foo</a>
<br><a href="bar">Bar</a>

   可以看出頁面如何由這些模板構造而成:main模板控制著整個頁面的佈局;header模板和leftnav模板控制著頁面的公共元素。花括弧"{}"裏面的識別字是內容占位元符。使用模板最主要的好處在於介面設計者能夠按照自己的意願編輯這些文件,比如設置字體、修改顏色和圖形,或者完全地改變頁面的佈局。介面設計者可以用任何普通HTML編輯器或者視覺化工具編輯這些頁面,因為這些文件都只包含HTML代碼,沒有任何PHP代碼。

PHP代碼全部保存到單獨的文件中,這個文件也就是由頁面URL實際調用的文件。Web伺服器通過PHP引擎解析該文件,然後把結果返回給瀏覽器。一般地,PHP代碼總是動態地生成頁面內容,比如查詢資料庫或者執行某種計算等。下面是一個例子:
<?php

// example.php
require('class.FastTemplate.php');
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav' => 'leftnav.htm' ) );

// 此處的PHP代碼設置$content使其包含合適的頁面內容

$tpl->assign('CONTENT', $content);
$tpl->parse('HEADER', 'header');
$tpl->parse('LEFTNAV', 'leftnav');
$tpl->parse('MAIN', 'main');
$tpl->FastPrint('MAIN');

?>


   這裏我們使用的是流行的FastTemplate模板類,但其基本思路對於其他許多模板類來說都一樣。首先你實例化一個類,告訴它到哪里去尋找模板文件以及哪一個模板文件與頁面的哪部分對應;接下來是生成頁面內容,把結果賦予內容的識別字;然後,依次解析各個模板文件,模板類將執行必要的替換操作;最後把解析結果輸出到瀏覽器。

   這個文件完全由PHP代碼構成,不包含任何HTML代碼,這是它最大的優點。現在,PHP程式師可以集中精力編寫生成頁面內容的代碼,而不必為了如何生成HTML去正確地格式化最終頁面而擔心。

   你可以使用這種方法和上面的文件構造出一個完整的網站。如果PHP代碼是以URL中的查詢字串為基礎生成頁面內容,例如http://www.foo.com/example.php?article=099,你可以據此構造出一個完整的雜誌網站。

   很容易看出採用模板還有第二個好處。如上例所示,頁面左邊的導航條單獨保存為一個文件,我們只需編輯這一個模板文件就可以改變網站所有頁面左邊的導航條。

避免頁面元素重復
   "這確實不錯",你也許會想,"我的網站主要就是由大量的靜態頁面構成。現在我可以從所有頁面中刪除它們的公共部分,要更新這些公共部分實在太麻煩了。以後我就可以用模板製作出很容易維護的統一頁面佈局。"但事情並非這麼簡單,"大量的靜態頁面"道出了問題的所在。

   請考慮上面的例子。這個例子實際上只有一個example.php頁面,它之所以能夠生成整個網站的所有頁面,是因為它利用了URL中的查詢字串從資料庫之類的資訊源動態地構造出頁面。

   我們之中的大多數人所運行的網站並不一定都有資料庫支援。我們的網站大多數由靜態頁面構成,然後用PHP在這裏、那裏加上一些動態功能,比如搜索引擎、反饋表單等。那麼,如何在這種網站上應用模板呢?

   最簡單的方法是為每一個頁面複製一份PHP文件,然後在每一個頁面中把PHP代碼裏代表內容的變數設置成合適的頁面內容。例如,假設有三個頁面,它們分別是主頁(home)、關於(about)和產品(product),我們可以用三個文件分別生成它們。這三個文件的內容都類如:


<?php

// home.php
require('class.FastTemplate.php');
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav' => 'leftnav.htm' ) );

$content = "<p>歡迎訪問</p>
<img src=/"demo.jpg/">
<p>希望你能夠喜歡本網站</p>"
;
$tpl->assign('CONTENT', $content);
$tpl->parse('HEADER', 'header');
$tpl->parse('LEFTNAV', 'leftnav');
$tpl->parse('MAIN', 'main');
$tpl->FastPrint('MAIN');

?>


   顯然,這種方法有三個問題:我們必須為每一個頁面複製這些複雜的、牽涉到模板的PHP代碼,這與重復公共頁面元素一樣使得頁面難以維護;現在文件又混合了HTML和PHP代碼;為內容變數賦值將變得非常困難,因為我們必須處理好大量的特殊字元。

   解決這個問題的關鍵就在於分離PHP代碼和HTML內容,雖然我們不能從文件中刪除所有的HTML內容,但可以移出絕大多數PHP代碼。

靜態網站的模板框架

   首先,我們象前面一樣為所有的頁面公用元素以及頁面整體佈局編寫模板文件;然後從所有的頁面刪除公共部分,只留下頁面內容;接下來再在每個頁面中加上三行PHP代碼,如下所示:


<?php

<!-- home.php -->
<?
php require('prepend.php'); ?>
<?php pageStart('Home'); ?>

<h1>你好</h1>
<p>歡迎訪問</p>
<img src="demo.jpg">
<p>希望你能夠喜歡本網站</p>

<?php pageFinish(); ?>

?>


   這種方法基本上解決了前面提到的各種問題。現在文件裏只有三行PHP代碼,而且沒有任何一行代碼直接涉及到模板,因此要改動這些代碼的可能性極小。此外,由於HTML內容位於PHP標記之外,所以也不存在特殊字元的處理問題。我們可以很容易地將這三行PHP代碼加入到所有靜態HTML頁面中。

   require函數引入了一個PHP文件,這個文件包含了所有必需的與模板相關的PHP代碼。其中pageStart函數設置模板物件以及頁面標題,pageFinish函數解析模板然後生成結果發送給瀏覽器。

   這是如何實現的呢?為什麼在調用pageFinish函數之前文件中的HTML不會發送給瀏覽器?答案就在於PHP 4的一個新功能,這個功能允許把輸出到瀏覽器的內容截獲到緩衝區之中。讓我們來看看prepend.php的具體代碼:


<?php

require('class.FastTemplate.php');

function
pageStart($title = '') {
GLOBAL
$tpl;
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav'=> 'leftnav.htm' ) );
$tpl->assign('TITLE', $title);
ob_start();
}

function
pageFinish() {
GLOBAL
$tpl;
$content = ob_get_contents();
ob_end_clean();
$tpl->assign('CONTENT', $content);
$tpl->parse('HEADER', 'header');
$tpl->parse('LEFTNAV', 'leftnav');
$tpl->parse('MAIN', 'main');
$tpl->FastPrint('MAIN');
}

?>


pageStart函數首先創建並設置了一個模板實例,然後用輸出緩存。此後,所有來自頁面本身的HTML內容都將進入緩存。pageFinish函數取出緩存中的內容,然後在模板物件中指定這些內容,最後解析模板並輸出完成後的頁面。

這就是整個模板框架全部的工作過程了。首先編寫包含了網站各個頁面公共元素的模板,然後從所有頁面中刪除全部公共的頁面佈局代碼,代之以三行永遠無需改動的PHP代碼;再把FastTemplate類文件和prepend.php加入到包含路徑,這樣你就得到了一個頁面佈局可以集中控制的網站,它有著更好的可靠性和可維護性,而且網站級的大範圍修改也變得相當容易。

   FastTemplate類可以在 http://www.thewebmasters.net/ 找到,最新的版本號是1.1.0,那裏還有一個用於保證該類在PHP 4中正確運行的小補丁。本文下載代碼中的類已經經過該補丁的修正。
原创粉丝点击