1. としきのやしき正門
  2. 電算棟
  3. 板塀(掲示板)の手入れ(改造)
  4. スレッド表示新設

スレッド表示新設

さて、別ページでもちょっとだけ触れているスレッド表示です。
ここで使っているWebForumというスクリプトは、ツリー形式表示が特徴です。私が自分のサイトに掲示板を導入する際、約40のスクリプトを試しましたが、ツリー形式であることが選択条件の1つでした。
ツリー表示には、記事一覧を見たときに、すべての発言のつながりがわかるというメリットがあります。ただ、情報量が多くなりすぎて、どんな内容についての記事が載っているのかということがつかみにくくなります。そこで、各ツリーの親記事というかルートの記事のみをリストアップして表示する画面を作ってみました。以下のような感じになりました。


#---------------------------------------
#  リストスレッド表示
#---------------------------------------
sub ListThreadOpen {
    local($no,$reno,$lx,$sub,$email,$url,$name,$dat,$msg,$t,$h,$pw,$w,$oya,$sml,$child,$i,$commentcount,$last_t);

    # 時間取得
    $time = time;

    # 表題表示
    print "<br>$div_center $threadlist \n";
    print "<tr><th align=left abbr=\"記事\">  タイトル</th><th abbr=\"発言者\">名前</th><th abbr=\"発言\">日付</th><th abbr=\"記事\">コメント数</th><th abbr=\"記事\">最終コメント日</th></tr>\n";

    $i=0;
    $commentcount=0;
    $last_t=0;
    $lastdat="";
    open(IN,"$logfile") || &error("Open Error: $logfile");
    $top = <IN>;
    while (<IN>) {
        ($no,$reno,$lx,$sub,$email,$url,$name,$dat,$msg,$t,$h,$pw,$w,$oya,$sml,$child) = split(/<>/);

        # ページ送り
        if ($reno == 0) { $i++; }
        if ($i < $page + 1) { next; }
        if ($i > $page + $p_tree) { next; }

        # 記事タイトル長調整
        $sub = &cut_subject($sub);

        # 削除記事
        if ($pw eq 'DEL') {
            if ($lx == 0) {
                print "<tr><td><a href=\"$script?mode=allread&amp;no=$no&amp;page=$page&amp;list=thread\">$treehead</a>";
                print "$no\.$sub</td><td> </td><td> $dat </td><td> </td><td> </td></tr>\n";
            }
        # 親記事
        } elsif ($lx == 0) {
            # 所定時間以内の投稿は[NEWマーク]表示
            if (($time - $last_t > $new_time * 3600)&&
                ($time - $top_t  > $new_time * 3600))
                {$newsign="";}
            else 
                { $newsign = $newmark; }

            # タイトル表示
            if ($i != $page + 1) { print "$td_right_nowrap $commentcount</td>$td_nowrap $lastdat $newsign</td></tr>"; }
            print "<tr>$td_nowrap<a href=\"$script?mode=allread&amp;no=$no&amp;page=$page\">$treehead</a> ";
            print "<a href=\"$script?mode=msgview&amp;no=$no&amp;reno=$reno&amp;oya=$oya&amp;page=$page&amp;list=thread\">$no\.$sub</a></td>$td_nowrap<strong>$name </strong> </td>$td_nowrap $dat</td>\n";
            $commentcount=0;
            $top_t=$t;
            $last_t=0;
            $lastdat="";
        } else {
            # 子記事
            $commentcount++;
            if ($last_t < $t) {
                $last_t = $t;
                $lastdat = $dat;
            }
        }
    }
    close(IN);
    print "$td_right_nowrap $commentcount</td>$td_nowrap $lastdat $newsign</td></tr>";
    print "</table></div>\n";
}

コメントを読んでいただければ大体わかると思いますが、ログをべたに全部読み込み、親記事のときだけそのタイトルを表示しています。そして、その記事に対する子記事の続く間は子記事のカウントを続けます。次の親記事が出てきたときに、それまでの子記事の合計を表示してから、新しい親記事のタイトルを表示し、再び新しく子記事のカウントを行います。ログの終端でループから抜けますが、その際に最後の親記事についている子記事の数を表示して終了となります。
スレッド表示の本体はこれだけですが、この部分を呼び出すメインルーチンのほうも手を加えなければなりません。
まず、タイトル直下、リストの表示方法の切り替えに関する部分です。list_view のサブルーチンの中に、以下のような部分があるかと思います。


    if ($in{'list'} ne "new") {
        print "[<a href=\"$script?list=new\">新規順表\示</a>]\n";
    } else {
        print "[<a href=\"$script?list=tree\">ツリー表\示</a>]\n";
    }

ここを以下のように直しました。


    if ($in{'list'} ne "new") {
        print "[<a href=\"$script?list=new\">新規順表\示</a>]\n";
    }
    if ($in{'list'} ne "thread") {
        print "[<a href=\"$script?list=thread\">スレッド表\示</a>]\n";
    }
    if ($in{'list'} ne "tree") {
        print "[<a href=\"$script?list=tree\">ツリー表\示</a>]\n";
    }

もう1箇所、かなり細かいところですが、


    if ($in{'list'} eq "new") {
        print "<li>以下は新規投稿順のリスト表\示です。</li><br>\n";
    } else {
        print "<li>ツリー先頭部の $treehead をクリックすると関連記事を一括表\示します。</li><br>\n";
    }

ここもこんな風に直しました。


    if ($in{'list'} eq "new") {
        print "<li>以下は新規投稿順のリスト表\示です。</li>\n";
        print "<li>$treehead をクリックすると関連記事を一括表\示します。</li>\n";
    } elsif ($in{'list'} eq "thread") {
        print "<li>行頭部の $treehead をクリックすると関連記事を一括表\示します。</li>\n";
    } else {
        print "<li>ツリー先頭部の $treehead をクリックすると関連記事を一括表\示します。</li>\n";
    }

あと1ヶ所、実際に呼び出すところも付け加えてやらなければなりません。


    # ログを開く
    if ($in{'list'} eq "new") { &ListNewOpen; }
    else { &ListTreeOpen; }

こちらは以下のとおり。


    # ログを開く
    if ($in{'list'} eq "new") { &ListNewOpen; }
    elsif ($in{'list'} eq "thread") { &ListThreadOpen; }
    else { &ListTreeOpen; }

こじんまりとまとまって、私は結構気に入っています。現在、一部のテキストブラウザからアクセスする場合のデフォルトに設定していますが、将来、i-mode対応にした場合も、これをデフォルトにしようと思っております。



板塀(掲示板)の手入れ(改造)
電算棟
やしきの間取り


Copyright © 2006-2007,2010 としき
このページの情報及び著作権は「としき」に帰属します。
Toshiki / toshiki @ jcom.zaq.ne.jp