Ocsigen/EliomでWebアプリを作る (フォームの設置編)

今回書いた全ソースコードはgithubのリポジトリのtut3ディレクトリにあります.

前回はローカルの手書きHTMLからサービスに向ってPOSTリクエストを投げましたが,今回はリクエストを投げるHTMLをWebアプリで出すようにします.その前の準備として前回のままだと不都合があるので,main_serviceを 1. サービスを受け持つ部分 2. ページを出力する部分 の2つに分割します.

let main_service =
  Eliom_services.service
    ~path:["index"]
    ~get_params:unit
    ()
 
let comment_service =
  Eliom_services.post_service
    ~fallback:main_service
    ~post_params:(string "name" ** string "comment" ** string "submit")
    ()
 
let main_page =
  register
    ~service:main_service
    (fun () () -> (* HTML出力部.あとでフォームを出力するように置き換える *) Lwt.return
        (html (head (title (pcdata "")) [])
              (body [p [pcdata "hogehoge"]])))

つまり,register_serviceというのはserviceとregisterを一挙にやってくれていたわけです.

次にHTML出力部をフォームを出力するように置き換えます.

	 let f =
	 (Eliom_output.Html5.post_form comment_service
				       (fun (name, (comment, submit)) ->
					    [p [pcdata "name: ";
					    string_input ~input_type:`Text ~name:name ();
					    pcdata "comment: ";
					    string_input ~input_type:`Text ~name:comment ();
					    string_input ~input_type:`Submit ~name:submit ~value:"Post" ()]]) ()) in
	 return (html (head (title (pcdata "")) [])
                               (body [f]))

Eliom_output.Html5.post_formの最初の引数でどのサービスに向ってリクエストを投げるかを指定し,次の引数でPOSTリクエストのパラメータからどのようなフォームを作るかを指定します.ここでcomment_serviceを参照する必要があったので,serviceとregisterを分割しました.いやlet rec使えば分割しないでも行けたんですけど,ややこしくなるので.

string_inputはEliom_output.Html5.string_inputのことです.まあそんなに難しくないと思います.

こうすることにより,/indexにアクセスするとフォームが表示されるようになります.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です