用户登录后,我们希望他们能够完成如下所示的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所示的是这个函数的功能。
图 30-7 display_items函数用来列出用户未订阅的列表以上就是/"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内置函数来逐行建立数组。
现在我们已经了解了列表的产生过程,下面,我们将介绍与这些显示相关的动作按钮。