[HOME]   

グラデーション☆ボ〜ドの改造方法

最終更新日:2016年02月28日

グラデーション☆ボ〜ド ver.1.42の行数で解説しています。

選択項目の追加

掲示板などのCGIで表示方法などを変更するカスタマイズや改造は、HTML文法を熟知していて Perl言語を少し勉強するだけで可能となります。
しかし投稿者に記入してもらう項目を追加する改造は、それほど簡単には行きません。
掲示板CGIの概略の流れは、
  1. アクセスした方のクッキー情報取り出し
  2. 投稿フォームの表示
  3. データの受け取り
  4. ログへの保存
  5. 新たにクッキー情報を書き込み
  6. ログからのデータ取り出し
  7. 画面に表示
このようになります。
特に投稿してもらう項目を追加する場合は、ログファイルにどのように情報を収納するかを考えておかないといけません。

改造の設計

今回は、グラデーション☆ボ〜ドに投稿者のお住まい(居住地)をセレクトしていただいて表示させることにしましょう。

現在のログファイルの形式

現在は、一つの投稿に対して以下の項目を一行として保存しています。
■596行目 $new_msg = "$number<>$FORM{'resno'}<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host<>$ango<>$old<>$new<>$icon<>\n";
変数名 内容
$num 記事番号
$FORM{'resno'} レス記事の場合の親記事番号
$date 投稿日時
$name お名前
$email メールアドレス
$subj 題名
$comment コメント
$url HPのURL
$host リモートホスト名
$ango 記事削除のパスワード
$old スタートカラー
$new エンドカラー
$icon アイコンファイル名
各項目の区切りには、<>を使っていますが他の掲示板などでは、\t(タブ),(カンマ)などを使用している場合があります。
追加する項目をアイコンファイル名の後に追加する方法もありますが、今回は$host(リモートホスト名)と一緒にログファイルへ保存することにします。
他のどの部分でも可能ですが、過去ログ作成などの記述も変更しなくてもよいために$hostにしてみました。

改造方法

※セレクト項目の追加
初期設定の中(例えば @icon_nの設定の次 67行目あたり)に

@areas = ('北海道','東北','関東','甲信越','東海','北陸','近畿','中国','四国','九州','外国','地球外');
を追加しておきます。

ここは、県名を入れてもいいでしょうし、全く別なものを入れてもいいです。
例えば「あなたの正体」として

@areas = ('ひ・み・つ','寂しがり','ひねくれもの','あまのじゃく','おっちょこちょい','だめ男','泣き虫','苦労人','さすらい人','酔っ払い');

なんてのも面白いと思いますよ。(上記は、私が使ってるものの一部です)

※親記事投稿にセレクトフォームの追加
■261行目あたり
        <input type=submit value="投稿する"><input type=reset value="リセット">
  </td>
</tr>
<tr>
  <td colspan=2>
        <b>コメント</b><br>
■変更後
       <input type=submit value="投稿する"><input type=reset value="リセット">
  </td>
</tr>
<tr><td><b>居住地</b></td><td><select name=area>
EOM
&area;
print <<"EOM";
</td></tr>
<tr>
  <td colspan=2>
        <b>コメント</b><br>
 
5行追加します。 居住地のところは好きな表現に変更可能です。
また &area;は、レス記事にも使用する同じ処理ですので、後から追加するサブルーチンへの呼び出しです。

