かばの遊べるCGI ロゴ [トップ] [掲示板] [F.A.Q.] [コラム] [ひとりごと] [利用規約] [履歴]
「会議室予約」改造講座

「会議室予約」の改造で質問があった事例を紹介します。

■「会議室予約」のフロー

まずは「会議室予約」=resroom.cgiの大まかな流れを図にしてみました。私のCGIは基本的なPerl構文しか使っていないので、Perlがちょっと分かっててフローを把握すればかなりの改造が可能です。

最初に引数なしでresroom.cgiを起動すると&frameが呼ばれ、画面を左右2つのフレームに分割するHTMLを出力します。2つのフレームからまたresroom.cgiが呼ばれ、左に&calenderの出力を、右に&tableの出力を表示するのが基本動作です。
&tableは予約状況とフォーム、&calenderは当月から3ヶ月分のカレンダーを表示します。
&listRoomは部屋別の予約一覧、&listDateは日付別の予約一覧、&historyは過去のカレンダーを表示します。&readdataはファイルから情報を読んで配列に入れるサブルーチンで、&updateと&tableの2つから呼び出されます。

※&で始まる文字列はサブルーチンを意味します。サブルーチンを使うときは&xxxで呼び出し、サブルーチンの中身を書くときは sub xxx { ...... } で書きます。


■「所属」欄を消す

フォームの「所属」欄をなくすには、フォームを表示している&tableと、引数をチェックしている&updateと、クッキーの部分を修正します。&readdataは欠落した情報には空文字を返すだけですから放っておいても大丈夫です。ベースは「会議室予約」Ver.1.41です。

(1) 「所属」を記憶するクッキーを読み込まないようにする

まずは小手調べに「所属」のクッキーを読み込まないようにします。
コメント「# クッキーを読み込む」の下の、「my( $cookieposs ) = $cookies{'poss'};」と、「 print DBG "クッキーのpossは$cookieposs\n";」の行を削除します。

(2) &tableで表に「所属」を入れないようにする

サブルーチン&tableの中に、TABLEの各セルに入れるHTMLタグを$str変数の中に貯めている箇所があります。その中に「所属」を入れている記述を削除します。

$str = "$resname<BR>$resposs";

上の記述を次のようにします。2箇所あるので両方とも忘れないようにしてください。

$str = "$resname";

(3) &tableで一発キャンセル機能の引数と「所属」表示を削る

サブルーチン&tableの中のコメント「#一発キャンセル用ボタンを付ける(Ver.1.40〜)」の少し下にある「JavaScript:fastCancel( ... 」の行の「'$resposs', 」を削除します。2箇所あるので注意してください。

$str = $str. "<A onClick=\"JavaScript:fastCancel('$resname', '$resposs', $is, $ie, $ir, ";

上の記述を次のようにします。

$str = $str. "<A onClick=\"JavaScript:fastCancel('$resname', $is, $ie, $ir, ";

(4) &tableで引数チェックしているJavaScriptを修正する

サブルーチン&tableの「# ここからブラウザへブロック出力」コメントから下はブラウザに返すHTMLをprintしている部分です。この中の「function argChk」がフォーム入力をチェックしているJavaScriptです。argChkの中の「所属」への入力をチェックしている下の行を削除する必要があります。2箇所ありますから注意してください。

if ( document.form.poss.value == '' ) {
    alert( "所属を入力してください" );
    document.form.poss.focus();
    return(0);
}

(5) &tableでJavaScriptの「fastCancel」を修正する

同様に一発キャンセルで「所属」を示す記述を削除します。

function fastCancel( Name, Poss, ib, ie, ir, Key ) {
    if ( Name == '' ) {
        alert( "この予約のキャンセルには×ボタンが使えません" );
        return(0);
    }
    if ( Key == true ) {
        res = prompt( "キーを入力してください" );
        document.form.kw.value = res;
    }
    document.form.name.value = Name;
    document.form.poss.value = Poss;
    document.form.begin.selectedIndex = ib;
    document.form.end.selectedIndex = ie;
    document.form.room.selectedIndex = ir;
    document.form.act.value = 'cancel';
    document.form.submit();
}

この中から、fastCancel( ... )のカッコの中の「Poss, 」と、「document.form.poss.value = Poss;」の行を削除します。

(6) &tableで「所属」の入力欄を削除します。

サブルーチン&tableの中で、HTMLのINPUTタグで「所属」の入力欄を出力している箇所を削除します。

print "      <TH>所属</TH>\n";
print "      <TD><INPUT SIZE=8 TYPE=\"text\" NAME=\"poss\" MAXLENGTH=10 value=\"$cookieposs\"></TD>\n";

上の記述を次のようにします。THやTDタグを消していないのは、フォームの配置を崩さないためです。

print "      <TH></TH>\n";
print "      <TD></TD>\n";

(7) &updateの引数チェックを削除します。

サブルーチン&updateの中で、引数をチェックしている箇所の「所属」に関係する記述を削除します。

#act別の引数チェック
if ( $act eq 'book' ) {
    if (( $name eq '' ) and ( $poss eq '' )) {
        push( @msg0, "名前と所属を入力してください。" ); return 1;
    }
    elsif ( $name eq '' ) { push( @msg0, "名前を入力してください。" ); return 1; }
    elsif ( $poss eq '' ) { push( @msg0, "所属を入力してください。" ); return 1; }
}
else {
    if ( $kw eq '' ) {
        if (( $name eq '' ) and ( $poss eq '' )) {
            push( @msg0, "名前と所属を入力してください。" ); return 1;
        }
        elsif ( $name eq '' ) { push( @msg0, "名前を入力してください。" ); return 1; }
        elsif ( $poss eq '' ) { push( @msg0, "所属を入力してください。" ); return 1; }
    }
}

