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
Hi!
Sorry, I'm obviously eons too late as I was pretty busy with other stuff in the last weeks.
On Wed, 29 Mar 2006 08:23:43 -0800, "Adam Thorsen" adam.thorsen@gmail.com wrote:
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.