職場実習11日目

今日は、フォームの設置と投稿データの保存処理を作成する。

セッション情報の書き換えと、リダイレクト処理

画面遷移はセッション情報によってページ内のHTML部分ページを取り換える事で実現する。
画面更新時の再送信と、それによる二重投稿が起こるのを防止するため、リクエスト処理用ページと画面表示用ページを分け、メニューのリンク先でセッション情報を書き換える処理を行った後、画面表示用ページへリダイレクトするようにした。
しかし、作業はスムーズに行かず、セッション書き換えの後にCGIモジュールを使ってもリダイレクトされない不具合に悩まされ、printしないと意味が無いことに気付くまでに時間が掛った。
Perlメモ/CGIモジュール - Walrus, Digit.(CGIモジュールでリダイレクトする。)

入力フォームのプルダウンリスト項目をDBから取得

予めPostgreSQLでマスターテーブルとビューを構築しておき、DBアクセス用メソッドを作っておき、SQL操作はそのメソッド内だけ全て行うので、問い合わせのためのパラメータを用意し、アクセスメソッドを呼び出すだけで済んだ。
また、プルダウンリストを、配列を渡すだけで自動で書いてくれる関数も作ってみた。これは結構便利。

# 選択リスト項目をselect文のoptionにそのまま変える
sub get_select_option_list {
    my ($list, $select_index) = @_;
    my $string = '';
    foreach $index (@{$list}) {
        my $selected = $index eq $select_index ? ' selected' : '';
        $string .= '<option value="' . $index . '"' . $selected . '>' . $index . '</option>';
    }
    return $string;
}

呼び出し箇所ではこのような使い方をする。

# 年月日入力
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime;
$year += 1900;
$mon += 1;
my @year_list = reverse(($year - 100) .. $year);
my $year_select = get_select_option_list(\@year_list, $year);
my $month_select = get_select_option_list([1 .. 12], $mon);
my $date_select = get_select_option_list([1 .. 31], $mday);
print '<select name="year">'.$year_select.'</select>年'.
    '<select name="month">'.$month_select.'</select>月'.
    '<select name="date">'.$date_select.'</select>日';

ラベルと値が違う場合は、配列をハッシュ配列に変えるといいかも知れない。

# 選択リスト項目をselect文のoptionにそのまま変える(ハッシュ配列使用)
sub get_select_option_list {
    my ($list, $select_value) = @_;
    my $string = '';
    foreach $hash (@{$list}) {
        my $label = $hash->{'label'};
        my $value = $hash->{'value'};
        my $selected = $value eq $select_value ? ' selected' : '';
        $string .= '<option value="' . $value . '"' . $selected . '>' . $label . '</option>';
    }
    return $string;
}