1. としきのやしき正門
  2. 電算棟
  3. 板塀(掲示板)の手入れ(改造)
  4. 永続的URL対応

永続的URL対応

私自身はこの掲示板をブログ化することは全く考えておりません。
が、ブログ化するのであれば必要になる「永続的URL対応」を実験してみたら割と簡単に実現できたので実装してみることにしました。
もちろん、本当に「永続的URL」に対応するのであれば、ドメインの取得あるいはそれに類することを行う必要があります。

さて、掲示板システムでは、投稿された各発言はログファイルに記録されます。このWebForumというスクリプトの場合、設置者が定めたある一定の基準以上に古い発言は、通常のログから切り離されて、過去ログとして別のファイルで管理されます。そして、個々の発言を表示する場合、通常のログに記録された発言であれば mode=msgview というオプションをつけてリクエストを行うか、あるいは mode=allread というオプションでツリーごと一括表示する事になります。一方、過去ログにしまわれてしまった発言の場合は mode=allread によるツリー一括表示しかありませんが、過去ログである事を指定するために act=past というオプションをつけます。つまり、必要なオプションが異なるため、永続的というかURLが固定化されるのは過去ログ送りになってからなのです。
そこで、mode=allread で act=past がついていない場合、今までどおり通常のログを検索に行って、もし指定された番号の発言が見つからない場合、そのままシームレスに過去ログのほうを検索に行くようにしてみました。スクリプトの改造量としてはそれほど多くありません。

一括表示の部分ですが、オリジナルのスクリプトでは、以下のようになっています。


    # 過去ログの場合
    if ($in{'act'} eq "past") {
        # ログファイルを定義
        if ($in{'pastlog'}) {
            $count = $in{'pastlog'};
        } else {
            open(NO,"$nofile") || &error("Open Error: $nofile");
            $count = <NO>;
            close(NO);
        }
        $logfile = sprintf("%s%04d\.cgi", $pastdir,$count);
    }

    # 親記事を出力
    $x=0;
    print "<ul>\n";
    open(IN,"$logfile") || &error("Open Error: $logfile");
    $top = <IN> if ($in{'act'} ne "past");
    $flag=0;
    while (<IN>) {
    
    (中略)
    
        }
        elsif ($flag && $in{'no'} != $oya) { last; }
    }
    close(IN);
    while ($x > 0) { print "</ul>\n"; $x--; }
    print "</ul><div align='center'>\n";

    foreach (@new) {

ここを、次のように変えました。


    $flag=0;
    print "<table summary=\"ツリー\"><tr>$td_nowrap<dl><dd>\n";
    while ($flag == 0) {
        # 過去ログの場合
        if ($in{'act'} eq "past") {
            # ログファイルを定義
            if ($in{'pastlog'}) {
                $count = $in{'pastlog'};
            } else {
                open(NO,"$nofile") || &error("Open Error: $nofile");
                $count = <NO>;
                close(NO);
            }
            $logfile = sprintf("%s%04d\.cgi", $pastdir,$count);
        }
    
        # 親記事を出力
        @x=();
        $padding = "";
        $x[0] = 0;
        open(IN,"$logfile") || &error("Open Error: $logfile");
        $top = <IN> if ($in{'act'} ne "past");
        while (<IN>) {
        
        (中略)
        
            }
            elsif ($flag && $in{'no'} != $oya) { last; }
        }
        close(IN);
        if ($flag == 0){
            if ($in{'act'} ne "past") {
                $in{'act'} = "past";
            }
            if ($in{'pastlog'}) {
                $in{'pastlog'} = $in{'pastlog'} - 1;
                if ($in{'pastlog'} == 0) {
                    $flag=1;
                }
            } else {
                open(NO,"$nofile") || &error("Open Error: $nofile");
                $in{'pastlog'} = <NO>;
                close(NO);
            }
        }
    }
    print "</dl></td></tr></table>\n";

    foreach (@new) {

<ul>タグが<table>タグに変わっていたりする部分もありますが、これは本質ではなく単に見栄えの問題ですので無視してください。
これで、特に過去ログと指定しない限り、現在ログと過去ログの両方を見に行きます。これにはさらに、例えば検索エンジンのロボットなんかに現在ログのURLが記録されていた場合など、それがそのまま過去ログ送りになってもリンク切れにならないという些細なメリットもあったりなんかします。


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


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