Weblocks - widgets - login
一つずつ見ていくとか言いつつ、最初の一個目でガッツリ詰まったのでした。
使った widgetは ログインフォームを作成する "login" widget。
基本的な使い方
どの widgetも基本的な使い方は make-instnaceで通常のクラスと同様にインスタンス生成するだけのような気がします。
いくつかのslotがあり、入力項目やSUBMITされた時に呼ばれる関数などが設定できるらしい。
以下、login widgetで定義している slot*1。
on-login | loginボタン押下時に呼び出される2引数の関数 |
on-success | on-loginが 非nilを返したときに呼ばれる関数 |
on-cancel | キャンセルボタンが押されたときに呼ばれる関数 |
view | 入力項目やボタンの定義 |
quickform | initialize-instance :afterで setfされてるから、自分で設定する必要は無いと思う |
data | 調べてないです |
class-store | 調べてないです |
これらの slotの内、on-loginだけは必須です。
(make-instance 'login :on-login (lambda (login-widget form) (declare (ignore login-widget)) (let* ((email (slot-value form 'email)) (password (slot-value form 'password)) (user (get-user email password))) (if user user (values nil "メールアドレス、又はパスワードが誤っています。")))))
のような感じで私は動かしてみました。get-userはメールアドレスとパスワードでユーザ情報を取得する関数だと思ってもらいたい。
このon-loginに設定した関数が非nilを返した場合、その値がsessionに格納された上でログイン成功として on-successに設定した関数が呼ばれます。逆に nilを返すとログイン失敗になり、同じ画面に戻されてエラーメッセージが表示されます。エラーメッセージは valuesで返した2個目の戻り値、又はデフォルトの "Invalid credentials."。
ログインユーザのログイン情報(on-login-fnで返した非nil値)は (webapp-session-value *authentication-key*)で参照可能。
さっぱり分からないこと
login widgetの動作というより、Weblocksの画面遷移定義の仕方が分かっていない。
ログインフォームでcancelボタンを押したときに同じ画面に戻るようにするにはどうしたら・・・?
あと ログイン出来たときでも、遷移先の画面を状況に応じて変えたいのだけど方法が分からない。もっと中のほうのソース読もう(そして継続周りで思考停止)。