FWIW please also take a look on Record and form&validation support.

Br's,
Marius

On Mar 17, 11:07 pm, Clemens Oertel <clemens.oer...@gmail.com> 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 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