「CGIパラメータを受け取る」で説明した通り、www.cgiライブラリを使うとCGIでパラメータを受け取れるようになります。
これを利用して前の月、次の月を表示できるようにしてみましょう。
まず最初に、CGIの共通部分をpage手続きとして書いておきます。
(define (page . content)
`(,(cgi-header)
,(html:html
(html:head (html:title "簡易スケジュール表"))
(apply html:body content))))
「n個以上の引数をとる手続きを書く」で見たとおり、page手続きは0個以上の引数をとります。
引数contentに渡された値はHTMLのbody要素の内容として埋め込まれます。
任意の月のカレンダーを表示するcmd-show-calendar手続きを書いてみます。
(define (cmd-show-calendar y m)
(page
(if (and y m (<= 1 m 12) (<= 1753 y))
(calendar (make-month m y))
(calendar (current-date)))))
「値が範囲内かどうか判定する」で見たとおり、式(<= 1 m 12)で月の範囲が1から12までかどうか判定しています。
1日ごとの予定を入力するcmd-show-plan手続きも書いておきましょう。
(define (cmd-show-plan y m d)
(page
(calendar (make-month m y))
(html:form
(html:p #`",|y|年,|m|月,|d|日の予定")
(html:input :type "hidden" :name "c" :value "e")
(html:input :type "hidden" :name "y" :value (x->string y))
(html:input :type "hidden" :name "m" :value (x->string m))
(html:input :type "hidden" :name "d" :value (x->string d))
(html:p (html:textarea :rows 8 :cols 40 :name "p"
(html-escape-string "予定を記入")))
(html:p (html:input :type "submit" :name "submit" :value "変更")))))
カレンダーの日にちをクリックされたときtextareaを表示して予定を入力させます。ここでは入力フォームを表示するだけです。まだデータの保存までは行っていません。
(define (main args)
(cgi-main
(lambda (params)
(let ((y (cgi-get-parameter "y" params :convert x->integer))
(m (cgi-get-parameter "m" params :convert x->integer))
(d (cgi-get-parameter "d" params :convert x->integer)))
(if (and y m d)
(cmd-show-plan y m d)
(cmd-show-calendar y m))
))))
cgi-mainでは「CGIパラメータを受け取る」で説明した、cgi-mainに渡される手続きの引数paramsからパラメータy、m、dを取得します。
y、m、d全部が渡されたときcmd-show-plan手続きを、そうでなければcmd-show-calendar手続きを評価します。
スケジュール入力のためのフォームを表示できました。こんどは入力されたデータを保存してみましょう。