Seaside チュートリアル(その3)
ずいぶん間が開いてしまいました。本業の方が忙しくなってきて、コードをまったり書く時間がなかなか確保出来ませんでした。いやーんなカンジです。
さて、久しぶりの第3回目ですが、いつも通りA Seaside tutorialさんから、今日はFormsを勉強します。
formを作ろう
アンカーからのご想像の通り、フォームを作るには #form: を使います。まずは簡単なフォームを。
renderContentOn: html html form: [html submitButtonWithAction: [Transcript cr; show: 'ボタンが押されました '; show: DateAndTime now printString ] text: '押しましょう']
form要素をレンダリングするには form: に対し子要素をブロックで与えて上げるという、コレまで通りの方法です。
さて、Formと言えばSubmit。Transcript にボタンを押す度に(余計なのも含めてw)ガンガン ログが出力されるハズです。想像通り 〜WithAction: に与えたブロックが Submitの度に実行されるという訳です。
とは言え Transcript にはき出されるだけではちょっとイマイチ。せっかくの Webアプリケーションなのでもうちょっとそれっぽく。そこで ど素人のためのど素人によるSqueak入門 さんのサンプルをちょっと拝借。
WAComponent subclass: #WebWorkspace instanceVariableNames: 'values' classVariableNames: '' poolDictionaries: '' category: 'MySeasideTutorial' initialize values _ '' renderContentOn: html html form: [html textAreaWithValue: values asString callback: [:v | values := v]. html break. html submitButtonWithAction: [values := Compiler evaluate: values ] text: 'do it']
これで Webブラウザ上で動く 簡易 Workspace のできあがりでござい♪
これが上手く動くということは、 #textArieaWitValue:callback: に渡されたブロックのほうが #submitButtonWithAction:text: よりも先に評価されると言うわけです。form がサブミットされたとき、Seaside のプロセスは Submitボタンのコールバックの前に全ての インプットフィールドのコールバックを処理します。
というわけで、Seaside は、情報入力フォームを簡単に作ることが出来ます。以下に A Seaside Tutorial より個人情報入力フォームの例を紹介します。このコンポーネントは入力した情報(name addrass)を自身のフィールドに保持します。
WAComponent subclass: #PersonalInfomationView instanceVariableNames: 'name address gender' classVariableNames: '' poolDictionaries: '' category: 'MySeasideTutorial' name ^name name: aString name _ aString address ^address address: aString address _ aString gender ^gender gender: aString gender _ aString
ここに保持る操作を実現するUI側はこんなカンジです。
renderContentOn: html html form: [html text: 'Name'. html textInputWithValue: self name callback: [:v | self name: v]. html br. html text: 'Address'. html textAreaWithValue: self address callback: [:v | self address: v]. html br. html submitButtonWithAction: [self save] text: 'Save'] save self inform: self name , '--' , self address
特に難しいことは無いので説明は省略しますが、これだけでセッション毎にデータを入力させそれを永続化することが出来ます。
TextInput / TextArea の便利なメソッド
さて、仕切り直してその他フォーム関連のメソッドを紹介します。中でもちょっと面白いのが #textInputOn:of: と #textAreaOn:of です。こんな風に使います。
renderContentOn: html html form: [html text: 'お名前'. html textInputOn: #name of: self. html br. html text: 'ご住所'. html textAreaOn: #address of: self. html br. html submitButtonWithAction: [self save] text: 'Save']
これらは of: で渡されたオブジェクトから 〜On: で渡されたシンボルからそれっぽいメッセージ(渡したのが #hoge シンボルだったら、 アクセサが #hoge でミューテイタが #hoge:)を作って送って、それを入出力に使ってくれる便利なメソッドです。
ドロップダウンリストの作り方
ドロップダウンリストはこんな感じになります。
html text: '性別'. html selectFromList: #(Male Female) selected: self gender callback: [:v | self gender: v]. "または" html text: '性別'. html selectInputOn: #gender of: self list: #(Male Female)
後ろの方は #textInputOn:of: と同じタイプのやつですね。
・・というところで今日は時間切れ。A Seaside Tutorial さんで紹介されている他のForm関連のメソッド(ラジオボタンとかとか)は、また期を改めてお勉強しようとおもいます。
関連記事
- Seaside チュートリアル(その1) 基本的なHTMLレンダリング
- Seaside チュートリアル(その2) アンカーと状態管理のしくみ