Discussion:
Pre-filled forms
Adam Thorsen
2006-03-29 16:23:43 UTC
Permalink
I'm using TBNL in a small web-app. A common need when developing webapps is
to display a form with fields pre-populated from the database (i.e. email
address, street address, etc.).

I'm wondering if it's possible to do this with cl-who in some generic way?
I thought perhaps I could customize cl-who using the
convert-tag-to-string-list method. The function below overrides default
handling of (:input) tags to look for a :tuple attribute with a value set to
a hash containing the values from the database needed to pre-fill the form
the input element is part of. This approach doesn't work, however, because
convert-tag-to-string serializes the string at compile time, and the data
needs to be retrieved from the database at run time. Any ideas?

(defmethod convert-tag-to-string-list ((tag (eql :input)) attr-list body
body-fn)
;;(declare (ignore attr-list))
(let ((name (cdr (assoc :name attr-list)))
(type (cdr (assoc :type attr-list)))
(tuple (eval (cdr (assoc :tuple attr-list)))))
(nconc (cons (format nil "<input name='~a' type='~a' value='~a'>"
name type (if tuple
(gethash name tuple)
""))
(funcall body-fn body)) (list "</input>"))))


Thanks,

-Adam Thorsen
Edi Weitz
2006-05-03 22:21:48 UTC
Permalink
Hi!

Sorry, I'm obviously eons too late as I was pretty busy with other
stuff in the last weeks.
Post by Adam Thorsen
I'm using TBNL in a small web-app. A common need when developing
webapps is to display a form with fields pre-populated from the
database (i.e. email address, street address, etc.).
I'm wondering if it's possible to do this with cl-who in some
generic way? I thought perhaps I could customize cl-who using the
convert-tag-to-string-list method. The function below overrides
default handling of (:input) tags to look for a :tuple attribute
with a value set to a hash containing the values from the database
needed to pre-fill the form the input element is part of. This
approach doesn't work, however, because convert-tag-to-string
serializes the string at compile time, and the data needs to be
retrieved from the database at run time. Any ideas?
As the docs say (but probably don't explain good enough) you can
return Lisp forms from your methods. Something like this (untested)
should work:

(defmethod convert-tag-to-string-list ((tag (eql :input)) attr-list body body-fn)
(let ((name (cdr (assoc :name attr-list)))
(tuple (cdr (assoc :tuple attr-list))))
(nconc
(list* "<input value=\""
`(if ,tuple
(fmt "~A" (or (gethash ,name ,tuple) ""))
"")
"\""
(convert-attributes (remove :tuple attr-list :key #'car)))
(list "/>"))))

HTH,
Edi.

Loading...