簡易BBS

MobaSiFを使って、書き込みと閲覧をできるBBSのできそこないを作ってみた。公開されているサンプルコードを参考にした。

作成手順をメモ。

BBSのためのデータベースとテーブルを作成

create database hato_bbs;
use hato_bbs
create table bbs (id int(11) auto_increment, name varchar(255), comment text, primary key(`id`));

$MOBA_CONF/main.confに設定

our ( $DB_BBS_W, $DB_BBS_R, $DB_BBS_BAK ) = ( 'BBS_W', 'BBS_R', 'BBS_BAK' );

%DA::CONF = (
'BBS_W' => {
      HOST => 'localhost', DB => 'hato_bbs',
      USER => $_::MY_USER_W, PASS => $_::MY_PASS_W, TX => 1, RELEASE => 1},
'BBS_R' => {
      HOST => 'localhost', DB => 'hato_bbs',
      USER => $_::MY_USER_R, PASS => $_::MY_PASS_R, TX => 0, RELEASE => 1},
)

ここに設定したものは、DA.pmで参照される。

BBS閲覧プログラム作成、

$MOBA_HOME/pm/bbs/bbs.pm
package bbs::bbs;

use strict;
use MobaConf;
use HTMLTemplate;
use Common;
use Request;
use Response;
use DA;
use Kcode;
use Jcode;

sub pageMain {
    my $func = shift;
    my $rhData = {};

    my $dbh = DA::getHandle($_::DB_BBS_R);
    my $sth = $dbh->prepare("select * from bbs order by id desc");
    $sth->execute();

    my $num = $sth->rows();

    my @rows;
    while (my $h = $sth->fetchrow_hashref) {
        $h->{name} = jcode($h->{name},'utf8')->sjis;
        $h->{comment} = jcode($h->{comment},'utf8')->sjis;
        $h->{number} = $num; $num--;
        push @rows, $h;
    }
    $sth->finish;
    $rhData->{rows} = \@rows;

    my $html = HTMLTemplate::insert('bbs/bbs', $rhData);
    Response::output(\$html);
}

1;
$MOBA_HOME/template/_system/bbs/bbs.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
<meta http-equiv="Cache-Control" content="no-cache">
<title>掲示板テスト</title>
<link rel="stylesheet" type="text/css" href="/css/bbs.css">
</head>
<body>

<div class="regist">
<form action="_regist" method="POST">
名前:<br>
<input type="text" name="name" size="15"><br>
コメント:<br>
<textarea name="comment" rows="3" cols="20"></textarea>
<br>
<input type="submit" value="送信">
</form>
</div>

<hr>
<div class="comment_list">
$ loop (rows) { $
<div>
<p>
$=h:number$.名前:$=h:name$<br>
$=h:comment$
</p>
</div>
<hr>
$ } $
</div>

</body>
</html>

$MOBA_HOME/conf/pages.confで設定する。

our %PAGE = (

'bbs' => [0,0,0, 'bbs::bbs', 'pageMain'],

formタグから呼ばれる書き込みプログラムを作成

package bbs::regist;

use strict;
use MobaConf;
use HTMLTemplate;
use Common;
use Request;
use Response;
use DA;
use Kcode;
use Jcode;

sub regist {
    my $func = shift;
    my $rhData = Common::cloneHash($_::F, '^[a-z]');

    $rhData->{name} = jcode($rhData->{name},'sjis')->utf8;
    $rhData->{comment} = jcode($rhData->{comment},'sjis')->utf8;

    my $dbh = DA::getHandle($_::DB_BBS_W);
    my $sth = $dbh->prepare("insert into bbs (name,comment) values (?,?)");
    $sth->execute($rhData->{name}, $rhData->{comment});
    $sth->finish;

    Response::redirect("http://$ENV{SERVER_NAME}/_bbs");
}

1;

$MOBA_HOME/conf/pages.confに設定。

'regist' => [0,0,0, 'bbs::regist', 'regist' ] ,
'bbs' => [0,0,0, 'bbs::bbs', 'pageMain'],

テンプレートのコンパイルと再起動

rootになってテンプレートをコンパイルする。
$MOBA_HOME/script/tool/compile_template
あとapacheの再起動。これはプログラムの変更を反映するため?

アクセス

http://*******/_bbs」に接続。
書き込みフォームが表示されているので、名前とコメントを書き込んで送信すれば保存される。保存されたメッセージは、書き込みフォームの下に表示されるようになる。

終わりに

とりあえずMobaSiFの開発の流れを見てみた。ページを作成する際、色々なディレクトリの色々なファイルを変更して、コンパイルや再起動をするので、最初は戸惑う。でも、開発を続けているうちに慣れていきそう。