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
twice.)

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

Reply via email to