職場実習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; }