正如我们前面提到的,该应用程序使用一个脚本控制所有操作。该脚本叫做index.php,如程序清单29-2所示。该脚本比较长,我们逐段详细介绍。
程序清单29-2 index.php——Warm Mail系统的框架
<?php
//This file is the main body of the Warm Mail application.
//It works basically as a state machine and shows users the
//output for the action they have chosen.
//*****************************************************************************
//Stage 1:pre-processing
//Do any required processing before page header is sent
//and decide what details to show on page headers
//*****************************************************************************
include(\'include_fns.php\');
session_start;
//create short variable names
$username=$_POST[\'username\'];
$passwd=$_POST[\'passwd\'];
$action=$_REQUEST[\'action\'];
$account=$_REQUEST[\'account\'];
$messageid=$_GET[\'messageid\'];
$to=$_POST[\'to\'];
$cc=$_POST[\'cc\'];
$subject=$_POST[\'subject\'];
$message=$_POST[\'message\'];
$buttons=array;
//append to this string if anything processed before header has output
$status=\'\';
//need to process log in or out requests before anything else
if($username||$password){
if(login($username,$passwd)){
$status.=\"<p style=\"padding-bottom:100px\">Logged in
successfully.</p>\";
$_SESSION[\'auth_user\']=$username;
if(number_of_accounts($_SESSION[\'auth_user\'])==1){
$accounts=get_account_list($_SESSION[\'auth_user\']);
$_SESSION[\'selected_account\']=$accounts[0];
}
}else{
$status.=\"<p style=\"padding-bottom:100px\">Sorry,we could
not log you in with that username and password.</p>\";
}
}
if($action==\'log-out\'){
session_destroy;
unset($action);
$_SESSION=array;
}
//need to process choose,delete or store account before drawing header
switch($action){
case\'delete-account\':
delete_account($_SESSION[\'auth_user\'],$account);
break;
case\'store-settings\':
store_account_settings($_SESSION[\'auth_user\'],$_POST);
break;
case\'select-account\':
//if have chosen a valid account,store it as a session variable
if(($account)&&(account_exists($_SESSION[\'auth_user\'],$account))){
$_SESSION[\'selected_account\']=$account;
}
break;
}
//set the buttons that will be on the tool bar
$buttons[0]=\'view-mailbox\';
$buttons[1]=\'new-message\';
$buttons[2]=\'account-setup\';
//only offer a log out button if logged in
if(check_auth_user){
$buttons[4]=\'log-out\';
}
//*****************************************************************************
//Stage 2:headers
//Send the HTML headers and menu bar appropriate to current action
//*****************************************************************************
if($action){
//display header with application name and description of page or action
do_html_header($_SESSION[\'auth_user\'],\"Warm Mail-\".
format_action($action),
$_SESSION[\'selected_account\']);
}else{
//display header with just application name
do_html_header($_SESSION[\'auth_user\'],\"Warm Mail\",
$_SESSION[\'selected_account\']);
}
display_toolbar($buttons);
//*****************************************************************************
//Stage 3:body
//Depending on action,show appropriate main body content
//*****************************************************************************
//display any text generated by functions called before header
echo$status;
if(!check_auth_user){
echo\"<p>You need to log in\";
if(($action)&&($action!=\'log-out\')){
echo\"to go to\".format_action($action);
}
echo\".</p>\";
display_login_form($action);
}else{
switch($action){
//if we have chosen to setup a new account,or have just added or
//deleted an account,show account setup page
case\'store-settings\':
case\'account-setup\':
case\'delete-account\':
display_account_setup($_SESSION[\'auth_user\']);
break;
case\'send-message\':
if(send_message($to,$cc,$subject,$message)){
echo\"<p style=\"padding-bottom:100px\">Message sent.</p>\";
}else{
echo\"<p style=\"padding-bottom:100px\">Could not send message.</p>\";
}
break;
case\'delete\':
delete_message($_SESSION[\'auth_user\'],
$_SESSION[\'selected_account\'],$messageid);
//note deliberately no\'break\'-we will continue to the next case
case\'select-account\':
case\'view-mailbox\':
//if mailbox just chosen,or view mailbox chosen,show mailbox
display_list($_SESSION[\'auth_user\'],
$_SESSION[\'selected_account\']);
break;
case\'show-headers\':
case\'hide-headers\':
case\'view-message\':
//if we have just picked a message from the list,or were looking at
//a message and chose to hide or view headers,load a message
$fullheaders=($action==\'show-headers\');
display_message($_SESSION[\'auth_user\'],
$_SESSION[\'selected_account\'],
$messageid,$fullheaders);
break;
case\'reply-all\':
//set cc as old cc line
if(!$imap){
$imap=open_mailbox($_SESSION[\'auth_user\'],
$_SESSION[\'selected_account\']);
}
if($imap){
$header=imap_header($imap,$messageid);
if($header->reply_toaddress){
$to=$header->reply_toaddress;
}else{
$to=$header->fromaddress;
}
$cc=$header->ccaddress;
$subject=\"Re:\".$header->subject;
$body=add_quoting(stripslashes(imap_body($imap,$messageid)));
imap_close($imap);
display_new_message_form($_SESSION[\'auth_user\'],
$to,$cc,$subject,$body);
}
break;
case\'reply\':
//set to address as reply-to or from of the current message
if(!$imap){
$imap=open_mailbox($_SESSION[\'auth_user\'],
$_SESSION[\'selected_account\']);
}
if($imap){
$header=imap_header($imap,$messageid);
if($header->reply_toaddress){
$to=$header->reply_toaddress;
}else{
$to=$header->fromaddress;
}
$subject=\"Re:\".$header->subject;
$body=add_quoting(stripslashes(imap_body($imap,$messageid)));
imap_close($imap);
display_new_message_form($_SESSION[\'auth_user\'],
$to,$cc,$subject,$body);
}
break;
case\'forward\':
//set message as quoted body of current message
if(!$imap){
$imap=open_mailbox($_SESSION[\'auth_user\'],
$_SESSION[\'selected_account\']);
}
if($imap){
$header=imap_header($imap,$messageid);
$body=add_quoting(stripslashes(imap_body($imap,$messageid)));
$subject=\"Fwd:\".$header->subject;
imap_close($imap);
display_new_message_form($_SESSION[\'auth_user\'],
$to,$cc,$subject,$body);
}
break;
case\'new-message\':
display_new_message_form($_SESSION[\'auth_user\'],
$to,$cc,$subject,$body);
break;
}
}
//*****************************************************************************
//Stage 4:footer
//*****************************************************************************
do_html_footer;
?>
这个脚本使用一个事件处理的方法。它包含对于每个事件应该调用哪个函数的知识或逻辑。在这种情况下,事件是由用户点击站点内不同的按钮触发的,每一个按钮对应一种动作。大多数按钮都是由display_button函数产生的,但是如果用户点击的按钮是提交按钮时,则是调用display_form_button函数。这些函数都在output_fns.php中。这些都转至表单的URL:
index.php?action=log-out
当调用index.php时,action变量值决定哪一个事件处理程序被触发。
该脚本由如下所示的4个主要部分组成:
1)在将页面标题发送到浏览器之前要做一些必要的处理,例如,开始一个会话,执行用户选择的动作所必须的预处理操作,并确定页面标题的内容。
2)为用户选择的动作处理和发送适当的标题和菜单条。
3)选择要执行哪一块代码,取决于用户所选的动作。不同的动作将触发不同的函数调用。
4)发送页面的页脚。
如果粗略地看一下代码,会发现这四个部分都用注释作了标记。
为了完全理解脚本程序,让我们来真正使用这个站点。