PHP 深入例解 Webzine 編輯與發(fā)送(3)
發(fā)表時間:2024-06-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]接上一篇PHP例解Webzine編輯和發(fā)送(二) 作為構(gòu)建動態(tài)網(wǎng)頁的一種語言,PHP提供了一種簡化的方法來構(gòu)造復(fù)雜而功能強(qiáng)大的與 Web 相關(guān)的程序。 Erik用一個原始的、現(xiàn)實世界的網(wǎng)站示例逐步說明了PHP的基本原理。本系列文章的第3、4部分介紹發(fā)送模塊如何向讀者呈現(xiàn)一個故事菜單,并說明...
接上一篇PHP例解Webzine編輯和發(fā)送(二)
作為構(gòu)建動態(tài)網(wǎng)頁的一種語言,PHP提供了一種簡化的方法來構(gòu)造復(fù)雜而功能強(qiáng)大的與 Web 相關(guān)的程序。 Erik用一個原始的、現(xiàn)實世界的網(wǎng)站示例逐步說明了PHP的基本原理。本系列文章的第3、4部分介紹發(fā)送模塊如何向讀者呈現(xiàn)一個故事菜單,并說明編輯模塊如何使作者能將故事提交給Webzine。
如果您是初次接觸PHP,您可能會驚喜地發(fā)現(xiàn)在實踐中它是多么易于使用。本文旨在使您對PHP的工作方式留下一個好的印象; 隨后您就可以確定它是否適合您。
簡介
在本文的第1、2部分,我介紹了Webzine 這個簡單PHP應(yīng)用程序的發(fā)送部分。盡管只有大約3K的代碼,但它包含了許多功能。您已試用了這個應(yīng)用程序,并開始研究它的后臺工作方式。我說明了應(yīng)用程序如何向用戶顯示類別菜單并根據(jù)選擇顯示故事。我還使讀者對PHP應(yīng)用程序的工作方式以及它們從調(diào)用頁接收參數(shù)的方式有了一定的了解。
本文是第3部分,您首先會了解到發(fā)送模塊是如何將故事菜單呈現(xiàn)給讀者的,然后還會快速查看一下使作者能向Webzine 提交故事的編輯模塊。
故事菜單
文件中的每個故事在主題菜單文件中都有對應(yīng)的一行。我已決定將脫字符號("^")用作定界符來分隔文件中的不同項目,但您可以使用任何字符(制表符是一種通用的選擇)。下面是基本的布局:
故事編號^標(biāo)題^圖像 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 ...
菜單驅(qū)動程序接受這些信息并向讀者提供一個故事概述。其工作方式如下:
首先,驅(qū)動程序?qū)⑦m當(dāng)?shù)臈l目編號從主題菜單文件復(fù)制到數(shù)組$stories 中。對于上面的示例,$stories[0]包含第一行(故事編號為 33),$stories[1] 包含故事編號 12,$stories[2] 包含故事編號5。您還需要統(tǒng)計數(shù)組中的元素個數(shù),并將其保存在變量$numstories 中。
下一步,驅(qū)動程序?qū)⒋诵畔⑻峁┙o用戶,如下所示:
清單 2.驅(qū)動程序
for ($i=0; $i<$numstories; $i++) {
$storyinfo = split("\^", $stories[$i]);
$storynum = $storyinfo[0]; // 故事編號(例如 33)
$storydesc = $storyinfo[1]; // 故事標(biāo)題(例如 "Great New Products This Year")。
$storyimg = $storyinfo[2]; // 圖像 URL(例如 http://cfan.net.cn/info/"/images/proddemo.jpg")。
$dtext = $storyinfo[3]; // 故事摘要(更長的文本說明)。
$url = "<a href=\"index.php3?topic=$topic&story=$storynum\">$storydesc</a><br>";
if ($i<10) {
$url = "<h2>" . $url . "</h2>";
if ($storyimg != "") {
$url = "<p><img align=" . ($i%2==1 ? "right" : "left")
. " src=\"$storyimg\"></p>\n"
. $url;
}
$url = "<hr>" . $url;
} else {
$url = "<h3>" . $url . "</h3>";
}
echo("$url\n");
echo("<p>$dtext</p>\n");
}
split函數(shù)將故事信息的內(nèi)容從一個字符串復(fù)制到一個數(shù)組中。請注意,脫字符號前面加了一個反斜杠從而成為“轉(zhuǎn)義”字符。該程序?qū)?shù)組節(jié)點轉(zhuǎn)換為說明性更強(qiáng)的變量名,從而使代碼更易于閱讀。然后就會構(gòu)造URL。if/else 結(jié)構(gòu)對前10個故事的處理與對其他故事的處理不同。前10個故事有一個分隔線,使用H2標(biāo)記,并包括一張照片(如果有)。剩余的故事使用H3標(biāo)記,沒有分隔線,也沒有照片。這個處理突出顯示最新的故事,并保留較舊的故事供需要它們的讀者訪問。請注意,編號為奇數(shù)的的圖像是右對齊的,而編號為偶數(shù)的圖像是左對齊的。
作為本例的結(jié)束,為上面的 theTradeShow.txt 文件所生成的HTML代碼如下所示:
清單 3. 為 theTradeShow.txt 文件所生成的 HTML 代碼
<hr><p><img align=left src=http://cfan.net.cn/info/"/images/proddemo.jpg"></p>
<h2><a href="index.php3?topic=TradeShow&story=33">Great New Products This Year</a><br></h2>
<p>Thursday's product demo included a couple of exciting new
surprises from competing firms in the industry.</p>
<hr><p><img align=right src=http://cfan.net.cn/info/"/images/opnfoto.jpg"></p>
<h2><a href="index.php3?topic=TradeShow&story=12">Opening Event Well Attended</a><br></h2>
<p>Ticket sales to the Trade Show opening event were
up 15% from last year's show.</p>
<hr><p><img align=left src=http://cfan.net.cn/info/"/images/tradelogo.gif"></p>
<h2><a href="index.php3?topic=TradeShow&story=5">Trade Show Opens</a><br></h2>
<p>The Fourth Annual Trade Show opened 10/11/2000 to an enthusiastic reception
from attendees.</p>
單擊此處查看 index.php3的源代碼。在開始下一部分之前您可能希望查看整組源代碼。畢竟代碼的大小還不到3K!
編輯頁 "author.php3"
對編輯頁的分析不會像對發(fā)送模塊的分析那樣詳細(xì),因為它比較長,而且我們已經(jīng)討論了許多基本概念。
為了簡要說明一個 PHP 函數(shù)的基本結(jié)構(gòu),讓我們看一下編輯模塊中的complain函數(shù)。這是一個簡單的函數(shù),但它是一個很好的入門級材料。
清單 4. 一個 PHP 函數(shù)示例
//通知用戶輸入問題。
function complain($problem) {
global $status;
if ($status != "") $status = $status . "<br>\n";
$status = $status . $problem;
}
您可以在代碼中的任何地方調(diào)用這個函數(shù)。例如,complain("The URL is too long."); 接收全局變量 $status并將這個新的錯誤消息追加到其尾部,如果 $status不為空,則在錯誤消息前添加一個換行符。
Prepend
prepend函數(shù)是編輯模塊中最重要的函數(shù)之一。它在文件的首行添加一個新條目。下面,我使用它將作者的新提交添加到主題菜單文件的開頭。
清單 5. prepend 函數(shù)
//在一個現(xiàn)有文件的開頭添加一行新內(nèi)容。
function prepend($file,$string) {
// 有待改進(jìn) — 使用數(shù)據(jù)庫提高這個算法的可伸縮性。
// 目前限制為 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數(shù)組中。然后統(tǒng)計出行數(shù)。如果文件不存在,則認(rèn)為它有零行。長度限制為100 行(實際上是 101 行,因為第一行是在開始計數(shù)之前添加的)。文件打開,程序首先將當(dāng)前的字符串寫入文件中,然后再將剩余的行(最多100 行)寫入文件中。這 100 行以后的任何內(nèi)容將被丟棄。
這個函數(shù)依賴于 PHP
內(nèi)建的幾個重要的文件處理函數(shù)。下表說明了每個函數(shù)所進(jìn)行的操作。
函數(shù) 說明
file_exists(string) 將字符串作為文件名,如果文件名當(dāng)前存在,則返回 true。
file(string) 將字符串作為文件名,用一個數(shù)組返回文件的正文,每行分別對應(yīng)一個數(shù)組元素。
請注意,行終止字符將位于數(shù)組中每行的尾部。
count(array) 返回數(shù)組中的元素個數(shù)。
fopen(string, mode) 字符串是一個文件名,模式是一個字符串,例如 "w" 表示寫入,"r"表示讀取。
打開文件,并返回一個句柄。
fputs(handle, string) 將字符串寫入指定的輸出文件中。必須指定一個文件句柄,
而不能以字符串形式指定文件名。
fclose(handle) 關(guān)閉文件,終止輸出。
Save
save函數(shù)將作者的輸入寫入一個文件中。因這個函數(shù)太長,
在此我不能逐行分析它,但我會強(qiáng)調(diào)幾個有趣的語句。
$entry = "$storynum^$storytitle^$storyimg^$synopsis";
上面的這個語句將$storynum、$storytitle、$storyimg和 $synopsis 變量連接起來,并用脫字符號作為分隔符。
內(nèi)嵌的變量替代使它比顯式連接更容易且更有趣。
prepend("Main.txt",$entry);
$topicfile = "$subject.txt";
prepend($topicfile,$entry);
$entry變量的值被添加到主故事菜單文件和主題特定的故事菜單文件中。所以,如果變量$subject 等于 "Politics",它就被添加到文件"Politics.txt" 中。