I've been using a library that works somewhat differently from Record
(bottom up rather than top down) and might work in a way more familiar to
some people. It provides a syntax something like

class FavouriteB extends Binder {
        val yourName = bindString("yourName") // mandatory is the default
        val yourNickname = bindStringOpt("yourNickname") // optional string
        val donationDate = bindDate("donationDate")
}

It's strongly typed, provides options for optional fields and validation.
Rather than Record.toForm, the bind then just becomes something like
bind("favourite", xhtml, favouriteB.bindParams)

If someone expresses interested in using it, I would release it. I've been
sitting on it
because I'm not sure I want compete with Record, but, perhaps the two
approaches
could be complementary.

cheers
Oliver

On Mon, Jul 27, 2009 at 12:17 AM, Devon Tucker <devonrtuc...@gmail.com>wrote:

>
> Marius,
>
> Maybe boiler plate is too strong a word, but every form example I've
> seen follows the exact same pattern. The form support in Record sounds
> interesting, though I'm always wary of mixing form handling in with
> mapped objects. Also, not every form necessarily maps to a database
> object. I'll probably still take a look at it though.
>
> As for how, exactly, I would like my code to look... well, it could go
> any number of way really. I like the option of having a form callback
> that deals solely with a Map[String, String] of form fields. It's
> inelegant, and loses some of the static checking the current solution
> has, but it's flexible.
>
> someSnippet(xml: NodeSeq) = {
>    bind("prefix", xml,
>        "fieldOne" -> SHtml.text( ... ),
>        "fieldTwo" -> SHtml.text( ... ),
>         "formSubmit" -> SHtml.submit("Submit", submitHandler))
> }
>
> submitHandler(fields: Map[String, String]) {
>     //grab things off the map, do processing
> }
>
> Like I said, not really elegant and this exact functionality can
> already be achieved using the current setup but it has the advantage
> of not relying on stored closures; the map would just be part of the
> post request. As far as I can tell, and please correct me if I'm
> wrong, behind the scenes Lift is storing these closures somehow and
> associating them with a form via the name attributes. This idea really
> scares me because it seems to have a very high potential for abuse and
> it doesn't seem to be documented anywhere. For example, it was very to
> use Firebug and modify the name attributes on my form to produce
> unexpected behavior in my application. This means, as a developer, I
> have to worry and protect myself against the case where any and all of
> my field-associated closures were not called at all, even my submit
> handler.
>
> Maybe storing closures is beneficial or even necessary when dealing
> with AJAX and Comet but for vanilla forms it seems unnecessarily
> stateful. Why not just process the entire form as the request is made?
>
> Cheers,
> Devon
>
>
> On Jul 26, 5:26 am, "marius d." <marius.dan...@gmail.com> wrote:
> > Why is that a boiler plate?
> >
> > Usually in those functions you are building your domain objects,
> > calling setters etc when your function bound to the submit button is
> > called, you have your model built up and start processing it. One
> > other reason for those little functions is type-safety. Your function
> > is called with the proper parameter value and you just use it in a
> > type safe manner.
> >
> > but if you don't like this you can still use jsonForm and in your
> > JsonHandler you have a Map with all your form fields.
> >
> > Record framework for example has a Record.toForm function that is able
> > to serialize a Record into the form  markup (you can even provide your
> > own template) and you can specify your own function that will be
> > called when your generated form is submitted. Lift will automatically
> > build your Field-s our of submitted values, and in your processing
> > function you can do validation (see validation support in Record), and
> > do whatever else you want with it.
> >
> > Br's,
> > Marius
> >
> > On Jul 26, 12:18 am, Devon Tucker <devonrtuc...@gmail.com> wrote:
> >
> > > Hi all,
> >
> > > I've been working with Lift for about a little while now; there are
> > > still plenty of aspects of Lift I haven't touched yet. One thing I am
> > > curious about at this point though is the rationale behind having one
> > > callback per field when generating forms. Each SHtml form element
> > > needs to be handed its own call back function. This strikes me as a
> > > kind of cumbersome, for instance the form examples on the Wiki and in
> > > the Exploring Lift book all follow this pattern:
> >
> > > someSnippet(xml: NodeSeq) = {
> > >     var fieldOne = ""
> > >     var fieldTwo = ""
> > >     def sumbitHandler() = { ... }
> >
> > >     bind("prefix", xml,
> > >         "fieldOne" -> SHtml.text(fieldOne, fieldOne = _),
> > >         "fieldTwo" -> SHtml.text(fieldTwo, fieldTwo = _),
> > >         "formSubmit" -> SHtml.submit("Submit", submitHandler))
> >
> > > }
> >
> > > I've seen several examples of this exact pattern at this point and it
> > > makes the whole fieldOne = _ callback seem like needless boiler-plate.
> > > Why not allow for just one callback function that works over some
> > > object encapsulating an entire form? Am I missing something?
> >
> > > As a corollary to this question, are there other mechanisms available
> > > in Lift for form generation/processing?
> >
> > > Cheers
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to