| only for RuBoard - do not distribute or recompile |
As we mentioned before, this application uses one script to control everything. This script is called index.php. It is shown in Listing 27.2. This script is quite long, but we will go through it section by section.
<?
// 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();
$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>Logged in successfully.<br><br><br><br><br><br>";
$auth_user = $username;
session_register("auth_user");
}
else
{
$status .= "<p>Sorry, we could not log you in with that
username and password.<br><br><br><br><br><br>";
}
}
if($action == 'log-out')
{
session_destroy();
unset($action);
unset($auth_user);
}
//need to process choose, delete or store account before drawing header
switch ( $action )
{
case 'delete-account' :
{
delete_account($auth_user, $account);
break;
}
case 'store-settings' :
{
store_account_settings($auth_user, $HTTP_POST_VARS);
break;
}
case 'select-account' :
{
// if have chosen a valid account, store it as a session variable
if($account&&account_exists($auth_user, $account))
{
$selected_account = $account;
session_register('selected_account');
}
}
}
// 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($auth_user, "Warm Mail - ".
format_action($action), $selected_account);
}
else
{
// display header with just application name
do_html_header($auth_user, "Warm Mail", $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 ".<br><br>";
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($auth_user);
break;
}
case 'send-message' :
{
if(send_message($to, $cc, $subject, $message))
echo "<p>Message sent.<br><br><br><br><br><br>";
else
echo "<p>Could not send message.<br><br><br><br><br><br>";
break;
}
case 'delete' :
{
delete_message($auth_user, $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($auth_user, $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($auth_user, $selected_account, $messageid,
$fullheaders)
;
break;
}
case 'reply-all' :
{
//set cc as old cc line
if(!$imap)
$imap = open_mailbox($auth_user, $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($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($auth_user, $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($auth_user, $to, $cc, $subject, $body);
}
break;
}
case 'forward' :
{
//set message as quoted body of current message
if(!$imap)
$imap = open_mailbox($auth_user, $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($auth_user, $to, $cc, $subject, $body);
}
break;
}
case 'new-message' :
{
display_new_message_form($auth_user, $to, $cc, $subject, $body);
break;
}
}
}
//*****************************************************************************
// Stage 4: footer
do_html_footer();
//*****************************************************************************
?>
This script uses an event handling approach. It contains the knowledge or logic about which function needs to be called for each event. The events in this case are triggered by the user clicking the various buttons in the site, each of which selects an action. Most buttons are produced by the display_button() function, but the display_form_button() function is used if it's a submit button. These functions are both in output_fns.php. These all jump to URLs of the form
index.php?action=log-out
The value of the $action variable when index.php is called determines which event handler to activate.
The four main sections to the script are as follows:
We do some processing that must take place before we send the page header to the browser, such as starting the session, executing any preprocessing for the action the user has selected, and deciding what the headers will look like.
We process and send the appropriate headers and menu bar for the action the user has selected.
We choose which body of the script to execute, depending on the selected action. The different actions trigger different function calls.
We send the page footers.
If you look briefly through the code for the script, you will see that these four sections are marked with comments.
To understand this script fully, let's walk through actually using the site action by action.
| only for RuBoard - do not distribute or recompile |