30.6 用户函数的实现
用户登录后,我们希望他们能够完成如下所示的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()内置函数来逐行建立数组。
现在我们已经了解了列表的产生过程,下面,我们将介绍与这些显示相关的动作按钮。