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.6 用户函数的实现 - 图1

图 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()内置函数来逐行建立数组。

现在我们已经了解了列表的产生过程,下面,我们将介绍与这些显示相关的动作按钮。