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 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 -~----------~----~----~----~------~----~------~--~---