紙芝居のようにページを進めるCGI

CGIプログラムは,起動してHTMLデータを出力したら終了する。 ユーザがHTML文書を目にするときにはプログラムの実行は終了している。 これはつまり,フォーム文で入力した値はすぐに消えてしまうことを意味する。

ここでは,1つのCGIプログラムで紙芝居のように順次移り変わる Webページを生成する方法の例を示す。

hidden変数の活用

1つのCGIプログラムに複数のWebページ出力を管理させるには, 現在の状態を示す変数をhidden変数に埋め込んで, 次に起動されるCGIプログラムでその値を参照して出力するHTMLを 切り替えればよい。

たとえば,以下のような流れで進むWebページ遷移を考える。

(1)(2)(3)
こんにちはやあやあ さようなら

このような場合,表示すべきページ番号をhidden変数で管理する。 利用者の見えないところで値の受け渡しのできるhidden変数が便利である。 CGIプログラムでは以下のような方針で出力内容を切り替える。

  1. 出力すべきページの指定がない場合 → 1ページ目を出力
  2. 出力すべきページの指定がある場合 → そのページを出力

ページ番号とそのページでの出力内容を以下のようなハッシュで定義しておく。

page = {
  "1" => "こんにちは",
  "2" => "やあやあ",
  "3" => "さようなら",
}

出力すべきページ番号は,入力名 page で管理するものとすると, HTMLでは以下のような form を記述すればよい。

<form method="POST" action="page2go.rb">
 <input type="hidden" name="page" value="ページ番号">
</form>

page2go.rb

#!/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>"

目次