CGIプログラムは,起動してHTMLデータを出力したら終了する。 ユーザがHTML文書を目にするときにはプログラムの実行は終了している。 これはつまり,フォーム文で入力した値はすぐに消えてしまうことを意味する。
ここでは,1つのCGIプログラムで紙芝居のように順次移り変わる Webページを生成する方法の例を示す。
1つのCGIプログラムに複数のWebページ出力を管理させるには, 現在の状態を示す変数をhidden変数に埋め込んで, 次に起動されるCGIプログラムでその値を参照して出力するHTMLを 切り替えればよい。
たとえば,以下のような流れで進むWebページ遷移を考える。
| (1) | (2) | (3) | ||
|---|---|---|---|---|
| こんにちは | → | やあやあ | → | さようなら |
このような場合,表示すべきページ番号をhidden変数で管理する。 利用者の見えないところで値の受け渡しのできるhidden変数が便利である。 CGIプログラムでは以下のような方針で出力内容を切り替える。
ページ番号とそのページでの出力内容を以下のようなハッシュで定義しておく。
page = {
"1" => "こんにちは",
"2" => "やあやあ",
"3" => "さようなら",
}
出力すべきページ番号は,入力名 page で管理するものとすると, HTMLでは以下のような form を記述すればよい。
<form method="POST" action="page2go.rb"> <input type="hidden" name="page" value="ページ番号"> </form>
#!/usr/bin/env ruby
# coding: utf-8
require 'cgi'
c = CGI.new(:accept_charset => 'utf-8')
page = {
"1" => "こんにちは",
"2" => "やあやあ",
"3" => "さようなら",
}
p = c["page"]
if p==""
p="1" # page変数指定がなければ "1" とする
end
name = c["name"]
puts "Content-type: text/html; charset=utf-8
<!DOCTYPE html>
<html>
<head><title>Page #{p}</title></head>
<body>
<h1>Page #{p}</h1>
<form method=\"POST\" action=\"page2go.rb\">"
# ページ番号による切り替え処理
case p
when "1"
nextpage = "2"
when "2"
nextpage = "3"
when "3"
nextpage = nil # 「次のページ」はなし
end
if name > "" # nameが定義されていたら呼びかけ文出力
printf("<p>%sさん!</p>\n", name)
end
printf("<p>%s</p>\n", page[p]) # ページ番号に応じたメッセージ出力
if nextpage
if name == "" # 名前入力がなければ名前入力フォーム
puts('<p>お名前: <input type="text" name="name" size="10"></p>')
else
# 既に入力されていたら hidden 変数に保存
printf("<input type=\"hidden\" name=\"name\" value=\"%s\">\n", name)
end
printf("<input type=\"hidden\" name=\"page\" value=\"%s\">\n", nextpage)
puts('<input type="submit" value="次へ">')
end
puts "</form>
</body>
</html>"