[hunchentoot-devel] Custom types for easy handler.

timothy tschaef at sbcglobal.net
Fri Jun 1 03:55:03 UTC 2007


Le mercredi 30 mai 2007 à 09:35 +0200, Edi Weitz a écrit :
> Hi,
> 
> sorry for the delay.
> 
> On Fri, 25 May 2007 06:47:57 -0700 (PDT), Timothy Schaeffer <tschaef at sbcglobal.net> wrote:
> 
> > I propose that the types for easy-handlers be extensible by the
> > users.  I have pieces of markup which are used throughout our site
> > which collect information from several fields into a class (in our
> > case tied to a database with clsql).  The names of the fields are
> > related, but diffierent from the lists, arrays and hashes of the
> > easy-handlers, Dates and addresses are two good examples, but there
> > are others.  I would like to be able to teach the easy handler to
> > collect these for me and pass them as parameters.  This cannot be
> > done with functions as the :parameter-type because the functions
> > passed as :parameter-type do not take the parameter name.
> 
> I don't really understand what you're trying to do that can't be done
> with REAL-NAME and a function designator for PARAMETER-TYPE.  Maybe
> you can provide an example?

Voici a simple example of what I'm doing:

(defun form-date-input (&key name (label "Date") value (required nil))
.... 
   (with-html-output-to-string (s nil :indent t)
   ... a bunch of input fields for getting a date in pieces, whose id
attr is based on the name paramater...  
))

;; A function to collect date pieces from fields in markup produced 
;; by form-date-input.  parm-name must be the same as given in the
;; name parameter in form-date-input.
(defun date-parameter (parm-name)
  (flet ((parm (item)
	   (non-negative-integer-parameter ; guess what this does :)
		(conc parm-name "-date-" (string-downcase (to-string item))))))
    (let ((yyyy (parm  'year))
	  (mm (parm 'month))
	  (dd (parm 'day)))
      (ignore-errors
	(clsql-sys::parse-datestring
	 (format nil "~4,'0D-~2,'0D-~2,'0D" yyyy  mm  dd))))))


The function passed as :parameter-type takes only the parameter value as
a string (right?), so I cannot do this there; I'm really collecting
several fields into one value.

> I'd say that if it can't be done, then your task is probably too
> complicated for an "easy" handler, but maybe I'm missing something.
> The idea of DEFINE-EASY-HANDLER is that it is a convenience macro for
> 90% of the handlers one usually writes - the mundane ones.  It was not
> intended as a general purpose tool for every conceivable Hunchentoot
> handler on Earth.

Understood.  I may have had a bit too much coffee.  And some part of me
doesn't like seeing a hardcoded list of types.  Ars longa.

Maybe I'll roll my own, define-hairy-wart-covered-handler maybe.

I still think letting :request-type be a custom getter is a good idea
though; it is an easy change and be consistent with the
way :parameter-type works.

> > Hunchentoot is a pleasure to work with!
> That's good to know... :)

It's good to be true [-)


Tim S




More information about the Tbnl-devel mailing list