用户登录后,我们希望他们能够完成如下所示的5件事:
■查看可供订阅的邮件列表
■订阅或取消订阅邮件列表
■修改建立账户的方法
■更改密码
■登出
在图30-6中,可以看到这些选项的大部分。接下来,我们介绍每个选项的具体实现。
30.6.1 查看列表
在这个项目中,我们将实现很多选项,这些选项可以用来查看可供使用的列表及列表细节。在图30-6中,可以看到其中两个选项:\"Show My Lists\",该选项用来获得该用户订阅的邮件列表;\"Show Other Lists\",来获得该用户没有订阅的邮件列表。
如果回头看看图30-4,会发现还有另一个选项——\"Show All Lists\",该选项可以获得系统中所有可供使用的邮件列表。为了使系统真正可以升级,我们应增加分页功能(例如,每页显示10个查询结果)。出于简单的考虑,我们没有使用这项功能。
这3个选项将分别触发show-all-lists、show-other-lists和show-my-lists动作。我们可能已经意识到,所有这些动作的工作方式十分相似。以上3种动作的代码如下所示:
case\'show-all-lists\':
display_items(\'All Lists\',get_all_lists,\'information\',
\'show-archive\',\'\');
break;
case\'show-other-lists\':
display_items(\'Unsubscribed Lists\',
get_unsubscribed_lists(get_email),\'information\',
\'show-archive\',\'subscribe\');
break;
case\'\':
case\'show-my-lists\':
display_items(\'Subscribed Lists\',get_subscribed_lists(get_email),
\'information\',\'show-archive\',\'unsubscribe\');
break;
可以看到,所有这些操作都将调用output_fns.php库中的display_items函数,但是每一个操作对该函数的调用都有不同的参数。它们也将使用前面提到的get_email函数来获得用户的电子邮件地址。
图30-7所示的是这个函数的功能。

以上就是\"Show Other Lists\"页面。
下面,让我们来看看display_items函数的代码,如程序清单30-7所示。
程序清单30-7 output_fns.php库中的display_items函数——该函数用来显示相关操作的条目列表
function display_items($title,$list,$action1=\'\',$action2=\'\',
$action3=\'\'){
global$table_width;
echo\"<table width=\"$table_width\"cellspacing=\"0\"
cellpadding=\"0\"border=\"0\">\";
//count number of actions
$actions=(($action1!=\'\')+($action2!=\'\')+($action3!=\'\'));
echo\"<tr>
<th colspan=\"\".(1+$actions).\"\"bgcolor=\"#5B69A6\">\"
.$title.\"</th>
</tr>\";
//count number of items
$items=sizeof($list);
if($items==0){
echo\"<tr>
<td colspan=\"\".(1+$actions).\"\"align=\"center\">No
Items to Display</td>
</tr>\";
}else{
//print each row
for($i=0;$i<$items;$i++){
if($i%2){
//background colors alternate
$bgcolor=\"#ffffff\";
}else{
$bgcolor=\"#ccccff\";
}
echo\"<tr>
<td bgcolor=\"\".$bgcolor.\"\"
width=\"\".($table_width-($actions*149)).\"\">\";
echo$list[$i][1];
if($list[$i][2]){
echo\"-\".$list[$i][2];
}
echo\"</td>\";
//create buttons for up to three actions per line
for($j=1;$j<=3;$j++){
$var=\"action\".$j;
if($$var){
echo\"<td bgcolor=\"\".$bgcolor.\"\"width=\"149\">\";
//view/preview buttons are a special case as they link to a file
if(($$var==\'preview-html\')||($$var==\'view-html\')||
($$var==\'preview-text\')||($$var==\'view-text\')){
display_preview_button($list[$i][3],$list[$i][0],$$var);
}else{
display_button($$var,\'&id=\'.$list[$i][0]);
}
echo\"</td>\";
}
}
echo\"</tr>n\";
}
echo\"</table>\";
}
}
该函数将输出一个条目表,每个条目都具有3个相关的操作按钮。该函数具有5个参数,它们依次如下所示。
■$title是显示在表顶部的标题——在图30-7中,我们提交的标题为\"Unsubscribed Lists\",正如我们前面讨论过的\"Show Other Lists\"的那段代码中所显示的。
■$list是表中每行显示的条目组成的数组。在这个例子中,它是该用户没有订阅的邮件列表组成的数组。我们将在get_unsubscribed_lists函数中构建该数组(在这个例子中),我们将在稍后的内容中介绍这些函数。这是一个多维数组,该数组中的每一行包括4块数据。依次如下。
■$list[n][0]包含条目标识符,通常是行号。该序号为按钮给出了将要操作的行号。在我们的例子中,使用数据库中的ID——稍后将详细介绍。
■$list[n][1]包含该条目名称。为特定条目显示的文本。例如,在图30-7中,表中第一行的条目名是PHP Tipsheet。
■$list[n][2]和$list[n][3]是可选的。使用它们来表示还有其他信息。它们分别对应更多的信息文本和更多的信息ID。我们在讨论“管理函数的实现”部分的\"View Mail\"动作时了解使用这两个参数的例子。
■该函数的第3、第4、第5个参数用来传递3个动作,这些动作将会显示在相应条目的按钮上。在图30-7中,3个动作按钮分别是\"Information\"、\"Show Archive\"和\"Subscribe\"。
通过传递动作名称,即information、show-archive和subscribe,可以获得\"Show All Lists\"页面上的这3个按钮。通过display_button函数,这些动作将被转换成带有文字的按钮,并且赋予它们相应的动作。
可以看到,在这些动作中,每一个Show动作都将以不同的方法调用display_items函数。除了具有不同的标题和动作按钮外,这3个动作还会使用不同的函数建立要显示的条目数组。\"Show All Lists\"使用get_all_lists函数。\"Show Other Lists\"使用get_unsubscribed_lists函数。而\"Show My Lists\"将使用get_subscribed_lists。所有这些函数的工作方式类似。这些函数都来自mlm_fns.php函数库。
下面,我们将了解get_unsubscribed_lists函数,因为它是我们已经使用的例子。该函数的代码如程序清单30-8所示。
程序清单30-8 mlm_fns.php库中的get_unsubscribed_lists函数——该函数用来建立用户没有订阅的邮件列表数组
function get_unsubscribed_lists($email){
$list=array;
$query=\"select lists.listid,listname,email from lists
left join sub_lists on lists.listid=sub_lists.listid
and email=\'\".$email.\"\'where email is NULL
order by listname\";
if($conn=db_connect){
$result=$conn->query($query);
if(!$result){
echo\'<p>Unable to get list from database.</p>\';
return false;
}
$num=$result->num_rows;
for($i=0;$i<$num;$i++){
$row=$result->fetch_array;
array_push($list,array($row[0],$row[1]));
}
}
return$list;
}
可以看到,该函数要求传递一个邮件地址作为参数。这应该是我们正与之交互的订阅者的邮件地址。get_subscribed_lists函数也要一个邮件地址作为参数,显然,get_all_lists不需要任何参数。
给出订阅者邮件地址后,我们可以连接数据库并从中取出该订阅者没有订阅的所有邮件列表。可以使用LEFT JOIN来查找不匹配条目。通过遍历这个结果集,我们可以使用array_push内置函数来逐行建立数组。
现在我们已经了解了列表的产生过程,下面,我们将介绍与这些显示相关的动作按钮。