FWIW please also take a look on Record and form&validation support. Br's, Marius
On Mar 17, 11:07 pm, Clemens Oertel <[email protected]> wrote: > Hello everybody, > > Still trying to learn how to use lift efficiently and effectively, I > got a little bit confused about the toForm function in the model/ > mappers. Admittedly, my web framework background may be limited, but > this looked to me as if some view code snuck into the model space > there (I must admit that I do like how RoR tries to keep the models > fairly clean of both controller code and of view code). > > For my first little project, I was going to encapsulate the HTML field > formatting into a separate class (similar to what RoR does, but making > use of the type system). > > This is a very quick brain dump, not running code. > > // The different field types, at a higher level than HTML > abstract class InputType > case class TextField extends InputType > case class DateField extends InputType > case class DateTimeField extends InputType > > // Rendering hints that an form field formatter may use, could also be > called FormGenerator ... > abstract class RenderingHint > case class MinLength(l: Int) extends RenderingHint > case class MaxLength(l: Int) extends RenderingHint > > // Input-type aware callback'ed formatter, from the model's perspective > trait InputTypeHandler { > def handleTextField(fieldID: String, presetValue: String, > renderingHints: RenderingHint*) > > def handleDateField(fieldID: String, presetValue: Date, > renderingHints: RenderingHint*) > > } > > // A model class using the callback > class ModelClass { > object aField extends MappedString(this, 128) { > def inputTypeCallback(InputTypeHandler handler) { > // A reasonable default should/could be pushed upwards in the > type hierarchy > handler.handleTextField(fieldID, this.is, MaxLength(this.length)) > } > } > > } > > This InputTypeHandler could be a nice spot to deal with validation > result formatting: > > class AnInputFormatter(errors: List[FieldError]) extends > InputTypeHandler { > def handleTextField(fieldID: String, presetValue: String, > renderingHints: RenderingHint*) { > errors.filter(_._1 == fieldID).match { > case Nil => /* format field normally */ > case xs => /* format as error, i.e. red background, error > messages right of field .... */ > } > } > > ... > > } > > // A snippet > ... > val inputFormatter = new AnInputFormatter(errorsFromValidation) > bind("form", html, "aField" -> aModelClass.aField. > inputTypeCallback(inputFormatter)) > ... > > Maybe a partial function, potentially on case classes, is better? Many > options ... > > I'm looking forward to any feedback. > > Best, > Clemens --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~----------~----~----~----~------~----~------~--~---
