2 min read

Lift Sitemaps - a better way

Lift Sitemap

One of the many things I have recently learned from Tim Nelson is how to better use Sitemap.

You know, most of us declare our site maps in Lift like this:

def sitemap = SiteMap(
      Menu.i("Home")         / "index",
      Menu.i("About")        / "about",
      Menu.i("user.list")    / "user" / "list"   >> LoggedIn,
      Menu.i("user.create")  / "user" / "create" >> LoggedIn

To most people this looks just like any other site map they have implemented in the past. And in your snippets, if you need to link to, let’s say, the user’s list page, you would som something like:

SHtml.link("/user/list", () => someMethodHere(someValueHere))

Now, if for any reason, you then need to change the path from http://hostname/user/list to some over path, you will have to do some search/replace from your preferred IDE/text editor/etc. And this just does;t feel right.


Declare each sitemap entry as a val. So, taking our example, your sitemap would look like:

object Paths {
  lazy val home       = Menu.i("Home")         / "index"
  lazy val about      = Menu.i("About")        / "about"
  lazy val userList   = Menu.i("user.list")    / "user" / "list"
  lazy val userCreate = Menu.i("user.create")  / "user" / "create"

  def sitemap = SiteMap(
    userList   >> LoggedIn
    userCreate >> LoggedIn

And, from your snippet, if you want to link to the /user/list page, you can use Paths.userList.loc.calcDefaultHref

I have enjoyed using this technique a lot, and I hope you do as well.

Thanks for reading.


comments powered by Disqus