※レス記事に地域セレクト項目を追加
■450行目あたり(上記の追加をする前の行数です。以下同様)
                #print "レス<input type=text name=comment size=$subj_wid maxlength=$res_max>\n";
 
        if ($icon_mode) {
■変更後
                #print "レス<input type=text name=comment size=$subj_wid maxlength=$res_max>\n";
                print "居住地<select name=area>"; &area;
        if ($icon_mode) {
 
1行追加します。 居住地のところは好きな表現に変更可能です。

※投稿されたエリア情報を変数に格納
■729行目あたり
        $icon = $FORM{'icon'};
■変更後
        $icon = $FORM{'icon'}; $area = $FORM{'area'};

これは、投稿フォームからCGIへ受け渡されたデータを取り出すサブルーチンの

### --- フォームからのデータ処理 --- ###
sub form_decode {

の中にあります。

※ログへの書き込み(ここでは、リモートホスト情報と同じところに保存)
■595行目あたり
        # ログをフォーマット
        $new_msg = "$number<>$FORM{'resno'}<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host<>$ango<>$old<>$new<>$icon<>\n";
■変更後
        # ログをフォーマット
        $new_msg = "$number<>$FORM{'resno'}<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host\,$area<>$ango<>$old<>$new<>$icon<>\n";
 
$hostを$host\,$areaに書き換えます。
$hostの位置にリモートホスト情報とエリア情報をカンマで区切って保存します。

※クッキーからの取り出し
■1412行目あたり (sub get_cookieの中)
        $c_new   = $COOKIE{'new'};
 
                if ($FORM{'name'})      { $c_name  = $FORM{'name'}; }
■変更後
        $c_new   = $COOKIE{'new'};
        $c_area  = $COOKIE{'area'};
                if ($FORM{'area'}) { $c_area = $FORM{'area'}; }
                if ($FORM{'name'})      { $c_name  = $FORM{'name'}; }

2行追加してます。

※クッキーへの保存
■1388行目あたり(sub set_cookieの中)
        $cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd\,old\:$FORM{'old'}\,new\:$FORM{'new'}\,icon\:$icon";
■変更後
        $cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd\,old\:$FORM{'old'}\,new\:$FORM{'new'}\,icon\:$icon\,area\:$area";
        
最後に \,area\:$areaを追加

※親記事表示の場合のエリア情報の取り出し
■349行目あたり
                ($number,$k,$date,$name,$email,$subj,$comment,$url,$host,$pwd,$old,$new,$icon)
                                                        = split(/<>/,$new[$_]);
                $icon =~ s/\n$//;
■変更後
                ($number,$k,$date,$name,$email,$subj,$comment,$url,$host,$pwd,$old,$new,$icon)
                                                        = split(/<>/,$new[$_]);
                $icon =~ s/\n$//; ($host,$area) = split(/\,/,$host);

$hostには、リモートホスト情報とエリア情報をカンマで区切って保存してますので再度カンマで切り分けて取り出します。

※親記事表示(名前の横に表示)
■380行目あたり
print "<td width=10></td><td>投稿者:<font color=$link><b>$name</b></font></td>\n";
■変更後
print "<td width=10></td><td>投稿者:<font color=$link><b>$name</b></font>[$area]</td>\n";

表示させる位置によりこの改造方法は異なります。

※レス記事表示の場合のエリア情報の取り出し
■404行目あたり
                        ($rnum,$rk,$rd,$rname,$rem,$rsub,$rcom,
                                $rurl,$rho,$rp,$rold,$rnew,$ricon) = split(/<>/,$line);
                        $ricon =~ s/\n$//;
■変更後
                        ($rnum,$rk,$rd,$rname,$rem,$rsub,$rcom,
                                $rurl,$rho,$rp,$rold,$rnew,$ricon) = split(/<>/,$line);
                        $ricon =~ s/\n$//; ($rho,$rarea) = split(/\,/,$rho);

親記事と同様に $rhoに取込まれたリモートホスト情報とエリア情報を切り分けます。

※レス記事にエリア情報の表示(名前の横に表示)
■414行目あたり
        print "<font color=$rold><b>$rname</b> > ";
■変更後
        print "<font color=$rold><b>$rname</b>[$rarea] > ";

表示させる位置によりこの改造方法は異なります。

※共通項目のサブルーチンの追加
以下の行をpetitg.cgiの一番最後に追加
sub area{
                foreach (0 .. $#areas) {
                if ($c_area eq "$areas[$_]") {
                        print "<option value=\"$areas[$_]\" selected>$areas[$_]\n";
                } else {
                        print "<option value=\"$areas[$_]\">$areas[$_]\n";
                }
        }
        print "</select>\n";
}

エリアをセレクトするフォームを表示させるサブルーチンです。
親記事投稿とレス記事投稿の両方で使用するためにサブルーチン化しています。
大変な改造になりました。
掲示板CGIの項目の追加改造は簡単じゃないってわかっていただけたかと思います。
他のCGIに同様な機能があるから改造も簡単にできるのでは?とお思いの方もいるかも知れませんが、
根本的にプログラムの設計から考えないといけないものもありますので、注意しましょう。

改造後は、http://www7.big.or.jp/~falcon/rbnote/petitgarea.cgiのようになります。
download[ダウンロード:グラデーションボード 地域情報セレクト版 ] petitgarea.lzh(ver1.52s)

[HOME]   
管理人:ファルコン・タカ