上の記述を次のようにします。

#act別の引数チェック
if ( $act eq 'book' ) {
    if ( $name eq '' ) { push( @msg0, "名前を入力してください。" ); return 1; }
}
else {
    if ( $kw eq '' ) {
        if ( $name eq '' ) { push( @msg0, "名前を入力してください。" ); return 1; }
    }
}

(8) &updateでキャンセルしている部分を修正する

サブルーチン&updateの中で予約情報をキャンセルしている箇所は、「名前」と「所属」が一致するか見ていますので、「所属」の方を削除します。

else {
    if (( $name eq $resname ) and ( $poss eq $resposs )) { $ref[$y]->[$x] = '' }
    else { push( @msg0, "名前と所属の両方が一致しないとキャンセルできません" ) }
}

上の記述を次のようにします。

else {
    if ( $name eq $resname ) { $ref[$y]->[$x] = '' }
    else { push( @msg0, "名前が一致しないとキャンセルできません" ) }
}

(9) &updateで「所属」のクッキーを発行しないようにする

仕上げに不要になった「所属」のクッキーを発行しないように、サブルーチン&updateの最後の方を修正します。

if ( $poss ne '' ) {
    $cookieposs = $poss; $encposs = $cookieposs;
    $encposs =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
    print "Set-Cookie: poss=$encposs; expires=$cookiedate;\n";
}

if ( $dbg ) {
    print DBG "クッキーの期限は$cookiedate\n";
    print DBG "クッキーのrmnameは$cookiename($encname)\n";
    print DBG "クッキーのpossは$cookieposs($encposs)\n";
}

上の記述を次のようにします。

if ( $dbg ) {
    print DBG "クッキーの期限は$cookiedate\n";
    print DBG "クッキーのrmnameは$cookiename($encname)\n";
}

■祭日を区別する

「会議室予約」を作ったのは祭日を区別するサブルーチン&getJholidayを作る前だったので祭日対応してません(Ver.1.41現在)。次回バージョンアップでカレンダー表示部分を全面見直しして、ついでに祭日対応するつもりだったんですが、グズグズしているうちに問い合わせが何件か来てしまいました。この際、改造講座のお題にします。

カレンダーを出力するサブルーチンは&calenderと&historyの2つなので、まずその2つを修正します。Ver.1.41では曜日を返すだけのサブルーチン&getweekを使っていますが、このうちカレンダーの色分けをしている記述の中は&getJholidayに置き換えます。
予約状況表の上の部分に何の日かも表示させたければ&tableも修正します。

(1) &calenderのローカル変数宣言を追加する

サブルーチン&calenderの冒頭部分でローカル変数を宣言しています。この部分に新規の変数$holyを追加します。下は追加した例です。

my( $lyear, $lmonth, $lday, $wday, $holy, $color );

my( ); の中であればどこでもOKです。カンマも忘れずに。

(2) &calenderの当月、翌月、再来月の3箇所を修正する

$wday = &getweek( $lyear, $lmonth, $lday );
if ( $wday == 0 ) { $color = $sun }
elsif ( $wday == 6 ) { $color = $sat }
else { $color = $schbg }

上の記述を下のように修正します。3箇所あるので注意してください。

( $wday, $holy ) = &getJholiday( $lyear, $lmonth, $lday );
if ( $holy ) { $color = $sun }
elsif ( $wday == 0 ) { $color = $sun }
elsif ( $wday == 6 ) { $color = $sat }
else { $color = $schbg }

(3) &historyにローカル変数宣言を追加する

(1)と同様にサブルーチン&historyでも$holyを追加します。

my( $lyear, $lmonth, $lday, $wday, $holy, $color );

(4) &historyの先々月、先月、引数で渡された月の3箇所を修正する

$wday = &getweek( $lyear, $lmonth, $lday );
if ( $wday == 0 ) { $color = $sun }
elsif ( $wday == 6 ) { $color = $sat }
else { $color = $schbg }

上の記述を(2)と同様に修正します。

( $wday, $holy ) = &getJholiday( $lyear, $lmonth, $lday );
if ( $holy ) { $color = $sun }
elsif ( $wday == 0 ) { $color = $sun }
elsif ( $wday == 6 ) { $color = $sat }
else { $color = $schbg }

(5) &tableにローカル変数宣言を追加する

サブルーチン&tableの冒頭でローカル変数を定義している箇所に$holyと$holidayを追加します。下は追加した例です。

if ($dbg) { print DBG "---サブルーチン:table---\n" }
my( $start, $temp, $span, $x, $y, $lyear, $lmonth, $lday, $lwday, $c, $i );
...省略...
my( $holy, $holiday );

(6) &tableで曜日を調べている部分を修正する

$lwday = &getweek( $lyear, $lmonth, $lday );

上の記述を下のように修正します。

( $lwday, $holy, $holiday ) = &getJholiday( $lyear, $lmonth, $lday );

(7) &tableでHTMLに日付をprintしている部分を修正する

print "<H2>$lyear年$lmonth月$lday日($wdays[$lwday])</H2>\n";

上の記述を下のように修正します。

if ( $holy ) {
    print "<H2>$lyear年$lmonth月$lday日($wdays[$lwday])「$holiday」</H2>\n";
}
else {
    print "<H2>$lyear年$lmonth月$lday日($wdays[$lwday])</H2>\n";
}

[トップ] [掲示板] [F.A.Q.] [コラム] [ひとりごと] [利用規約] [履歴]