Hello everybody,

(I sent this post once already a few hours ago, but it has not shown
up yet, so I decided to send it again. I apologize should it show up

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

Maybe a partial function, potentially on case classes, is better? Many
options ...

I'm looking forward to any feedback.


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 
For more options, visit this group at 

Reply via email to