weblocks その1

せっかく入れたんだからちょっと触ってみようと思ったweblocks。
ちょっとのつもりが結構時間つかったな。。。
なんかドキュメントあんまなくない??

まずはやっぱりhallo worldからかなあ。ということで。

(asdf:operate 'asdf:load-op :weblocks-demo)
(weblocks:start-weblocks)
(weblocks:defwebapp weblock01 :prefix "/weblocks01/")
(defpackage #:test01)
(defun init-user-session (comp)
  (setf (weblocks:composite-widgets comp)
 (lambda ()
   (weblocks:with-html
    (:div "hello world")))))

slime上で評価してhttp://localhost:8080/をたたくとwelcomeページが開いてそこからstartしてWEBLOCK01のリンクを押せば動く。

で、次。
普通にテキストボックスとボタンをおいて、ボタンを押したらテキストボックスの内容+helloって表示ぐらいしようかな、、、と思ったんだけどやり方がわからない。
http://viridian-project.de/~sky/weblocks-stable/docs/gen/weblocks-package/
をみてもよくわからん。
Render-Buttonにはactionの指定がない。
Render-Form-And-Buttonにはactionがかけるけど使い方がわかんない。
それにsubmitされてきたテキストの内容をどうやってとるのかもわからん。

しょうがないので
http://trac.common-lisp.net/cl-weblocks/wiki/UserManual
をみながらオブジェクトをviewに表示してみる。

(asdf:operate 'asdf:load-op :weblocks)
(weblocks:start-weblocks :debug t)
(weblocks:defwebapp weblock02 :prefix "/weblocks02/")
(defpackage #:test02)

(defun init-user-session (comp)
  (setf (weblocks:composite-widgets comp)
 (lambda ()
   (weblocks:with-html
    (setf inst (make-instance 'cls :data "default"))
    (weblocks:render-object-view inst '(data cls))
    (:br)
    (weblocks:render-object-view (list inst) '(table cls))))))

(defclass cls ()
   ((data :accessor cls-data
  :initarg :data
  :initform nil)))できた。
で、次が継続を利用した画面遷移。
(asdf:operate 'asdf:load-op :weblocks)
(weblocks:start-weblocks :debug t)
(weblocks:defwebapp weblock03 :prefix "/weblocks03/")
(defpackage #:test03)

(defun init-user-session (comp)
  (weblocks:with-flow comp
        (weblocks:yield (weblocks:make-widget #'show-1))
        (weblocks:yield (weblocks:make-widget #'show-2))))

(defun show-1(cc)
  (weblocks:with-html
   (weblocks:render-link 
    (lambda (&rest args)
      (weblocks:answer cc))
    "go!" :ajaxp nil)))

(defun show-2(cc)
  (weblocks:with-html
   (:div "hello world")))

go!のリンクを押すとhello worldが表示されてもとに戻れなくなる。

次。簡素なマスタメンテっぽい画面。

(asdf:operate 'asdf:load-op :weblocks)
(weblocks:start-weblocks :debug t)
(weblocks:defwebapp weblock04 :prefix "/weblocks04/")
(defpackage #:test04)

(weblocks:defstore *scratch-store* :memory)

(defclass person ()
  ((weblocks:id)
   (first-name :accessor pernos-first-name :initarg first-name :initform nil :type string)
   (last-name :accessor person-last-name :initarg last-name :initform nil :type string)))

(weblocks:defview person-table-view (:type table :inherit-from '(:scaffold person)))

(weblocks:defview person-form-view (:type form :inherit-from '(:scaffold person)))

 (defun init-user-session (comp)
   (setf (weblocks:composite-widgets comp)
  (make-instance 'weblocks:widget :children
   (make-instance 'weblocks:gridedit
           :name 'person-form
           :data-class 'person
           :view 'person-table-view
           :item-form-view 'person-form-view))))

ただし、メモリに書いているだけでdb等に永続化はしていない。
dbに入れるときにロックかけるのどうしたらいいのかわかんないのでとりあえずメモリ上に持つだけ。
それともオプティミスティック?だとすればテーブルにタイムスタンプがいるし。。。

今日はこの辺でやめ。続く...のか?