データの変更
データ一覧(RecordGrid)上で選択したレコードの内容を変更するプログラムを書いていきましょう。これからはCurlのプログラミングになります。
Curl言語の文法やAPI仕様は開発者ガイドやCurl IDEのヘルプが役にたちます。また画面の設計はCurl IDE使うと、Visual Basicのように簡単に作る事ができます。
変更画面
今回は、1ページ目の画像のように、一覧の下にボタンを置き、変更ボタンが押された場合、データ一覧の選択されたレコードをボタンの下の編集フォームに表示します。
このフォームにあるDoneボタンを押すとフォームのデータがサーバに送られデータが変更されます。データをサーバに送った後でデータ一覧は再読込しています。
画面のレイアウトは以下のように、データ一覧、ボタン、編集フォームが並びます。ただし、編集フォームは最初は表示されないように visible? = false に設定しています。
{let data_form =
{spaced-vbox
visible? = false,
data_http_form
}
}
{value
{spaced-vbox
data_list,
command_buttons,
data_form
}
}
変更ボタン
変更(edit)ボタンが押されると、データ一覧が選択されているかチェックし、選択されていない場合はメッセージを表示します。
選択されている場合は複数選択された場合にそなえ、最初に選択されたデータの内容をset-update-form関数に渡して編集フォームを表示します。set-update-form関数については後述します。
{let command_buttons =
{spaced-hbox
{CommandButton
label = "edit",
{on Action do
{if data_list.selection.record-count == 0 then
{popup-message "No player selected"}
else
{for i:int in data_list.selection.records do
{set-update-form data_list.records[i]}
{break}
}
}
}
}
}
}
編集フォーム
編集フォームはサーバ側にデータを渡す必要があるので、 HttpFormを使って作っています。HttpForm上にあるTextField等の値はサーバ側に送る事ができます。HTMLのformと似ていますね。
HttpForm上には選手名、チーム名などの入力フィールドが並び、1番下に完了(Done)ボタンがあります。完了ボタンが押された場合、submit-openメソッドでTextField等の入力値をサーバ側にPOSTし、結果を受け取ってresponse変数に代入します。
submit-openの処理をwith-open-streamsマクロでかこむことで通信エラーなどがあってもサーバとの通信を確実に閉じるようにしています。
{let form_text_method:TextField = {TextField name = "_method", height = 0cm, width = 0cm}}
{let form_text_name:TextField = {TextField name = "player[name]", width = 5cm}}
{let form_text_team:TextField = {TextField name = "player[team]", width = 5cm}}
{let form_text_no:TextField = {TextField name = "player[no]", width = 5cm}}
{let form_text_goal:TextField = {TextField name = "player[goal]", width = 5cm}}
{let form_text_assist:TextField = {TextField name = "player[assist]", width = 5cm}}
{let data_http_form:HttpForm =
{HttpForm
{url server_url},
method = HttpRequestMethod.post,
encoding = HttpFormData.urlencoded-mime-type,
default-character-encoding = "utf8",
{spaced-vbox
margin = 5pt,
form_text_method,
{HBox {TextFlowBox "Name", width = 1.5cm}, form_text_name},
{HBox {TextFlowBox "Team", width = 1.5cm}, form_text_team},
{HBox {TextFlowBox "No", width = 1.5cm}, form_text_no},
{HBox {TextFlowBox "Goal", width = 1.5cm}, form_text_goal},
{HBox {TextFlowBox "Asssit", width = 1.5cm}, form_text_assist},
{CommandButton
label = "Done",
{on Action do
{try
{with-open-streams response:#TextInputStream =
{data_http_form.submit-open
character-encoding={get-character-encoding-by-name "utf8"}}
do
{if-non-null response then
{set data_form.visible? = false}
}
}
catch e:Exception do
{popup-message "Error :" & e.message}
}
{get-plyaers-list}
}
}
}
}
}
変更ボタンから呼び出されるset-update-form関数ですが、引数で与えられたレコード値を編集フォームの値に代入し、編集フォームの表示を有効にしています。
またデータの更新用にメソッドを put に URL を http://localhost:3000/players/957451028.json のように変更するデータを表すURLを設定しています。
{define-proc public {set-update-form
rec: Record
}:void
{set form_text_method.value = "put"}
{set form_text_name.value = rec["name"]}
{set form_text_team.value = rec["team"]}
{set form_text_no.value = "" & rec["no"]}
{set form_text_goal.value = "" & rec["goal"]}
{set form_text_assist.value = "" & rec["assist"]}
{set data_http_form.form-action = {url server_url & "players/" & rec["id"] & ".json"}}
{set data_form.visible? = true}
}

