管理者用の画面は、パスワードを入力すると表示される画面で、不要なメッセージの削除を画面上から行うことができます。ここでは、作成した掲示板に管理者用の画面を表示するための機能を追加する方法を考えてみましょう。
エディタで「libraly.pl」を開き、管理者用画面を表示する前に、パスワードを入力してチェックを行うための処理を記述します。パスワードの値の変更は「keijiban.cgi」の中に記述します。
sub master {
# 掲示板上の管理画面へのリンクをクリックしたときのみパスワード入力画面の表示を行う
if (!$do) {
print "Content-type: text/html\n\n";print<<"END";
<html><head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=EUC-JP">
<TITLE>$title</TITLE></HEAD>
<BODY BGCOLOR="$body_color" TEXT="$text_color"><CENTER>管理者用画面を表示します。<BR>
パスワードを入力して下さい。
#管理者用の画面からの送信データであることをCGIプログラムに通知する
<FORM ACTION="$cgifile" METHOD="$method">
#パスワードが送信されたことをCGIプログラムに通知する
<INPUT TYPE=hidden NAME=command VALUE="master">
<INPUT TYPE=hidden NAME=do VALUE="ok">
<INPUT TYPE=password NAME=pass SIZE=8>
<INPUT TYPE=submit VALUE=" パスワード送信"></FORM></CENTER>
</BODY></HTML>
END
exit;
}「TYPE=hidden」は、フォームが送信される時に特定のデータを送信することができる属性です。「TYPE=hidden」に続けて設定した値は、画面上には表示されないので、フォームの内容と一緒に特定の情報を送信させたい場合に便利です。上で定義した画面に入力されたパスワードのチェックを行うための処理を記述します。
else {
# パスワードのチェックを行う
if ($ANSWER{'pass'} ne "$pass") { &error("パスワードが違います。"); }
}配列変数「ANSWER」からパスワード値を取り出して照合し、入力されたパスワードが異なる場合はエラー画面を表示します。管理者の画面で指定された削除の対象となるデータを削除するための処理を記述します。
#保存用ファイルのデータを取り出して配列変数「all_data」に格納する
open(DATA,"$datafile");
@all_data = <DATA>;
close(DATA);# 削除データがある場合は処理を行う
#削除情報を格納している配列変数「DELETE」に値が入っている場合はデータを削除する処理を実行する
$keycount = @DELETE;
if ($keycount > 0) {@new=();
# 配列変数「all_data」の値を1件ずつ取り出して処理を行う
foreach $line (@all_data) {
#削除データを識別するための変数「flag」に「0」を代入
$flag=0;
#項目ごとにデータを分解
($num,$date,$name,$email,$sub,$comment,$url,$host) = split(/,/, $line);foreach $delete_no (@DELETE) {
#削除する書き込みデータのNoと照合し、該当するデータには変数「flag」の値を「1」に変更
if ($num eq "$delete_no") { $flag=1; last; }
}
#変数flagの値が「0」のデータだけを配列変数「new」に格納
if ($flag == 0) { push(@new,$line); }
}# データを更新する
open(OUT,">$datafile");
print OUT @new;
close(OUT);@all_data = @new;
}次に、管理画面を表示するための処理を記述します。
# 管理者用画面を表示するHTML文書の定義
print "Content-type: text/html\n\n";print<<"END";
<HTML><HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=EUC-JP">
<TITLE>$title</TITLE></head>
<BODY BGCOLOR="$body_color" TEXT="$text_color" LINK="$link" VLINK="$vlink">[<A HREF="$cgifile?">掲示板にもどる</A>]
<FORM ACTION="$cgifile" METHOD="$method">
#タグ内の記述を非表示にするための記述(type属性に「hidden」を設定)
#「pass」という値に対して入力済みのパスワードの値をセットすることで削除データを送信した際にパスワードチェックをスキップ
<INPUT TYPE=hidden NAME=pass VALUE="$ANSWER{'pass'}">
#「command」「act」にそれぞれ値を設定して、管理者用の画面から送信された削除データであることをCGIプログラムに通知
<INPUT TYPE=hidden NAME=command VALUE="master">
<INPUT TYPE=hidden NAME=do VALUE="delete">
<BR><CENTER><INPUT TYPE=submit VALUE="削除"><INPUT TYPE=reset value="リセット">
<TABLE BORDER=1>
<TR><TH>削除<TH>No<TH>名前<TH>タイトル<TH>コメント<TH>ホスト</TR>
END#保存データをそれぞれ変数に格納する
foreach $line (@all_data) {
($num,$date,$name,$email,$sub,$comment,$url,$host) = split(/,/, $line);
if ($email) { $name = "<a href=\"mailto\:$email\">$name</a>"; }$comment =~ s/<br>/ /g;
$comment =~ s/</</g;
$comment =~ s/>/>/g;#チェックボックスと各データの表示
print "<tr><th><input type=checkbox name=delete_no value=\"$num\"><th>$num<td>$name<td>$sub<td><small>$comment</small><td>$host</tr>\n";
}print<<"END";
</TABLE></FORM></CENTER></BODY></HTML>
END
exit;
}掲示板に管理者用の画面を追加した場合、書き込み用のフォームから送信されるデータに加え、パスワードの入力画面からのデータや管理者用画面のフォームからのデータがCGIプログラムに送信されます。このため、CGIプログラムでは、どのフォームからの送信データなのかを認識して、適切な処理に振り分ける必要があります。ここでは、専用のタグをフォーム内に設定し、「NAME」属性と「VALUE」属性を使って、どのフォームからの送信データであるかをCGIプログラムに通知するように設定しています。
削除する書き込みデータの「No」は、フォームから送信された情報を元に配列変数「DELETE」に格納されています。例では、これまでの書き込みデータの「No」を削除する書き込みデータの「No」と照合し、該当しないデータだけを保存用ファイルに新たに書きこむようにしています。これによって、削除対象の書き込みデータは、ファイルへの保存が行われないので、結果的に保存ファイル上から削除されたことになります。