次は前回の書き込みプログラムで保存されたデータを読み出して、掲示板形式に表示する処理です。前回同様にフロー図に従ったソースを書いていくだけとなります。
[表示機能用プログラム]
プログラム呼び出し
↓
ログファイルの読み込み
↓
HTMLの生成(表示)(HTML)
|
※ちなみに、、、
このページで利用するプログラムのソース(テキスト)全てはこちらからダウンロードできます。
また、最終的なプログラムのサンプルはこちらです。(別窓)
また、ここでは前回同様に
- 書き込み用Perlのファイル名を「sbbs_write.cgi」
- 読み込み用Perlのファイル名を「sbbs_read.cgi」
- フォーム用HTMLのファイル名を「sbbs.html」
として解説していきます。
保存されているデータを読み込んでHTML形式に表示するだけなので、書き込みの場合と違いかなりシンプルな流れとなります。基本的には下のソースが全てです。(エラー用のサブルーチンを除きます。)
01: #!/usr/local/bin/perl
02:
03: # ヘッダーの出力
04: print <<"HEADER";
05: Content-Type: text/html
06:
07: <html><head><title>シンプルBBS記事一覧</title></head>
08: <body>
09: シンプルBBS記事一覧(<a href="sbbs.html">書き込みはこちらから</a>)
00: <hr>
11: <br>
12: HEADER
13:
14: # 記事の出力
15: # logfile.datというファイルから現在のカウント数を読み込む
16: open (IN, "logfile.dat") || &error("読み込みエラーが発生しました。");
17: @logdata=<IN>;
18: close(IN);
19:
20: foreach (@logdata) {
21: # 各行のデータをカンマで区切ってそれぞれの変数へ
22: ($no,$u_name,$subject,$comment,$date) = split(/\,/);
23: # ヒアドキュメントによる各記事の生成
24: print <<"HTML";
25: <table border="0" bgcolor="#ffffff"
style="font-size:13px;background-color:#ffffff;" width="80%">
26: <tr>
27: <td bgcolor="#cccccc">
28: <b>$subject</b>
29: </td>
30: </tr>
31: <tr>
32: <td align="right">
33: $u_name<span style="font-size:10px;">($date)[No.$no]</span>
34: </td>
35: </tr>
36: <tr>
37: <td>
38: $comment
39: </td>
40: </tr>
41: </table>
42: HTML
43: }
44:
45: # フッターの表示
46: print <<"FOOTER";
47: <hr>
48: </body>
49: </html>
50: FOOTER
51: exit;
|
基本的には読み出したログファイルのデータをカンマで切り離して、コメントごとにHTMLとして表示させています(22行目を参照)。それを「foreach()」でデータがなくなるまで続けて表示しています。
20: foreach (@logdata) {
21: # 各行のデータをカンマで区切ってそれぞれの変数へ
22: ($no,$u_name,$subject,$comment,$date) = split(/\,/);
・・・(各コメントの表示処理)
43: }
|
ここでは、書き込み用のHTMLフォーム、書き込み用、読み込み用と3つの別々のファイルで掲示板を作成しましたが、あちこちで配られている掲示板プログラムでは一つのソースとなっていることが多いです。
【今回作ったファイル】(サンプルはこちらから)
- 書き込み用Perl「sbbs_write.cgi」「ソース」
- 表示用Perl「sbbs_read.cgi」「ソース」
- フォーム用HTML「sbbs.html」
どちらがいいか?と疑問に思われるかも知れませんが、どちらでもOKだと思います。好みの問題でしょう。
ただ、プログラムの効率化とか生産性とかを考えると(つまり、プログラムを作る側の人間から考えると)、プログラムは機能ごとにそれぞれ分かれているほうがいいかな、、、と感じてます。
では、なぜフリーで配布されているPerlなどのプログラムは一つなのか?ということですが、利用する人の設置のしやすさを考慮しているんだと思います。設置することをインストールと言うかは「?」ですが、設置するプログラムの数が少ない方が設置する方は楽に決まってます。とくに初心者ではじめて掲示板プログラムを設置するなんていう方にとっては、サイトにFTPでソースを一本アップロードしてパーミッションを変更するだけ、というのは手軽ですよね。
ということで、これら3つのファイルを一つのPerlスクリプトとしてまとめる方法を少しだけ考えてみたいと思います。
■機能をどう分けるか
フォームの表示、書込み処理、表示処理という3つの機能を一つのファイルで実装するわけですから、プログラムが呼び出されたときに、「どの機能を使う目的で呼び出されているか」ということをプログラムに教える必要があります。
そこで、先ほど作成した3つの処理のそれぞれをサブルーチン化し、機能を呼び出す「スイッチ」のようなものがオンになったときにそのサブルーチンの処理をするような仕組みに変更することになります。
具体的には6行目〜8行目でそれぞれの機能に応じてサブルーチンの処理を実行するようにしています。
01: #!/usr/local/bin/perl
02:
03: require 'jcode.pl';
04: &read_data;
05: # 機能の振分け
06: if ( $FORM{func} eq 'write' ){ &write; }
07: elsif ( $FORM{func} eq 'form' ){ &form; }
08: else {&read;}
09: exit;
sub write(){ 書込み処理のサブルーチン}
sub form(){ フォームHTML表示用サブルーチン}
sub read(){ 記事表示処理のサブルーチン}
|
プログラムを呼び出すときには、HTMLのフォームの中で
<input type="hidden" name="func" value="******">
※「******」の場所に、機能に応じて「write」「form」等の機能を入れてください。
|
のように、どのサブルーチンの処理を行うかの指定をする必要があります。
個人的にはどのように実装してもメンテナンスさえしやすければOKなのかと思います。
また、この掲示板は「プログラムダウンロード」のページで「シンプルBBS」として公開していこうと思います。この実験で各機能の実験をするたびにバージョンアップをしていこうと思います。
ということで、掲示板作成については以上ですが、次回は「発展型の掲示板(応用編ですね(^^;)」で表示プログラムのページ対応をする予定です。
(2004/3/24 by あいまい)
|