Gaucheプログラミング(立読み版) > 第2部: 実用 > スケジュールCGIを書こう > 別の月に移動できるようにしてみよう


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

別の月に移動できるようにしてみよう 応援する 

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手続きを評価します。

スケジュール入力のためのフォームを表示できました。こんどは入力されたデータを保存してみましょう。


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation