show_list.htmlというHTMLファイルを作成し、これをテンプレートとして、add_record.cgiのshow_listサブルーチンの表示結果に反映さえるように改造しよう。これによって、CGIスクリプトは変更せずに、表示結果のデザインを変えることができるようになる。
そのために、add_record.cgiを改造して、add_record3.cgiという名前のCGIスクリプト・ファイルとし、show_listサブルーチンを次のように書き換える。
[show_list.html]<html><head> <title>CGI sample</title> <link href="homework.css" rel="stylesheet" type="text/css"> </head> <body> <h2>リストの表示</h2> <table border="1"> <!--TABLE_LIST--> </table> <a href="edit_record3.html">入力フォーム</a> </body> </html>[add_record3.cgi]
#! /usr/bin/perl
#use strict;
my $top_page = "index.html";
my $filename = "list.txt";
my $show_list_tmpl = "show_list.html";
my %param;
my @data;
%param = get_param();
if( $param{NUMBER} ne "" || $param{NAME} ne "" ){
@data =(); # @dataを初期化
read_records();
update_data($param{NUMBER}, $param{NAME}, $param{GENDER});
}
@data =(); # @dataを初期化
read_records();
show_list();
exit;
################### subroutines ##################
sub update_data
{
my $Number =$_[0];
$Number =~ s/\s+//g; # 空白は削除
$Number =~ s/\D+//g; # 数字以外は削除
my $Name = $_[1];
my $Gender = $_[2];
my $flag = 0;
foreach (@data){
if( $_->{number} eq $Number ){
$flag = 1;
$_->{name} = $Name;
$_->{gender} = $Gender;
if( $Name eq "" ){
delete $_->{number};
delete $_->{name};
delete $_->{gender};
}
}
}
if($flag == 0 && $Number ne "" && $Name ne "" && $Gender ne ""){
push @data, { 'number'=>$Number, 'name'=>$Name, 'gender' =>$Gender };
}
# 書き込みモードでファイルを開く
open(OUT, ">$filename") || &error("Cannot open $filename: $!");
foreach (@data){
if($_->{number} eq ""){ next;} # データがNULLの場合は書き出さない。
print OUT "$_->{number},$_->{name},$_->{gender}\n";
}
# ファイルを閉じる
close(OUT);
}
sub read_records
{
my( $number, $name, $gender);
# 読み取りモードでファイルを開く
open(IN, "<$filename") || &error("Cannot read $filename: $!");
while(<IN>){
chomp;
( $number, $name, $gender) = split(/,/, $_);
# 無名ハッシュを配列にする
push @data,
{
'number'=>$number,
'name'=>$name,
'gender' =>$gender
};
}
# ファイルを閉じる
close(IN);
}
sub show_list
{
my $table_list;
foreach (@data){
$table_list .= "<tr><td>$_->{number}</td><td>$_->{name}</td><td>$_->{gender}</td></tr>\n";
}
# 読み取りモードでファイルを開く
open(IN, "<$show_list_tmpl") || &error("Cannot read $show_list_tmpl: $!");
print "Content-Type: text/html;charset=Shift_JIS;\n\n";
while(<IN>){
s/<!--TABLE_LIST-->/$table_list/;
print $_;
}
}
# 入力データの取得
sub get_param
{
my($query, $key, $value, %param);
if($ENV{REQUEST_METHOD} eq "GET"){
$query = $ENV{QUERY_STRING};
}else{
read(STDIN, $query, $ENV{CONTENT_LENGTH});
}
foreach(split(/&/, $query)){
($key, $value) = split(/=/, $_);
$value =~ s/\+/ /g;
$value =~ s/%([\da-f][\da-f])/pack("C", hex($1))/egi;
## &jcode'convert($value, 'euc');
$value =~ s/\r//g;
$param{$key} = $value;
}
return %param;
}
# エラー表示
sub error
{
print "Content-Type: text/html\n\n";
print <<"---EOF---";
<html><head><title>Information</title></head>
<body>
<span sylte="color: red;"> $_[0]</span>
<form method="GET" action="$top_page">
<input type=SUBMIT value="最初のページに戻る">
</form>
</body></html>
---EOF---
exit;
}
[edit_record3.html]
<html> <head> <title>レコードの編集</title> </head> <body> <form method="POST" action="add_record3.cgi" > 番号:<input type="text" name="NUMBER"><br> 名前:<input type="text" name="NAME">(空欄にすると、そのデータは削除されます)<br> 性別: <label><input type="radio" name="GENDER" value="男">男性 </label> <label><input type="radio" name="GENDER" value="女">女性</label> <br> <input type="submit" value="送信"> </form> </body> </html>
edit_record.htmlを改造して、check_record.htmlという名前のHTMLファイルとして作成し、入力のチェックができるようにしよう。このチェックはJavascriptを使って、クライアント側で行うことにする。
<html>
<head>
<title>レコードの編集</title>
<script type="text/javascript">
<!--
function check(){
var error_msg = "";
if(! document.form1.NUMBER.value.match(/^[0-9]{7}$/) ){ // 「番号」が7ケタの数字かチェック
error_msg += "番号が正しくありません。";
}else if(document.form1.NAME.value == ""){ // 「名前」の入力をチェック
error_msg += "名前が未入力です。";
}
var flag = 0;
for(i = 0; i < document.form1.GENDER.length; i++){
if(document.form1.GENDER[i].checked){
flag = 1;
}
}
if( flag == 0 ){
error_msg += "性別が選択されていません。";
}
if(error_msg != ""){
alert(error_msg); // 入力漏れがあれば警告ダイアログを表示
return false; // 送信を中止
}else{
return true; // 送信を実行
}
}
// -->
</script>
</head>
<body>
<form method="POST" action="add_record.cgi" name="form1" onSubmit="return check();">
番号:<input type="text" name="NUMBER"><br>
名前:<input type="text" name="NAME"><br>
性別:
<label><input type="radio" name="GENDER" value="男">男性 </label>
<label><input type="radio" name="GENDER" value="女">女性</label>
<br>
<input type="submit" value="送信">
</form>
</body>
</html>