接上一篇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 $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 $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 代码
Thursday's product demo included a couple of exciting new
surprises from competing firms in the industry.
Ticket sales to the Trade Show opening event were
up 15% from last year's show.
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 . "
\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" 中。