#! /usr/local/bin/perl # # 日別スケジュール(右下) # # id=yotei_u.cgi # # update. 99.8.19 # # 文字コード変換カット # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; $file = "/dialup/chichibu/cgi-bin/schedule.dat"; $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/yotei_u.cgi'; # 最大登録件数を超えたら古い日付データから削除する $max = 20; # 月末日 %mmend=(1,31,2,28,3,31,4,30,5,31,6,30,7,31,8,31,9,30,10,31,11,30,12,31); #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 今日 ($t1,$t2,$t3,$sysdd,$sysmm,$sysyy,$t7) = localtime; # 月補正 $sysmm++; # 年を4桁にする if ($sysyy < 70) { $sysyy = $sysyy + 2000;} else { $sysyy = $sysyy + 1900;} # 全体の流れを決定する(actionやpwdはフォーム入力されたデータを格納する名前) # action=check --> フォーム入力データのチェック処理へ # その他 --> フォーム入力画面へ if ($in{'action'} eq 'check') { ✓ } elsif ($in{'action'} eq 'check2') { &check2; } elsif ($in{'action'} eq 'check3') { &check3; } elsif ($in{'action'} eq 'siteibi') { &siteibi; } elsif ($in{'action'} eq 'next') { &next; } elsif ($in{'action'} eq 'back') { &back; } elsif ($in{'action'} eq 'return') { &return; } else { &first; } ###################################### # # # ファイルから登録データを読む # # # ###################################### sub fileread { if (!open(READ,"$file")) { &error(0); } @lines = ; close(READ); %memo = (); # 連想配列を空にする # 日付とスケジュール内容に分ける foreach $line(@lines) { ($date,$data)=split(/\,/,$line); if ($data ne "") { $memo{$date} = $data; } } # end } # end of fileread #################################### # # # フォーム入力画面出力ルーチン # # # #################################### sub first { # カレンダーから呼ばれた場合かチェックする if ($in{'dd'} > 0) { $yy=$in{'yy'}; $mm=$in{'mm'}; $dd=$in{'dd'}; } else { # 最初は今日の日付のスケジュールを表示する $yy=$sysyy; $mm=$sysmm; $dd=$sysdd; } # end of if # 表示ルーチンへ &display; } # end of first ######################################## # # # スケジュールデータ表示ルーチン # # # ######################################## sub display { # ファイルから登録データを読む &fileread; # 日付に何も入っていない場合 if ($yy == 0) { $yy=$sysyy; $mm=$sysmm; $dd=$sysdd; } # 2桁にする $mm2 = sprintf("%.2d",$mm); $dd2 = sprintf("%.2d",$dd); # 年月日の形にする $ymd=$yy.$mm2.$dd2; # CGIで出力されたデータをHTMLとして認識させるヘッダの出力 print "Content-type: text/html\n\n"; print 'スケジュール登録' . "\n"; print ''."\n"; print "

   $yy年 $mm月 $dd日のスケジュール

"; print '
' . "\n"; if ($memo{$ymd} eq "") { print 'この日の登録はありません' . "\n"; } else { # 改行して表示させるため @disp = split(/\0/,$memo{$ymd}); foreach (@disp) { if (length($_) > 1) { print $_."\n"; print '
'; } # end of if } # end of foreach } # end of else print '
' . "\n"; print '
'; print '
' . "\n"; print '追加・訂正'."\n"; print '削除します'."\n"; print '' . "\n"; print '

' . "\n"; # 年月日を次へ渡す print '' . "\n"; print '' . "\n"; print '' . "\n"; print '

' . "\n"; print '

'; print '
'; # 翌日表示 print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'. "\n"; print '
 '; # 前日表示 print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'. "\n"; print '
'; # 年月指定 print '
' . "\n"; print '' . "\n"; # 年 print ''. "\n"; # 月 print ''. "\n"; # 日 print ''. "\n"; print '' . "\n"; print '
'. "\n"; print '
'; print '' . "\n"; } # end of display #################################### # # # スケジュールデータ追加・訂正 # # # #################################### sub teisei { # ファイルから登録データを読む &fileread; &inymd; # CGIで出力されたデータをHTMLとして認識させるヘッダの出力 print "Content-type: text/html\n\n"; print 'スケジュール登録' . "\n"; print ''."\n"; print "

   $yy年 $mm月 $dd日のスケジュール

"; print '
'; print '
' . "\n"; $memo{$ymd} =~ s/\0/\n/g; print ''."\n"; print '
'; print '' . "\n"; print '
'; print '' . "\n"; print ' '; print '' . "\n"; # 年月日を次へ渡す print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '   '; # 前画面に戻る print '
' . "\n"; print '' . "\n"; print '' . "\n"; # 年月日を次へ渡す print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
' . "\n"; print '
'; print '' . "\n"; exit; } #################################### # # # スケジュールデータ削除    # # # #################################### sub sakujo { # ファイルから登録データを読む &fileread; &inymd; # CGIで出力されたデータをHTMLとして認識させるヘッダの出力 print "Content-type: text/html\n\n"; print 'スケジュール登録' . "\n"; print ''."\n"; print 'スケジュール削除

