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ボタンを押したときに同じ画面に戻るようにするにはどうしたら・・・?
あと ログイン出来たときでも、遷移先の画面を状況に応じて変えたいのだけど方法が分からない。もっと中のほうのソース読もう(そして継続周りで思考停止)。

*1:基底クラスの widgetクラスもslot持ってるから、これがlogin widgetが持つ全ての slotと言うわけではありません