listboard マニュアル


概要 / 登録項目 / ファイルの構成 / ファイルの内容 / 初期設定 / 表示部の作り方 / データの変換処理方法 / 更新履歴 / 著作権の表示

●概要

 入力フォームの内容を受信して、リスト表示するためのCGIです。
 掲示板やゲストブック、メンバー表として利用できます。
 しかし、登録直後のデータは見ることができません。管理人が自ら操作して表示許可を与えたデータのみ閲覧することができます。
 登録内容の変更・削除も管理人のみが実行できます。


●登録項目

 登録項目は、自由に設計することができます。
 CGIは送られてきたフォームの内容に処理用のデータを付加して記録します。

 処理用の固定データは、カウント数、日付、時刻、ホスト名(IPアドレス)、ステータスです。
 入力フォームからのデータに個数の制限はありませんが、その内容に応じて、CGIの表示部を変更する必要があります。

 また、登録項目に必須項目を設けることが可能で、その項目が未入力の場合、エラー表示をします。


●ファイルの構成

 ファイル名の後ろに「*」の付いたものはファイル名を変更して使用することをおすすめします。

【パーミッションの設定】

 プロバイダによって特別な設定が必要な場合がありますので、まずはその点をご確認下さい。

 一般的なパーミッションの設定は以下の通りです。
 listboard.count、listboard.csvは読込・書込が必要なファイルなので「777」に設定します。
 その他のファイルは読込と実行許可が必要ですので「755」に設定します。
 書込ファイルが存在するディレクトリにも書込の許可が必要ですので、「777」に設定します。

 ロックファイルは作成されません。


●ファイルの内容


●初期設定

 listboard.cgiの初期設定項目について解説します。
 表示の赤い部分が設定可能な箇所を表しています。

##### 基本設定 #####

#ログファイル
$title = "ゲストブック";

 リスト画面に表示するタイトルです。
 他の画面ではその後ろに[管理画面]などと補足されます。
#カウントファイル
$count_file = "listboard.count";

 登録レコード数を記録するためのカウントファイルです。
 フォーム送信後、カウントを1つ増やし、その数字を記録します。その際、cookieとして送信者のブラウザにも保存します。

 listboard.countの初期状態の内容は「0」とだけ記述されています。

#ログファイル
$log_file = "listboard.csv";

 受信したフォームから作成した登録レコードを記録するファイルです。
 レコードは上から順に記録されていきます。

 listboard.csvの初期状態の内容は空になっています。

##### ユーザー設定 #####

#管理人パスワード(管理画面の呼出に必要)
$kanri_pass = "0000";

 管理画面を呼び出すために必要なパスワードを決めます。
 初期設定では「0000」になっていますので、「listboard.cgi?kanri=0000」とすれば管理画面を表示することができます。
#ログの最大行数(0:無制限)
$max = 1000;

 レコードの最大記録数。この件数以上のレコードを追加しようとすると、最も古いレコードが自動的に削除されます。
 無制限にレコードを記録したい場合は、「0」にします。
 記録されたレコードは管理画面で削除することができます。
#ログファイルの表示順(0:古い順/1:最新順/2:ランダム)
$log_sort = 1;

 リスト画面でレコードを表示する順番を指示します。
 順番は上から古い順、新しい順、そして無作為に順番を変更することが可能です。
 ランダムの場合、ともかく適当にレコードを並べ替えて表示します。
#多重登録の禁止(0:許可/1:禁止)
$taju = 1;

 入力フォームからのデータを受け入れる際、過去の登録レコードと比較して二重書込を防止するかどうかを選択します。
 詳しくは「入力フォーム」の解説をご覧下さい。
#入力項目の名称(省略可。入力フォームに合わせて記入)
@form_name = ("お名前","URL","コメント","メール","使用機器");

 入力フォームの項目の順序に合わせて、1つ目のデータの名称から順に用意します。それぞれ名称を「"」でくくり、「,」で区切ります。
 修正画面において、データ名(項目名)を表示する際に、どのデータが何を意味するか分かるようにするために利用します。省略すると仮名称で表示します。
 @form_name[0]..などとして順に取り出せるので、表示部においても利用できます。
##### システム設定 #####

#テーブルフォーム
$table_color = "#FFFFFF";
$header_color = "#FF9999";
$light_color = "#FFFF99";
$dark_color = "#999999";

 標準的なテーブルの配色を指定しています。
 実際に表示部を変更する際には、この設定を無視して自由に色を付けることができます。
 これらの色設定を利用すると各画面において<FONT>タグを修正しなくても、この部分を直すだけで良いので作業がとても楽になります。
