#! /usr/local/bin/perl # # id=sanka2.cgi # # 出欠表に出欠を入力する2 # # update. 02.8.30 # 参加者が自分の名前を登録するパターンです # 2重登録チェック付き # 隠し機能:すべて未確認で更新をクリックするとファイルをクリアする # メンバーが増減したら@meiboを修正しファイルをクリアすることにより出欠表は再作成される # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # データファイル $file = "/dialup/chichibu/cgi-bin/sanka2.dat"; # ファイルレイアウト・・・名前、出欠、合流地点、備考 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/sanka2.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; # 最大参加者数(この値まで画面から入力できるようにする) $max=5; # 出欠配列と色(枠に色がつく、16進でも良い) $sk[1]="未確認"; $iro[1]="white"; $sk[2]="参加"; $iro[2]="violetred"; $sk[3]="欠席"; $iro[3]="violet"; $sk[4]="合流"; $iro[4]="mazenda"; $sk[5]="検討中"; $iro[5]="yellow"; # # ファイルを読む # if (!open(DATA,"$file")) { &error(0); } @data = ; close(DATA); $cnt=@data; # もしファイルにデータがなかったら初期化する if ($cnt == 0) { &syokika; } ######################## #            # # タグの無効化サブルーチン  # #            # ######################## sub tagck { $ckdt =~ s//>/ig; $ckdt =~ s///ig; } ######################## #            # # 項目分解ルーチン   # #            # ######################## sub bunkai { ($dt0,$dt1,$dt2,$dt3) = split(/\t/,$bundt); } # end of bunkai ######################## #            # # ファイルクリアルーチン  # #            # ######################## # ファイル登録 sub fileclr { if (!open(DATA,">$file")) { &error(0); } flock(DATA,2); print DATA ""; flock(DATA,8); close (DATA); } # fileclr #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 全体の流れを決定する(actionやpwdはフォーム入力されたデータを格納する名前) # action=check --> フォーム入力データのチェック処理へ # その他 --> フォーム入力画面へ if ($in{'action'} eq 'update') { &html2; } else { &html1; } ############################################ #      # # テーブルデータ表示画面出力ルーチン # # # ############################################ sub html1 { # HTML出力 print "Content-type: text/html\n\n"; print < 出欠表

出欠表

EOM print '
' . "\n"; print '' . "\n"; print "\n"; print "\n"; # $aは変数に付ける連番 $a=0; # 出欠数 $sankasu=0; $fusankasu=0; $kentosu=0; # 配列が終わるまで繰り返す foreach (@data) { $bundt=$_; &bunkai; $a++; print "\n"; # 名前は固定とする print ''."\n"; print ''."\n"; #出欠数 if ($dt1==2 || $dt1==4) {$sankasu++ } elsif ($dt1==3) {$fusankasu++ } elsif ($dt1==5) {$kentosu++ } # 合流地点 print ''."\n"; # 備考 print ''."\n"; } # end of foreach print '
名前出欠合流地点備考
'."\n"; print ''. "\n"; print '

'; #参加者合計 print "\n"; print "\n"; print "\n"; print ''."\n"; print ''."\n"; print ''."\n"; $total=$sankasu+$fusankasu+$kentosu; print ''."\n"; print '
参加(合流含む)欠席検討中合計
'.$sankasu.''.$fusankasu.''.$kentosu.''.$total.'

'; print '
'; print '' . "\n"; print '   '; print '' . "\n"; print '   '; print '' . "\n"; # 最初の画面に戻る print '
' . "\n"; print '' . "\n"; print '
' . "\n"; print '
'; print "\n\n"; } ### sub html1 end ### ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub html2 { # 名前の2重登録チェック $n=1; until ($n > $max) { #名前を連想配列の添え字にして加算すれば同じ名前が出ると2になる $value=$in{'na'.$n.''}; if (length($value) > 0) { $name{$value}++; if ($name{$value} > 1) { &error(1) } } #名前を入れなくて出欠を入れたものはエラーにする if (length($value) == 0 && $in{'a'.$n.''} > 1) { &error(2) } $n++; } # until # 隠し機能:すべて未確認ならばファイルをクリアする # メンバーが増減したらファイルをクリアすることにより出欠表は再作成される $n=1; $flg=""; until ($n > $max) { $value=$in{'a'.$n.''}; # 未確認以外があればクリアしない if ($value != 1) { $flg="no" } $n++; } # until # 1がなければすべて未確認なのでクリアできる if ($flg eq "") { &fileclr } else { &update } # 更新後、再読み込みする print "Location: $reload" . '?' . "\n\n"; exit; } #html2 ############################################# # # # チェックエラー表示画面ルーチン      # # # ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; } elsif ($error eq "1") { $error_msg = '同じ名前があります、どちらか変更して下さい。'; } elsif ($error eq "2") { $error_msg = '出欠を設定したものに対して名前がありません。名前を登録するか出欠を未確認にすること'; } else { $error_msg = 'なんらかのエラーが発生しました。'; } print "Content-type: text/html\n\n"; print '出欠表' . "\n"; print '' . "\n"; print '

出欠表の入力で下記のエラーが発生しました

' . "\n"; print "$error_msg\n"; print '
'; # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '
'; print '

' . "\n"; exit; } # # テーブルを名前、出欠=1、合流地点で初期化する # sub syokika { $n=1; until ($n > $max) { $value = "\t1\t\t\n"; push(@data,$value); $n++; } } ########################################## # # # ファイル更新処理           # # # ########################################## sub update { # 入力データを\tでつないで1行データにする $n=1; $value=""; @data=(); until ($n > $max) { # タグの無効化 #名前 $ckdt=$in{'na'.$n.''}; &tagck; $in{'na'.$n.''}=$ckdt; #合流場所 $ckdt=$in{'b'.$n.''}; &tagck; $in{'b'.$n.''}=$ckdt; #備考 $ckdt=$in{'c'.$n.''}; &tagck; $in{'c'.$n.''}=$ckdt; # perlでは変数に数字を付けると配列のように利用できる $value=$in{'na'.$n.''}."\t".$in{'a'.$n.''}."\t".$in{'b'.$n.''}."\t".$in{'c'.$n.''}; $value =~ s/\n//g; $value = "$value\n"; push(@data,$value); $n++; } # until # ファイル登録 if (!open(DATA,">$file")) { &error(0); } flock(DATA,2); print DATA @data; flock(DATA,8); close (DATA); } ### sub update end ### ################### end of script ################