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>"