#cookieの名称
$cookie_name = "listboard";
#cookieの期限(日)
$cookie_exp = "30";
#cookieのパス
$cookie_path = "/";

 cookieを保存するために最低限必要な設定です。
 名称はcookieを呼び出すときに識別するために使います。これは使用途中で変更しないでください。
 期限はcookieの保管の期限で、利用者のブラウザに保管されてから自動的に消えるまでの日数を指定します。「0」にするとcookieは保管されず、ブラウザ終了時まで有効です。
 パスはcookieの有効範囲で、指定のディレクトリ内からのcookieの呼び出しに応えます。初期設定では「/」となっていますので、CGIを設置したサーバーのすべてのファイルからcookieを参照することが可能です。
 しかし、「/」(ルートディレクトリ:各ディレクトリの出発地点にある最も上のディレクトリのこと)では1つのサーバー内に複数のCGIが使われている場合にどこからでも参照できると、同じCGIが設置されていたときに同じ名前のcookieを共有することになってしまいます。
 そこで、名称かパスを使って、cookieの利用が思わぬところで重ならないように制限をしてやる必要があるのです。
 ダイヤルアップ接続しているプロバイダ内のホームページの場合、自分のサイト内であれば自分で管理ができます。そこで、パスを自分のサイトに設定します。例えば「/~user」のように行います。URLではこの前にプロバイダのサーバー名が入りますが、これは自動的に記録されます。これで、有効範囲は自分のサイトだけに限定することができましたので、後はその中でcookie名が重複しなければ問題はありません。

●表示部の作り方

 ここでは、表示画面を作成するためのアドバイスを行います。
 画面を表示するためにいくつかのサブルーチンを用意しています。それぞれの役割はこうです。

・view_listリスト表示管理画面
・view_edit修正画面
・view_cookie登録完了画面
・view_error:エラー表示

 サブルーチンは「sub ルーチン名」でくくられた部分で、メインの処理から「&ルーチン名」という形で呼び出されて、実行します。
 修正画面とエラー表示については変更しないようにお願いします。

 画面への出力(HTMLの出力)は「print <  CGIで処理をした結果をHTML内に表示するために「$count」など変数を盛り込むことも可能です。
 そのために、出力命令(print)より前に変数の中身を決める処理を行っています。

 例えば、次の記述はview_listの中で、リスト表示と管理画面でタイトルを切り換えるためのものです。

----------
if ($kanri == 1) {$title = "$title [管理画面]";}
----------

 元々、初期設定で「$title = "ゲストブック"」としています。
 ここでは、$kanriが0の場合はリスト表示を意味し、1の場合は管理画面を表示したいということを意味しています。
 そして、出力命令の中では、この$titleを受けて、その中身を表示してくれます。

----------
print < Content-type: text/html
Set-Cookie: $cookie


<HTML>
<HEAD><TITLE>$title</TITLE></HEAD>
<BODY>
<H1>$title</H1>
<HR>

(以下省略)
----------

 $titleの部分はリスト表示の時は「ゲストブック」、管理画面の時は「ゲストブック [管理画面]」となります。

【view_list】

 ここでは、常に利用者の目に触れるリスト画面と管理画面を構成します。
 何故、1つのルーチンにしているかと言うと、メインの表示画面であるため、最も管理人が製作に時間を掛ける部分だからです。基本的に、リスト画面のデザインを作成し、管理画面ではそこに項目を追加するだけとなっています。
 管理人はリスト画面を製作すれば、管理画面は自動的に作られるという訳です。
 管理画面では、表示の許可を切り換えるラジオボタンと修正画面へのリンクが必要で、これらを挿入するために「$kanri_text」を使っていますので、この記述だけは消さないように注意が必要です。

----------
if ($kanri == 1) {$kanri_text = "<TH>表\示</TH><TH>非表\示</TH><TH>削除</TH><TH>修正</TH>";}
----------

 先ほどと同じように「$kanri」が1であれば、管理画面を呼び出しています。その時は「$kanri_text」にテーブルの一部を入れ、HTML中に差し込んでいます。
 「表示」という言葉の間に「\」が挟まっていますが、これは文字化けを防ぐための手段です。他にも時々そのような文字がありますので、文字化けが起こっていたら、表示されない文字の後ろに「\」を置いてみてください。
 日本語で、行の頭に空白を1つ空けてから文章を書くことがありますが、空白の次に半角文字(数字やアルファベット)があるとCGIがエラーとなって動かないことがありますので、注意してください。

 view_listの出力命令は4つのパートに分かれています。

 (1) <HTML>、<BODY>、<TABLE>のあるページの始まりのパート
 (2) 表示許可のレコードを挿入するパート
 (3) 表示未許可(非表示)のレコードを挿入するパート
 (4) </TABLE>、</BODY>、</HTML>のあるページの終わりのパート

 (2)と(3)の部分は繰り返し処理の中にあり、レコードを順に処理しながら、表示の場合と非表示の場合で、(2)か(3)に分岐するようになっています。

 おおざっぱにソースを表示すると以下のようになります。

