Sounds great. I've been using hacks such as adding code like this to
my mapper classes just to create a Many-to-Many
relationship between say, tag and content tables (using an
intermediary ContentTag table). Similarly, I've done User/Roles
relationships.
private object _dbTags extends HasManyThrough(this, Tag, ContentTag,
ContentTag.content, ContentTag.tag)
private[model] var _tags : List[Tag] = _
private val locker = new Object
def tags : List[Tag] = locker.synchronized {
if(_tags eq null){
_tags = _dbTags()
}
_tags
}
def tags(newTags:String) = locker.synchronized {
_tags = newTags.roboSplit(",").map(Tag.byName(_))
this
}
def tags(newTags:List[Tag]) = locker.synchronized {
_tags = newTags
this
}
def tagsToo:List[Tag] = ContentTag.findAll(By(ContentTag.content,
this.id)).map(_.tag.obj.open_!)
def showTags = Text(tags.map(_.name.is).mkString(", "))
But, then I have to add code like this to the meta-mapper objects:
def addTags(entry: Content) {
if(entry._tags ne null){
entry._tags.foreach(ContentTag.join(_, entry))
}
}
def delTags(entry:Content) =
ContentTag.findAll(By(ContentTag.content, entry)).foreach
(_.delete_!)
It's not very pretty. Nor easy to duplicate.
I hope your new code is considerably less messy.
Is it in the repo-snapshot repository yet.
On Jul 27, 12:57 pm, Naftoli Gugenheim <[email protected]> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---