Naftoli,

Functional programming systems are notoriously difficult to document.
The only way to really know what's going on is to meticulously trace
through the source. But that requires
time-consuming trial and error coding. So, without clear examples
demonstrating exactly what you have in mind, I and others in the same
boat, could spend days and still not
get it right.

For example, I tried this:

var theUser:User = null
val view = new ModelView(theUser, this)

 def list(ns: NodeSeq): NodeSeq =  User.currentUser.map({user =>
        User.findAll.flatMap({u =>
            bind("user", chooseTemplate("user", "entry", ns),
                 "firstname" -> Text(u.firstName.is),
                 "lastname" -> Text(u.lastName.is),
                 "email" -> Text(u.email.is),
                 "roles" -> u.roles.map(_.name.toString).mkString(",
"),
                 view.editAction,
                 view.removeAction
                 )
          })
                        }) openOr Text("You're not logged in")


and, I get a null value exception when I try to remove a user in the
list. Simply using
val view = new ModelView(new User, this), doesn't work either,
although I don't get an
exception. Now, where should I be calling load in all of this?

Glenn...


On Aug 3, 6:22 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
> Your snippet should extend ModelSnippet (which extends StatefulSnippet).
> Then write:
> val view = new ModelView(new User, this) {}
> Calling load on another ModelView that references the snippet will load its 
> entity into that view val. It has a number of methods of possible interest, 
> like save which checks validity.
> Also see Util.
> Are you seeing the scaladocs?
>
> -------------------------------------
>
> glenn<gl...@exmbly.com> wrote:
>
> Just to add to what I just wrote, I don't see how your ModelView can
> be applied to
> User, which already extends a class, MegaProtoUser.  Maybe I'm not
> comprehending this correctly.
>
> Glenn...
>
> On Aug 3, 3:48 pm, glenn <gl...@exmbly.com> wrote:
>
> > Naftoli,
>
> > Liked your OneToMany article, but not sure how the new
> > ModelView and ModelSnippet code can be applied to ManyToMany.
> > Can you provide a sample?
>
> > Glenn...
>
> > On Aug 2, 1:21 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
>
> > > I put an article on the wiki about OneToMany 
> > > --http://wiki.github.com/dpp/liftweb/how-to-work-with-one-to-many-relat...
> > > .
>
> > > On Sun, Aug 2, 2009 at 11:20 AM, Naftoli Gugenheim 
> > > <naftoli...@gmail.com>wrote:
>
> > > > Glad to hear. Also see mapper.view.ItemsList (anyone have a better 
> > > > name?),
> > > > which is used by TableEditor. It's a similar idea without relationships.
> > > > Should MappedOne/ManyToMany be based on ItemsList?
> > > > Also should I take Mapped out of those names? After all, they're not
> > > > MappedFields and they don't correspond to a table column.
>
> > > > -------------------------------------
> > > > Magnus Alvestad<magnus.alves...@gmail.com> wrote:
>
> > > > This work that you've done in Mapper fits in very well with something
> > > > I've been planning to do. In a Java project some time ago we
> > > > implemented a 'change engine'. We were loading big pension agreements,
> > > > manipulating them in a web interface and finally saving them back to
> > > > the database. While the user was working on the agreement, we
> > > > generated a list of changes, containing enough information to replay
> > > > or unroll the change. We could use this to implement undo and some
> > > > semi-intelligent merging when two users were trying to commit  changes
> > > > to the same agreement. We also let the user review his changes before
> > > > saving, and we indicated changed fields visually. We were even
> > > > thinking of implementing some kind of macro or replay functionality,
> > > > but never got that far.
>
> > > > I've been trying to implement something similar as a lift component,
> > > > but with the old relationship handling it wasn't practical. With your
> > > > changes it should be. Thanks!
>
> > > > -Magnus
>
> > > > On Jul 27, 9:57 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
> > > > > I committed some code last night, which can help building mapper-based
> > > > view snippets, with G-d's help. It includes the following classes:
> > > > > (1-2) net.liftweb.mapper.OneToMany, ManyToMany: Gives a more
> > > > object-oriented approach to managing related entites. You can manage the
> > > > many side of a 1-n and n-n as a mutable collection of children, and the
> > > > parent of a child can be set directly, instead of via its id. And the
> > > > children are not saved to the database when you add them until you call 
> > > > save
> > > > on it or its parent, nor deleted when you remove tem until you call
> > > > delete_!, which is very helpful when you need to keep track of 
> > > > adds/removes
> > > > through multiple requests. For example, if you are displaying a list 
> > > > and you
> > > > can click delete, but it shouldn't be permanently deleted until you 
> > > > click
> > > > save.
> > > > > There is a new package, ...mapper.view, which contains a number of
> > > > utilities for mapper-based views:
> > > > > (3-4) ModelView and ModelSnippet provide a number of building blocks 
> > > > > for
> > > > views that are too complex to CRUDify. Inherit ModelSnippet (which 
> > > > extends
> > > > StatefulSnippet) and wrap your entities in ModelView (view is used in 
> > > > the
> > > > sense of a wrapper).
> > > > > (5) Util provides some more building blocks that just be imported,
> > > > without needing a ModelSnippet context.
> > > > > (6-7) Paginator makes it easy to create paginated, user sortable
> > > > listings. You can use PaginatedSnippet instead of ModelSnippet to help.
> > > > > (8-10) ItemsList lets you manage a list of entities with pending
> > > > additions and deletions. It's used by TableEditor, which is a very easy 
> > > > to
> > > > use and customizable snippet to edit tables directly. It's useful for
> > > > editing short lists, e.g., a lookup table like cities. Don't forget to
> > > > register the table in Boot.
> > > > > (11) Then there's the experimental FormProcessor, if you need your 
> > > > > form
> > > > to be processed in one block instead of separate closures, e.g., to 
> > > > surround
> > > > with try.
> > > > > (12) Also experimental is sitemap.XmlMenu which lets you write menus 
> > > > > in
> > > > xml.
> > > > > (13) I may add CaseEnum, which lets you write case classes that
> > > > automatically double as an Enumeration.
> > > > > Questions, comments, suggestions, and constructive criticism are more
> > > > than welcome!
> > > > > Thanks.
--~--~---------~--~----~------------~-------~--~----~
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