(1) <HTML>
<HEAD><TITLE>$title</TITLE></HEAD>
<BODY>
<H1>$title<H1>
<HR>
<FORM>
<TABLE>
<TR><TH>No.</TH><TH>Name</TH><TH>E-mail</TH>$kanri_text</TR>
(繰り返し)foreach $line (@lines) {
 if (($status eq "ON") || ($kanri == 1)) {
(2)<TR><TH>$count</TH><TH>$_[0]</TH><TH>$_[1]</TH>$kanri_text</TR>
 } else {
(3) <TR><TH>$count</TH><TH COLSPAN=2>表示されるまでしばらくお待ち下さい</TH></TR>
 }
}
(4) </TABLE>
$kanri_text
</FORM>
</BODY>
</HTML>

 (1)の始まりのパートでは、テーブルを表示するまでに、ページのタイトルやリストの説明、入力フォームへのリンクなどを記述します。
 <TABLE>タグは自由に背景や色を付けることができます。
 次にリストの各項目の説明書きとなるヘッダーを置きますが、最後に(</TR>の前に)$kanri_textを入れるのを忘れないでください。
 この時点では$kanri_textにはヘッダー用のテーブルの一部が入っています。ヘッダーが複数行になった場合でも$kanri_textは1つでかまいません。

 先に(4)の終わりのパートを説明しましょう。
 ここは(1)に対応して各終了タグがあります。そして、</TABLE>の前に、管理画面用の記述が用意されています。
 $kanri_textには管理画面で各レコードのステータス(表示の許可・未許可・削除)を変更した場合に、記録を更新するための送信ボタン(更新ボタン)が用意されています。

 (1)と(4)の間にある繰り返し処理の中で、ソート後のレコードを順番にテーブルに追加して行きます。
 各レコードを読込、ステータスを調べて、if文で(2)か(3)に分岐しています。
 1レコードはステータスの状態により、(2)の表示パートと(3)の非表示パートのどちらかで処理されると言うわけです。

 各レコードを読み込んだ後、その内容を変数に書き写して、テーブルの中で使用できるようにしています。各変数には次のものがあります。

システム変数:$countレコード番号
$date…レコードを記録した日付
$time…レコードを記録した時刻
$host…レコードを送信した利用者のホスト情報
$status…レコードのステータス(表示の場合「ON」、非表示の場合「OFF」)
オリジナルデータ:$_[0]1つ目の送信データ
$_[1]2つ目の送信データ
$_[n]n+1番目の送信データ(個数は入力フォームの項目数と同じ)

 これらの変数は表示パート、非表示パートで使用できますが、オリジナルデータの中にはそのまま表示しても意味の分からないものもあります。
 そのため、データの変換処理が必要となります。データの変換処理の具体例は「データの変換処理方法」で解説します。

 (2)の表示パートはテーブルの一部(1行から複数行)でできています。この中にも管理画面用の$kanri_textが1つ必要になっています。この中身は、ステータスの変更ボタンと各レコードの修正画面を呼び出すリンクになっています。
 管理画面では非表示パートは使用せず、どのレコードも表示パートを使っています。

 (3)の未表示パートは、管理人が更新処理をするまでの仮表示に利用します。
 そのため、固定的な内容ですので、あまり難しくはないでしょう。場合によっては表示しないということでもかまいません。
 もし、表示しない場合は、出力部分をすべて削除してください。(タグを全部取り除くだけでもかまいません)

 さて、この表示パートと非表示パートの前に、データの変換処理が必要であることは先に述べましたが、注意することは、if文の前に変換処理を行うか、その後の表示パートまたは非表示パートの中で行うかで結果に違いが出ます。
 当然、(2)(3)のどちらでも変換後のデータを表示したい場合は分岐の前に変換処理をしなければなりません。

【view_edit】

 管理画面から呼び出されて、レコードの修正を行うための画面を表示します。
 各レコードを保存形式そのままに表示します。

【view_cookie】

 登録完了後に表示される画面です。
 これを表示した時点でcookieに利用者の情報(カウント)を保存しています。

 出力部分の<HTML>〜</HTML>の中は自由に変更してください。
 <HTML>より前の部分は絶対に変更しないでください。空の改行も重要な意味を持っています。

【view_error】

 処理中に利用者または管理人に対して処理が継続できないことを告げるための画面です。
 ページの下段に処理モードとエラーの内容に関する情報が表示されるようになっています。