' . "\n"; print '
'; print "

   $yy年 $mm月 $dd日のスケジュール

"; print '
'; print '
' . "\n"; @disp = split(/\0/,$memo{$ymd}); foreach (@disp) { print $_."\n"; print '
';} print '
' . "\n"; print '
'; print '
' . "\n"; print '' . "\n"; print '' . "\n"; # 年月日を次へ渡す print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
' . "\n"; print '
'; print '' . "\n"; } # end of sakujo ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub check { &inymd; if ($in{'sel'} == 1) { &teisei; } else { &sakujo; } } # end of check ########################################## # # # 追加・訂正チェックルーチン     # # # ########################################## sub check2 { &inymd; # ファイルから登録データを読む &fileread; # フォーム入力データ $msg = $in{'memo'}; # タグの無効化 $msg =~ s//>/ig; # 改行コードを\nに統一する 98.2.15 $msg=~ s/\015\012/\n/g; $msg=~ s/\015/\n/g; # メッセージの改行のみをカットする @chk = split(/\n/,$msg); $msg=""; foreach (@chk) { if (length($_) > 1) {$msg=$msg.$_."\n";} # end of if } # end of foreach # 改行コード\nを\0に置き換える $msg =~ s/\n/\0/g; # 入力データ\,で日付とデータをつなぐ $value="$msg\n"; # 処理日の連想配列に新規に格納 $memo{$ymd}=$value; &update; &display; } # end of check2 ########################################## # # # 削除チェックルーチン        # # # ########################################## sub check3 { &inymd; # ファイルから登録データを読む &fileread; # delete delete $memo{$ymd}; #8/29 &update; &display; } # end of check3 ########################################## # # # 前画面に戻る            # # # ########################################## sub return { &inymd; &display; } # end of return ########################################## # # 直前の画面からの年月日を受け取り2桁にする # ########################################## sub inymd { $yy=$in{'yy'}; $mm=$in{'mm'}; $dd=$in{'dd'}; # 2桁にする $mm2 = sprintf("%.2d",$mm); $dd2 = sprintf("%.2d",$dd); # 年月日の形にする $ymd=$yy.$mm2.$dd2; } # end of inymd ############################################# # # # チェックエラー表示画面ルーチン      # # # ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; } print "Content-type: text/html\n\n"; print 'スケジュールファイルの保守' . "\n"; print '' . "\n"; print '

スケジュールファイルの保守の入力で下記のエラーが発生しました

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

' . "\n"; exit; } ########################################## # # # 前日表示処理           # # # ########################################## sub back { # 年月受け渡し $yy=$in{'yy'}; $mm=$in{'mm'}; $dd=$in{'dd'}; # 1/1 if ($dd == 1) { if ($mm == 1) {$yy--; $mm=12; $dd=31;} else {$mm--; $dd=$mmend{$mm};} } else { $dd--; } # 表示 &display; } ########################################## # # # 翌日表示処理           # # # ########################################## sub next { # 年月受け渡し $yy=$in{'yy'}; $mm=$in{'mm'}; $dd=$in{'dd'}; # 12/31 if ($dd == $mmend{$mm}) { if ($mm == 12) {$yy++; $mm=1; $dd=1;} else {$mm++; $dd=1;} } else { $dd++; } # 表示 &display; } ########################################## # # # 指定日表示            # # # ########################################## sub siteibi { $yy=$in{'selyy'}; $mm=$in{'selmm'}; $dd=$in{'seldd'}; &display; } ########################################## # # # ファイル更新処理           # # # ########################################## sub update { # 配列データを新しいもの順に並び直し古いものをカットする @new=sort by_date keys(%memo); # 次に最大登録件数までを新配列にセットする %new2 = (); $cnt=1; foreach (@new) { # 登録データ以外の除外 if (length($memo{$_}) > 1) { $value = "$_\,$memo{$_}\n"; push(@new2,$value); # セット数チェック if ($cnt == $max) { last; } else {$cnt++;} } # end of if } # end of foreach # ファイル登録 if (!open(WRITE,">$file")) { &error(0); } flock(WRITE,2); print WRITE @new2; flock(WRITE,8); close (WRITE); } # end of update #################################### # # # 日付をキーにした降順ソート  # # # #################################### sub by_date { $b cmp $a; } ########################################## # # # ファイルクリア処理          # # # ########################################## sub clear { # ファイル登録 if (!open(WRITE,">$file")) { &error(0); } print WRITE ""; close (WRITE); } # end sub clear ################### end of script ################