LISTING28.9 load_list_info Function from mlm_fns.php—This Function Builds an Array of List Information function load_list_info$listid { if!$listid return false; if!db_connect return fals
Trang 1LISTING28.8 Continued
$info = load_list_info($listid);
if($info)
{
echo “<h2>”.pretty($info[listname]).”</h2>”;
echo ‘<p>’.pretty($info[blurb]);
echo ‘<p>Number of subscribers:’ $info[subscribers];
echo ‘<p>Number of messages in archive:’ $info[archive];
}
}
The display_information()function uses two other functions to help it achieve its Web task:
the load_list_info()function and the pretty()function The load_list_info()function
actually retrieves the data from the database The pretty()function simply formats the data
from the database by stripping out slashes, turning newlines into HTML line breaks, and so on.
Let’s look briefly at the load_list_info()function This function is in the mlm_fns.php
function library The code for it is shown in Listing 28.9.
LISTING28.9 load_list_info() Function from mlm_fns.php—This Function Builds an Array
of List Information
function load_list_info($listid)
{
if(!$listid)
return false;
if(!db_connect())
return false;
$query = “select listname, blurb from lists where listid = $listid”;
$result = mysql_query($query);
if(!$result)
{
echo “Cannot retrieve this list”;
return false;
}
$info = mysql_fetch_array($result);
$query = “select count(*) from sub_lists where listid = $listid”;
$result = mysql_query($query);
if($result)
{
$info[‘subscribers’] = mysql_result($result, 0, 0);
}
28
Trang 2$query = “select count(*) from mail where listid = $listid
and status = ‘SENT’”;
$result = mysql_query($query);
if($result) {
$info[‘archive’] = mysql_result($result, 0, 0);
} return $info;
}
This function runs three database queries to collect the name and blurb for a list from the liststable; the number of subscribers from the sub_liststable; and the number of newslet-ters sent from the mail table.
Viewing List Archives
In addition to viewing the list blurb, users can look at all the mail that has been sent to a mail-ing list by clickmail-ing on the Show Archive button This activates the show-archive action, which triggers the following code:
case ‘show-archive’ : {
display_items(“Archive For “.get_list_name($id),
get_archive($id), ‘view-html’, ‘view-text’, ‘’);
break;
} Again, this function uses the display_items()function to list out the various items of mail that have been sent to the list These items are retrieved using the get_archive() function from mlm_fns.php This function is shown in Listing 28.10.
LISTING28.10 get_archive() Function from mlm_fns.php—This Function Builds an Array
of Archived Newsletters for a Given List
function get_archive($listid) {
//returns an array of the archived mail for this list //array has rows like (mailid, subject)
$list = array();
$listname = get_list_name($listid);
Trang 3LISTING28.10 Continued
$query = “select mailid, subject, listid from mail
where listid = $listid and status = ‘SENT’ order by sent”;
if(db_connect())
{
$result = mysql_query($query);
if(!$result) {
echo “<p>Unable to get list from database - $query.”;
return false;
}
$num = mysql_numrows($result);
for($i = 0; $i<$num; $i++) {
$row = array(mysql_result($result, $i, 0),
mysql_result($result, $i, 1), $listname, $listid);
array_push($list, $row);
} }
return $list;
}
Again, this function gets the required information—in this case, the details of mail that has
been sent—from the database and builds an array suitable for passing to the display_items()
function.
Subscribing and Unsubscribing
On the list of mailing lists shown in Figure 28.7, each list has a button that enables users to
subscribe to it Similarly, if users use the Show My Lists option to see the lists to which they
are already subscribed, they will see an Unsubscribe button next to each list.
These buttons activate the subscribe and unsubscribe actions, which trigger the following two
pieces of code, respectively:
case ‘subscribe’ :
{
subscribe(get_email(), $id);
display_items(“Subscribed Lists”, get_subscribed_lists(get_email()),
‘information’, ‘show-archive’, ‘unsubscribe’);
break;
}
case ‘unsubscribe’ :
{
28
Trang 4display_items(“Subscribed Lists”, get_subscribed_lists(get_email()),
‘information’, ‘show-archive’, ‘unsubscribe’);
break;
}
In each case, we call a function (subscribe() or unsubscribe()) and then redisplay a list of mailing lists the user is now subscribed to using the display_items() function again.
The subscribe() and unsubscribe() functions are shown in Listing 28.11.
LISTING28.11 subscribe() and unsubscribe() Functions from mlm_fns.php—These Functions Add and Remove Subscriptions for a User
function subscribe($email, $listid) {
if(!$email||!$listid||!list_exists($listid)||!subscriber_exists($email)) return false;
//if already subscribed exit if(subscribed($email, $listid)) return false;
if(!db_connect()) return false;
$query = “insert into sub_lists values (‘$email’, $listid)”;
$result = mysql_query($query);
return $result;
} function unsubscribe($email, $listid) {
if(!$email||!$listid) return false;
if(!db_connect()) return false;
$query = “delete from sub_lists where email = ‘$email’ and listid = $listid”;
Trang 5LISTING28.11 Continued
$result = mysql_query($query);
return $result;
}
The subscribe()function adds a row to the sub_liststable corresponding to the
subscrip-tion; the unsubscribe()function deletes this row.
Changing Account Settings
The Account Settings button, when clicked, activates the account-settings action The code for
this action is as follows:
case ‘account-settings’ :
{
display_account_form($normal_user, $admin_user, get_email(),
get_real_name(get_email()), get_mimetype(get_email()));
break;
}
As you can see, we are reusing thedisplay_account_form()function that we used to create
the account in the first place However, this time we are passing in the user’s current details,
which will be displayed in the form for easy editing When the user clicks on the submit button
in this form, the store-accountaction is activated as discussed previously.
Changing Passwords
Clicking on the Change Password button activates the change-passwordaction, which triggers
the following code:
case ‘change-password’ :
{
display_password_form();
break;
}
The display_password_form()function (from the output_fns.php library) simply displays a
form for the user to change his password This form is shown in Figure 28.9.
28
Trang 6The display_password_form() function enables users to change their passwords.
When a user clicks on the Change Password button at the bottom of this form, the store-change-passwordaction will be activated The code for this is as follows:
case ‘store-change-password’ : {
if(change_password(get_email(), $old_passwd,
$new_passwd, $new_passwd2)) {
echo “<p>OK: Password changed.<br><br><br><br><br><br>”;
} else { echo “<p>Sorry, your password could not be changed.”;
display_password_form();
} break;
}
As you can see, this code tries to change the password using the change_password() function and reports success or failure to the user The change_password()function can be found in the user_auth_fns.php function library The code for this function is shown in Listing 28.12.
Trang 7LISTING28.12 change_password() Function from user_auth_fns.php—This Function
Validates and Updates a User’s Password
function change_password($email, $old_password, $new_password,
$new_password_conf) // change password for email/old_password to new_password
// return true or false
{
// if the old password is right
// change their password to new_password and return true
// else return false
if (login($email, $old_password))
{
if($new_password==$new_password_conf) {
if (!($conn = db_connect())) return false;
$query = “update subscribers
set password = password(‘$new_password’) where email = ‘$email’”;
$result = mysql_query($query);
return $result;
} else echo “<p> Your passwords do not match.”;
}
else
echo “<p> Your old password is incorrect.”;
return false; // old password was wrong
}
This function is similar to other password setting and changing functions we have looked at
It compares the two new passwords entered by the user to make sure they are the same, and if
they are, tries to update the user’s password in the database.
Logging Out
When a user clicks on the Log Out button, it triggers the log-out action The code executed by
this action in the main script is actually in the preprocessing section of the script, as follows:
if($action == ‘log-out’)
{
session_destroy();
unset($action);
28
Trang 8} This snippet of code disposes of the session variables and destroys the session Notice that it also unsets the $action variable—this means that we enter the main case statement without an action, triggering the following code:
case ‘’:
{ if(!check_logged_in()) display_login_form($action);
break;
} This will allow another user to log in, or allow the user to log in as someone else.
Implementing Administrative Functions
If someone logs in as an administrator, she will get some additional menu options, which can
be seen in Figure 28.10.
FIGURE28.10
The administrator menu allows for mailing list creation and maintenance.
Trang 9The extra options they have are Create List (create a new mailing list), Create Mail (create a
new newsletter), and View Mail (view and send created newsletters that have not yet been
sent) We will look at each of these in turn.
Creating a New List
If the administrator chooses to set up a new list by clicking on the Create List button, she will
activate the create-listaction, which is associated with the following code:
case ‘create-list’ :
{
display_list_form(get_email());
break;
}
The display_list_form()function displays a form that enables the administrator to enter the
details of a new list It can be found in the output_fns.php library It just outputs HTML, so we
will not go through it here The output of this function is shown in Figure 28.11.
28
FIGURE28.11
The Create List option requires the administrator to enter a name and description (or blurb) for the new list.
When the administrator clicks on the Save List button, this activates the store-list action,
which triggers the following code in index.php:
Trang 10{ if(store_list($admin_user, $HTTP_POST_VARS)) {
echo “<p>New list added<br>”;
display_items(“All Lists”, get_all_lists(), ‘information’,
‘show-archive’,’’);
} else echo “<p>List could not be stored, please try “ ”again.<br><br><br><br><br>”;
break;
}
As you can see, the code tries to store the new list details and then displays the new list of lists The list details are stored with the store_list() function The code for this function is shown
in Listing 28.13.
LISTING28.13 store_list() Function from mlm_fns.php—This Function Inserts a New Mailing List into the Database
function store_list($admin_user, $details) {
if(!filled_out($details)) {
echo “All fields must be filled in Try again.<br><br>”;
return false;
} else { if(!check_admin_user($admin_user)) return false;
// how did this function get called by somebody not logged in as admin? if(!db_connect())
{ return false;
}
$query = “select count(*) from lists where listname = ‘$details[name]’”;
$result = mysql_query($query);
if(mysql_result($result, 0, 0) > 0) {
echo “Sorry, there is already a list with this name.”;
return false;
}