●データの変換処理方法

 データの内容や見せ方によってレコード内のデータを加工する必要があります。
 ここでは具体的な目的別にデータ変換のためのルーチンを紹介します。

 全般的な注意点は、変換が必要な場合と必要でない場合を判別して、それぞれに対応できるようにすることです。また、繰り返し処理を行うパートの中にあるので、前回の処理内容が残らないようにしなければなりません。

 各例では、オリジナルデータの$_[n](n+1番目のデータ)を処理するように記述していますので、適時「n」の部分をレコードに合わせて利用してください。

 変数に文字列を入れる場合、「"」を使って文字列全体を挟みます。タグをその中に書く場合、タグ内で使用する「"」は「'」に置き換えなければなりません。
 そうしなければ、「"」が文字列の終わりを意味するのか、文字列の一部なのか判別できないからです。また「\"」としても文字列として扱われます。

 変換処理を通すということは、処理前の$_[n]と処理後の$_[n]では中身が異なっています。
 変換処理の中で、(「=」の右側で)$_[n]を使いながら、これを同じ$_[n](「=」の左側)に戻しているのはそのためです。次の簡単な変換式を見てください。
 $_[n] = "A";
 $_[n] = "$_[n]B";
 これで最後の$_[n]には"AB"という文字列が入ります。「=」は左右が等しいと考えるのではなく、右の文字列を左に入れる(入れ直す)という記号と理解してください。

【ホームページのURL】

 データの内容が空の場合とそうでない場合に2つのパターンを切り換えるようにします。
 下記の例では「http://」はデータに含まれていることが前提です。

---------- if ($_[n] eq "") {$_[n] = "Home Page";} else {$_[n] = "<A HREF='$_[n]'>Home Page</A>";} ----------  もし、「http://」がデータに含まれていない場合は、次のようにします。

---------- if ($_[n] eq "") {$_[n] = "Home Page";} else {$_[n] = "<A HREF='http://$_[n]'>Home Page</A>";} ----------  また、ホームページへのリンクの部分は<IMG>タグに置き換えることも可能です。
 下記の例ではリンクのある場合とない場合でアイコンを違うものにしています。

---------- if ($_[n] eq "") {$_[n] = "<IMG SRC='non.gif'>";} else {$_[n] = "<A HREF='http://$_[n]'><IMG SRC='hp.gif'></A>";} ----------

【メールアドレス】

 やり方はホームページの時と同じです。データの内容が空の場合とそうでない場合があります。

---------- if ($_[n] eq "") {$_[n] = "e-mail";} else {$_[n] = "<A HREF='mailto:$_[n]'>e-mail</A>";} ----------

【チェックボックス】

 入力フォームにチェックボックスを使用した場合、1つのデータ内に複数のデータをつなげた文字列として記録しています。
 例えば、利用者の使用機器を尋ねる時、4つの選択肢を与えても回答が0個の場合から4個全部の場合、またその組み合わせも幾通りかでてきます。
 フォームの受信時はそれらを単純に「|」でつないで保存しています。

 まずは、複数あるデータを改行して表示する場合です。
 ただ単純に「|」を「<BR>」に置き換えているだけです。
 表示例では$_[n]に「Mac|UNIX」の文字列が入っていた場合を想定しています。

---------- $_[n] =~ s/\|/<BR>/g; ---------- 記述例:<TD>$_[n]</TD> 表示例:<TD>Mac<BR>UNIX</TD>  次に、データを切り分けて取り出す方法を紹介します。
 データがあるかないか、結果を1つづつ変数に取り分けていますので、表示のときには、取り分けた後の変数($mac,$win,$unix,$etc)を使います。

---------- if ($_[n] =~ m/Mac/) {$mac = "○";} else {$mac = "×";} if ($_[n] =~ m/Win/) {$win = "○";} else {$win = "×";} if ($_[n] =~ m/UNIX/) {$unix = "○";} else {$unix = "×";} if ($_[n] =~ m/etc/) {$etc = "○";} else {$etc = "×";} ---------- 記述例:<TD>$mac</TD><TD>$win</TD><TD>$unix</TD><TD>$etc</TD> 表示例:<TD>○</TD><TD>×</TD><TD>○</TD><TD>×</TD>

●更新履歴

20010319(v1.0)・・・第1版完成


●著作権の表示

 このプログラムは秀麗が著作権を所有しています。
 http://www.shurey.com/ にて最新版を公開します。

 2次配布は認めませんが、各自で自由に改変してご利用下さい。
 CGIの性質上、必要な改変もありますが、それによって正常な動作ができなくなる恐れもあります。使用者は各人の責任において使用しなければなりません。
 このプログラムの使用によって、いかなる損害が発生しようとも著作権者は関知いたしませんので、ご了承ください。