接上一篇PHP例解Webzine編輯和發送(二)
作為構建動態網頁的一種語言,PHP提供了一種簡化的方法來構造複雜而功能強大的與 Web 相關的程式。 Erik用一個原始的、現實世界的網站樣本逐步說明了PHP的基本原理。本系列文章的第3、4部分介紹發送模組如何向讀者呈現一個故事菜單,並說明編輯模組如何使作者能將故事提交給Webzine。
如果您是初次接觸PHP,您可能會驚喜地發現在實踐中它是多麼便於使用。本文旨在使您對PHP的工作方式留下一個好的印象; 隨後您就可以確定它是否適合您。
簡介
在本文的第1、2部分,我介紹了Webzine 這個簡單PHP應用程式的發送部分。儘管只有大約3K的代碼,但它包含了許多功能。您已試用了這個應用程式,並開始研究它的後台工作方式。我說明了應用程式如何向使用者顯示類別菜單並根據選擇顯示故事。我還使讀者對PHP應用程式的工作方式以及它們從調用頁接收參數的方式有了一定的瞭解。
本文是第3部分,您首先會瞭解到發送模組是如何將故事菜單呈現給讀者的,然後還會快速查看一下使作者能向Webzine 提交故事的編輯模組。
故事菜單
檔案中的每個故事在主題菜單檔案中都有對應的一行。我已決定將脫字元號("^")用作定界符來分隔檔案中的不同項目,但您可以使用任何字元(定位字元是一種通用的選擇)。下面是基本的布局:
故事編號^標題^映像 URL^摘要
.
舉例來說,僅包含三個故事的主題菜單檔案 (TradeShow.txt)可能如下所示:
清單1.包含三個故事的主題菜單檔案
33^Great New Products This Year^/images/proddemo.jpg^Thursday's product demo ...
12^Opening Event Well Attended^/images/opnfoto.jpg^Ticket sales to the ...
5^Trade Show Opens^/images/tradelogo.gif^The Fourth Annual Trade Show ...
菜單驅動程式接受這些資訊並向讀者提供一個故事概述。其工作方式如下:
首先,驅動程式將適當的條目編號從主題菜單檔案複製到數組$stories 中。對於上面的樣本,$stories[0]包含第一行(故事編號為 33),$stories[1] 包含故事編號 12,$stories[2] 包含故事編號5。您還需要統計數組中的元素個數,並將其儲存在變數$numstories 中。
下一步,驅動程式將此資訊提供給使用者,如下所示:
清單 2.驅動程式
for ($i=0; $i<$numstories; $i++) {
$storyinfo = split("\^", $stories[$i]);
$storynum = $storyinfo[0]; // 故事編號(例如 33)
$storydesc = $storyinfo[1]; // 故事標題(例如 "Great New Products This Year")。
$storyimg = $storyinfo[2]; // 映像 URL(例如 "/images/proddemo.jpg")。
$dtext = $storyinfo[3]; // 故事摘要(更長的文本說明)。
$url = "$storydesc
";
if ($i<10) {
$url = "
" . $url . "
";
if ($storyimg != "") {
$url = "
. " src=\"$storyimg\">
\n"
. $url;
}
$url = "" . $url;
} else {
$url = "
" . $url . "
";
}
echo("$url\n");
echo("
$dtext
\n");
}
split函數將故事資訊的內容從一個字串複製到一個數組中。請注意,脫字元號前面加了一個反斜線從而成為“轉義”字元。該程式將數組節點轉換為說明性更強的變數名,從而使代碼更易於閱讀。然後就會構造URL。if/else 結構對前10個故事的處理與對其他故事的處理不同。前10個故事有一個分隔線,使用H2標記,並包括一張照片(如果有)。剩餘的故事使用H3標記,沒有分隔線,也沒有照片。這個處理反白最新的故事,並保留較舊的故事供需要它們的讀者訪問。請注意,編號為奇數的的映像是靠右對齊的,而編號為偶數的映像是靠左對齊的。
作為本例的結束,為上面的 theTradeShow.txt 檔案所產生的HTML代碼如下所示:
清單 3. 為 theTradeShow.txt 檔案所產生的 HTML 程式碼
Great New Products This Year
Thursday's product demo included a couple of exciting new
surprises from competing firms in the industry.
Opening Event Well Attended
Ticket sales to the Trade Show opening event were
up 15% from last year's show.
Trade Show Opens
The Fourth Annual Trade Show opened 10/11/2000 to an enthusiastic reception
from attendees.
單擊此處查看 index.php3的原始碼。在開始下一部分之前您可能希望查看整組原始碼。畢竟代碼的大小還不到3K!
編輯頁 "author.php3"
對編輯頁的分析不會像對發送模組的分析那樣詳細,因為它比較長,而且我們已經討論了許多基本概念。
為了簡要說明一個 PHP 函數的基本結構,讓我們看一下編輯模組中的complain函數。這是一個簡單的函數,但它是一個很好的入門級材料。
清單 4. 一個 PHP 函數樣本
//通知使用者輸入問題。
function complain($problem) {
global $status;
if ($status != "") $status = $status . "<br>\n";
$status = $status . $problem;
}
您可以在代碼中的任何地方調用這個函數。例如,complain("The URL is too long."); 接收全域變數 $status並將這個新的錯誤訊息追加到其尾部,如果 $status不為空白,則在錯誤訊息前添加一個分行符號。
Prepend
prepend函數是編輯模組中最重要的函數之一。它在檔案的首行添加一個新條目。下面,我使用它將作者的新提交添加到主題菜單檔案的開頭。
清單 5. prepend 函數
//在一個現有檔案的開頭添加一行新內容。
function prepend($file,$string) {
// 有待改進 — 使用資料庫提高這個演算法的延展性。
// 目前限制為 100 個故事。
if (file_exists($file)) {
$filetext = file($file);
$lines = count($filetext);
} else {
$lines = 0;
}
if ($lines > 100) $lines = 100;
$handle = fopen($file,"w");
fputs ($handle, "$string\n");
for ($i=0; $i<$lines; $i++)
fputs ($handle, $filetext[$i]);
fclose ($handle);
}
如果檔案存在,整個本文將存入 $filetext數組中。然後統計出行數。如果檔案不存在,則認為它有零行。長度限制為100 行(實際上是 101 行,因為第一行是在開始計數之前添加的)。檔案開啟,程式首先將當前的字串寫入檔案中,然後再將剩餘的行(最多100 行)寫入檔案中。這 100 行以後的任何內容將被丟棄。
這個函數依賴於 PHP
內建的幾個重要的檔案處理函數。下表說明了每個函數所進行的操作。
函數 說明
file_exists(string) 將字串作為檔案名稱,如果檔案名稱當前存在,則返回 true。
file(string) 將字串作為檔案名稱,用一個數組返迴文件的本文,每行分別對應一個數組元素。
請注意,行終止字元將位於數組中每行的尾部。
count(array) 返回數組中的元素個數。
fopen(string, mode) 字串是一個檔案名稱,模式是一個字串,例如 "w" 表示寫入,"r"表示讀取。
開啟檔案,並返回一個控制代碼。
fputs(handle, string) 將字串寫入指定的輸出檔案中。必須指定一個檔案控制代碼,
而不能以字串形式指定檔案名稱。
fclose(handle) 關閉檔案,終止輸出。
Save
save函數將作者的輸入寫入一個檔案中。因這個函數太長,
在此我不能逐行分析它,但我會強調幾個有趣的語句。
$entry = "$storynum^$storytitle^$storyimg^$synopsis";
上面的這個語句將$storynum、$storytitle、$storyimg和 $synopsis 變數串連起來,並用脫字元號作為分隔字元。
內嵌的變數替代使它比顯式串連更容易且更有趣。
prepend("Main.txt",$entry);
$topicfile = "$subject.txt";
prepend($topicfile,$entry);
$entry變數的值被添加到主故事菜單檔案和主題特定的故事菜單檔案中。所以,如果變數$subject 等於 "Politics",它就被添加到檔案"Politics.txt" 中。