[Lift] Re: URL Rewriting problem

2009-06-13 Thread glenn

David,

Looks like I can incorporate the functionality I need just by writing
my own Loc implementation. Cool. There's a lot going on in your
code so I need to work through it, but seems like it's all there.

Thanks,

Glenn...

On Jun 12, 3:32 pm, David Pollak feeder.of.the.be...@gmail.com
wrote:
 So, you want custom content with menus generated from the database...
 well...

 class BaseContentLoc(val name: String, _aspect: String) extends
 Loc[CustomContent] {
   // the name of the page
   // def name = Content

   val BaseAspect = _aspect

   def defaultParams = Full(ContentLocStuff.NullCustomContent)

   override def forceParam = defaultParams

   // the default parameters (used for generating the menu listing)
   override def additionalKidParams =
 CustomContent.findAll(By(CustomContent.aspect, BaseAspect),

 OrderBy(CustomContent.displayOrder, Ascending))

   // no extra parameters
   def params = List(Loc.PlaceHolder, Loc.Template(myTemplate))

   def myTemplate() =
   lift:surround with=default-final at=contentlift:display
 //lift:surround

   /**
    * Generate a link based on the current page
    */
   val link =
   new Loc.Link[CustomContent](List(BaseAspect), false) {
     override def createLink(in: CustomContent) = {
       Full(Text(/+urlEncode(BaseAspect)+/+urlEncode(in.page)))
     }
   }

   /**
    * What's the text of the link?
    */
   val text = new Loc.LinkText(calcLinkText _)

   def calcLinkText(in: CustomContent): NodeSeq = {
     if (in.page.length  0) Text(in.page) else Text(name)
   }

   object Finder {
     def unapply(page: String): Option[CustomContent] =
     CustomContent.findContent(page, BaseAspect)
   }

   /**
    * Rewrite the request and emit the type-safe parameter
    */
   override val rewrite: LocRewrite =
   Full({
       case RewriteRequest(ParsePath(BaseAspect :: Finder(content) :: Nil,
                                     _, _, _), _, _) =
         (RewriteResponse(BaseAspect :: Nil), content)
     })

   /**
    * Check for page-specific snippets and
    * do appropriate dispatching
    */
   override val snippets: SnippetTest = {
     case (display, Full(v)) =  display(v) _
   }

   def display(v: CustomContent)(in: NodeSeq) = v.content openOr in

 }

 This will autogenerate submenus based on a DB lookup of CustomeContent.

 Does this help achieve your longer term goal?

 Thanks,

 David



 On Fri, Jun 12, 2009 at 3:20 PM, glenn gl...@exmbly.com wrote:

  David,

  Here's my scenario. I've got about 30 menus organized into about 7 or
  8 groups. Thanks to
  help from you and Derek and others in this discussion, I can display
  nested menus in
  groups as a horizontal superfish menu.

  Using URL Rewriting, as described in the master lift book, I created a
  method:

  def rewrite:LiftRules.RewritePF = {
         //Services
          case RewriteRequest(
                 ParsePath(List(services),_,_,_),_,_) =
                         RewriteResponse(content :: Nil, Map(tag -
  services))
          case RewriteRequest(
                 ParsePath(List(services,coreguard),_,_,_),_,_) =
                         RewriteResponse(content :: Nil, Map(tag -
  coreguard))
          case RewriteRequest(
                 ParsePath(List(services,estatePlanning),_,_,_),_,_) =
                          RewriteResponse(content :: Nil, Map(tag -
  estatePlanning))
          case RewriteRequest( 

         ...
  }

  That sends all my requests to  a content.html template:

  lift:surround with=default at=content
       spanh3lift:MySnippets.content
         c:title/
       /lift:MySnippets.content
        /h3/span
  /lift:surround

  The snippet is just as riduculously simple:

  def content(xhtml:NodeSeq):NodeSeq = {
     val c = S.param(tag) openOr 

     bind(c, xhtml,
         title - S.?(c))
   }

  This navigation works, though is repititious.
  It would be relatively easy to extend this idea to generate menus,
  complete with navigation, programatically (say, from an xml file or a
  data table) and allow
  site administrators and other users to drag-and-drop menus as desired.

  The point of all this, in my view, is to eventually populate
  content.html with data/documents/templates/atom feeds, whatever, with
  nothing
  more than the RewriteResponse Map parameter, and voila, you have a
  fledgling CMS built with relatively few lines of code.

  If  you have some alternative ideas for creating a programatic
  navigation system, I would be very interested.

  Glenn...

  On Jun 12, 2:39 pm, David Pollak feeder.of.the.be...@gmail.com
  wrote:
   On Fri, Jun 12, 2009 at 10:44 AM, glenn gl...@exmbly.com wrote:

RewriteRequest isn't working in my app, so I must be doing something
wrong, or leaving something important out.

I have a menu in my siteMap:

Menu(Loc(contact, List(info, contact), Contact Us, LocGroup
(info)))

My boot.scala contains this:

LiftRules.rewrite.append {
       case RewriteRequest(
               

[Lift] Re: URL Rewriting problem

2009-06-13 Thread glenn

David,

Just to understand your code, it looks like you are using a
CustomContent abstract class
for storing content data, or content retrieval information, in the DB.
CustomContent has at
least two fields, aspect, and, page, of type String, both forming
the initial request path;
a helper method, findContent, for db retrieval; and, content, of
type AnyRef, to hold the
actual page content.

You also have a NullCustomContent implementation, which I assume has
nulls for the aspect
and page fields.

I see how this could be extended so that the display method could
actually match against
cases, depending on the resource of the content, whether it's just
xhtml, or perhaps a Rest
URL for RSS or Atom feeds,or a PDF document, etc. The actual
discriminator could be
the specific CustomContent cases, or an enum field in the class. Do
you see something similar?

If you just concocted this in response to my post, it's darn good, or
is this something you
are already using or perhaps know of it's use in other Lift projects?
I'd be interested.

Glenn..

On Jun 12, 3:32 pm, David Pollak feeder.of.the.be...@gmail.com
wrote:
 So, you want custom content with menus generated from the database...
 well...

 class BaseContentLoc(val name: String, _aspect: String) extends
 Loc[CustomContent] {
   // the name of the page
   // def name = Content

   val BaseAspect = _aspect

   def defaultParams = Full(ContentLocStuff.NullCustomContent)

   override def forceParam = defaultParams

   // the default parameters (used for generating the menu listing)
   override def additionalKidParams =
 CustomContent.findAll(By(CustomContent.aspect, BaseAspect),

 OrderBy(CustomContent.displayOrder, Ascending))

   // no extra parameters
   def params = List(Loc.PlaceHolder, Loc.Template(myTemplate))

   def myTemplate() =
   lift:surround with=default-final at=contentlift:display
 //lift:surround

   /**
    * Generate a link based on the current page
    */
   val link =
   new Loc.Link[CustomContent](List(BaseAspect), false) {
     override def createLink(in: CustomContent) = {
       Full(Text(/+urlEncode(BaseAspect)+/+urlEncode(in.page)))
     }
   }

   /**
    * What's the text of the link?
    */
   val text = new Loc.LinkText(calcLinkText _)

   def calcLinkText(in: CustomContent): NodeSeq = {
     if (in.page.length  0) Text(in.page) else Text(name)
   }

   object Finder {
     def unapply(page: String): Option[CustomContent] =
     CustomContent.findContent(page, BaseAspect)
   }

   /**
    * Rewrite the request and emit the type-safe parameter
    */
   override val rewrite: LocRewrite =
   Full({
       case RewriteRequest(ParsePath(BaseAspect :: Finder(content) :: Nil,
                                     _, _, _), _, _) =
         (RewriteResponse(BaseAspect :: Nil), content)
     })

   /**
    * Check for page-specific snippets and
    * do appropriate dispatching
    */
   override val snippets: SnippetTest = {
     case (display, Full(v)) =  display(v) _
   }

   def display(v: CustomContent)(in: NodeSeq) = v.content openOr in

 }

 This will autogenerate submenus based on a DB lookup of CustomeContent.

 Does this help achieve your longer term goal?

 Thanks,

 David



 On Fri, Jun 12, 2009 at 3:20 PM, glenn gl...@exmbly.com wrote:

  David,

  Here's my scenario. I've got about 30 menus organized into about 7 or
  8 groups. Thanks to
  help from you and Derek and others in this discussion, I can display
  nested menus in
  groups as a horizontal superfish menu.

  Using URL Rewriting, as described in the master lift book, I created a
  method:

  def rewrite:LiftRules.RewritePF = {
         //Services
          case RewriteRequest(
                 ParsePath(List(services),_,_,_),_,_) =
                         RewriteResponse(content :: Nil, Map(tag -
  services))
          case RewriteRequest(
                 ParsePath(List(services,coreguard),_,_,_),_,_) =
                         RewriteResponse(content :: Nil, Map(tag -
  coreguard))
          case RewriteRequest(
                 ParsePath(List(services,estatePlanning),_,_,_),_,_) =
                          RewriteResponse(content :: Nil, Map(tag -
  estatePlanning))
          case RewriteRequest( 

         ...
  }

  That sends all my requests to  a content.html template:

  lift:surround with=default at=content
       spanh3lift:MySnippets.content
         c:title/
       /lift:MySnippets.content
        /h3/span
  /lift:surround

  The snippet is just as riduculously simple:

  def content(xhtml:NodeSeq):NodeSeq = {
     val c = S.param(tag) openOr 

     bind(c, xhtml,
         title - S.?(c))
   }

  This navigation works, though is repititious.
  It would be relatively easy to extend this idea to generate menus,
  complete with navigation, programatically (say, from an xml file or a
  data table) and allow
  site administrators and other users to drag-and-drop menus as desired.

  The point of all this, in my view, is to eventually populate
  

[Lift] Re: URL Rewriting problem

2009-06-13 Thread David Pollak
Glenn,

On Sat, Jun 13, 2009 at 12:37 PM, glenn gl...@exmbly.com wrote:


 David,

 Just to understand your code, it looks like you are using a
 CustomContent abstract class
 for storing content data, or content retrieval information, in the DB.


CustomContent in my case is a Mapper class, but it need not be one... it's
just something that can be located with an aspect and a page and it has
a content method which returns a Box[NodeSeq].



 CustomContent has at
 least two fields, aspect, and, page, of type String, both forming
 the initial request path;
 a helper method, findContent, for db retrieval; and, content, of
 type AnyRef, to hold the
 actual page content.

 You also have a NullCustomContent implementation, which I assume has
 nulls for the aspect
 and page fields.


Not nulls, but blanks




 I see how this could be extended so that the display method could
 actually match against
 cases, depending on the resource of the content, whether it's just
 xhtml, or perhaps a Rest
 URL for RSS or Atom feeds,or a PDF document, etc. The actual
 discriminator could be
 the specific CustomContent cases, or an enum field in the class. Do
 you see something similar?


At this point, once you're in SiteMap, you're in Lift's XHTML rendering
pipeline, so it can only be used to render XHTML pages.  However, I've been
noodling with an extension to SiteMap that will allow rendering of XML,
JSON, etc.



 If you just concocted this in response to my post, it's darn good, or
 is this something you
 are already using or perhaps know of it's use in other Lift projects?


Varients of it are being used in production in some of my projects.

The key take-away is the additionalKidParams method which allows you to
dynamically add kid menus to a given menu item.

Thanks,

David



 I'd be interested.

 Glenn..

 On Jun 12, 3:32 pm, David Pollak feeder.of.the.be...@gmail.com
 wrote:
  So, you want custom content with menus generated from the database...
  well...
 
  class BaseContentLoc(val name: String, _aspect: String) extends
  Loc[CustomContent] {
// the name of the page
// def name = Content
 
val BaseAspect = _aspect
 
def defaultParams = Full(ContentLocStuff.NullCustomContent)
 
override def forceParam = defaultParams
 
// the default parameters (used for generating the menu listing)
override def additionalKidParams =
  CustomContent.findAll(By(CustomContent.aspect, BaseAspect),
 
  OrderBy(CustomContent.displayOrder, Ascending))
 
// no extra parameters
def params = List(Loc.PlaceHolder, Loc.Template(myTemplate))
 
def myTemplate() =
lift:surround with=default-final at=contentlift:display
  //lift:surround
 
/**
 * Generate a link based on the current page
 */
val link =
new Loc.Link[CustomContent](List(BaseAspect), false) {
  override def createLink(in: CustomContent) = {
Full(Text(/+urlEncode(BaseAspect)+/+urlEncode(in.page)))
  }
}
 
/**
 * What's the text of the link?
 */
val text = new Loc.LinkText(calcLinkText _)
 
def calcLinkText(in: CustomContent): NodeSeq = {
  if (in.page.length  0) Text(in.page) else Text(name)
}
 
object Finder {
  def unapply(page: String): Option[CustomContent] =
  CustomContent.findContent(page, BaseAspect)
}
 
/**
 * Rewrite the request and emit the type-safe parameter
 */
override val rewrite: LocRewrite =
Full({
case RewriteRequest(ParsePath(BaseAspect :: Finder(content) :: Nil,
  _, _, _), _, _) =
  (RewriteResponse(BaseAspect :: Nil), content)
  })
 
/**
 * Check for page-specific snippets and
 * do appropriate dispatching
 */
override val snippets: SnippetTest = {
  case (display, Full(v)) =  display(v) _
}
 
def display(v: CustomContent)(in: NodeSeq) = v.content openOr in
 
  }
 
  This will autogenerate submenus based on a DB lookup of CustomeContent.
 
  Does this help achieve your longer term goal?
 
  Thanks,
 
  David
 
 
 
  On Fri, Jun 12, 2009 at 3:20 PM, glenn gl...@exmbly.com wrote:
 
   David,
 
   Here's my scenario. I've got about 30 menus organized into about 7 or
   8 groups. Thanks to
   help from you and Derek and others in this discussion, I can display
   nested menus in
   groups as a horizontal superfish menu.
 
   Using URL Rewriting, as described in the master lift book, I created a
   method:
 
   def rewrite:LiftRules.RewritePF = {
  //Services
   case RewriteRequest(
  ParsePath(List(services),_,_,_),_,_) =
  RewriteResponse(content :: Nil, Map(tag -
   services))
   case RewriteRequest(
  ParsePath(List(services,coreguard),_,_,_),_,_) =
  RewriteResponse(content :: Nil, Map(tag -
   coreguard))
   case RewriteRequest(
  ParsePath(List(services,estatePlanning),_,_,_),_,_)
 =

[Lift] Re: URL Rewriting problem

2009-06-12 Thread Derek Chen-Becker
Do you have a menu item that matches List(content)? If not, that's why
you're getting the 403. If you use SiteMap it has to be exhaustive for all
content on your site. Anything that doesn't match as SiteMap entry will get
a 403 error like you got here. If you don't want to show a menu item for a
particular page (probably in this case), use a Hidden Menu:

Menu(Loc(content, List(content), Internal Content, Hidden))

Derek

On Fri, Jun 12, 2009 at 11:44 AM, glenn gl...@exmbly.com wrote:


 RewriteRequest isn't working in my app, so I must be doing something
 wrong, or leaving something important out.

 I have a menu in my siteMap:

 Menu(Loc(contact, List(info, contact), Contact Us, LocGroup
 (info)))

 My boot.scala contains this:

 LiftRules.rewrite.append {
case RewriteRequest(
ParsePath(List(info,contact),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag -
 contact))
   ...
 }

 And I have a content.html page in webapp.

 Clicking on the Contact Us menu returns an HTTP 403 error, not
 content.html.

 Any help would be appreciated.

 Glenn...

 


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



[Lift] Re: URL Rewriting problem

2009-06-12 Thread David Pollak
On Fri, Jun 12, 2009 at 10:44 AM, glenn gl...@exmbly.com wrote:


 RewriteRequest isn't working in my app, so I must be doing something
 wrong, or leaving something important out.

 I have a menu in my siteMap:

 Menu(Loc(contact, List(info, contact), Contact Us, LocGroup
 (info)))

 My boot.scala contains this:

 LiftRules.rewrite.append {
case RewriteRequest(
ParsePath(List(info,contact),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag -
 contact))
   ...
 }

 And I have a content.html page in webapp.


I think there's a better way to achieve what you want... lemme know together
some code for you.




 Clicking on the Contact Us menu returns an HTTP 403 error, not
 content.html.

 Any help would be appreciated.

 Glenn...

 



-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp

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



[Lift] Re: URL Rewriting problem

2009-06-12 Thread glenn

David,

Here's my scenario. I've got about 30 menus organized into about 7 or
8 groups. Thanks to
help from you and Derek and others in this discussion, I can display
nested menus in
groups as a horizontal superfish menu.

Using URL Rewriting, as described in the master lift book, I created a
method:

def rewrite:LiftRules.RewritePF = {
//Services
 case RewriteRequest(
ParsePath(List(services),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag - 
services))
 case RewriteRequest(
ParsePath(List(services,coreguard),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag - 
coreguard))
 case RewriteRequest(
ParsePath(List(services,estatePlanning),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag -
estatePlanning))
 case RewriteRequest( 

...
}

That sends all my requests to  a content.html template:

lift:surround with=default at=content
  spanh3lift:MySnippets.content
c:title/
  /lift:MySnippets.content
   /h3/span
/lift:surround

The snippet is just as riduculously simple:

def content(xhtml:NodeSeq):NodeSeq = {
val c = S.param(tag) openOr 

bind(c, xhtml,
title - S.?(c))
  }

This navigation works, though is repititious.
It would be relatively easy to extend this idea to generate menus,
complete with navigation, programatically (say, from an xml file or a
data table) and allow
site administrators and other users to drag-and-drop menus as desired.

The point of all this, in my view, is to eventually populate
content.html with data/documents/templates/atom feeds, whatever, with
nothing
more than the RewriteResponse Map parameter, and voila, you have a
fledgling CMS built with relatively few lines of code.

If  you have some alternative ideas for creating a programatic
navigation system, I would be very interested.

Glenn...


On Jun 12, 2:39 pm, David Pollak feeder.of.the.be...@gmail.com
wrote:
 On Fri, Jun 12, 2009 at 10:44 AM, glenn gl...@exmbly.com wrote:

  RewriteRequest isn't working in my app, so I must be doing something
  wrong, or leaving something important out.

  I have a menu in my siteMap:

  Menu(Loc(contact, List(info, contact), Contact Us, LocGroup
  (info)))

  My boot.scala contains this:

  LiftRules.rewrite.append {
         case RewriteRequest(
                 ParsePath(List(info,contact),_,_,_),_,_) =
                         RewriteResponse(content :: Nil, Map(tag -
  contact))
        ...
  }

  And I have a content.html page in webapp.

 I think there's a better way to achieve what you want... lemme know together
 some code for you.



  Clicking on the Contact Us menu returns an HTTP 403 error, not
  content.html.

  Any help would be appreciated.

  Glenn...

 --
 Lift, the simply functional web frameworkhttp://liftweb.net
 Beginning Scalahttp://www.apress.com/book/view/1430219890
 Follow me:http://twitter.com/dpp
 Git some:http://github.com/dpp

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



[Lift] Re: URL Rewriting problem

2009-06-12 Thread David Pollak
So, you want custom content with menus generated from the database...
well...

class BaseContentLoc(val name: String, _aspect: String) extends
Loc[CustomContent] {
  // the name of the page
  // def name = Content

  val BaseAspect = _aspect

  def defaultParams = Full(ContentLocStuff.NullCustomContent)

  override def forceParam = defaultParams

  // the default parameters (used for generating the menu listing)
  override def additionalKidParams =
CustomContent.findAll(By(CustomContent.aspect, BaseAspect),

OrderBy(CustomContent.displayOrder, Ascending))

  // no extra parameters
  def params = List(Loc.PlaceHolder, Loc.Template(myTemplate))

  def myTemplate() =
  lift:surround with=default-final at=contentlift:display
//lift:surround


  /**
   * Generate a link based on the current page
   */
  val link =
  new Loc.Link[CustomContent](List(BaseAspect), false) {
override def createLink(in: CustomContent) = {
  Full(Text(/+urlEncode(BaseAspect)+/+urlEncode(in.page)))
}
  }

  /**
   * What's the text of the link?
   */
  val text = new Loc.LinkText(calcLinkText _)

  def calcLinkText(in: CustomContent): NodeSeq = {
if (in.page.length  0) Text(in.page) else Text(name)
  }

  object Finder {
def unapply(page: String): Option[CustomContent] =
CustomContent.findContent(page, BaseAspect)
  }

  /**
   * Rewrite the request and emit the type-safe parameter
   */
  override val rewrite: LocRewrite =
  Full({
  case RewriteRequest(ParsePath(BaseAspect :: Finder(content) :: Nil,
_, _, _), _, _) =
(RewriteResponse(BaseAspect :: Nil), content)
})

  /**
   * Check for page-specific snippets and
   * do appropriate dispatching
   */
  override val snippets: SnippetTest = {
case (display, Full(v)) =  display(v) _
  }

  def display(v: CustomContent)(in: NodeSeq) = v.content openOr in
}

This will autogenerate submenus based on a DB lookup of CustomeContent.

Does this help achieve your longer term goal?

Thanks,

David

On Fri, Jun 12, 2009 at 3:20 PM, glenn gl...@exmbly.com wrote:


 David,

 Here's my scenario. I've got about 30 menus organized into about 7 or
 8 groups. Thanks to
 help from you and Derek and others in this discussion, I can display
 nested menus in
 groups as a horizontal superfish menu.

 Using URL Rewriting, as described in the master lift book, I created a
 method:

 def rewrite:LiftRules.RewritePF = {
//Services
 case RewriteRequest(
ParsePath(List(services),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag -
 services))
 case RewriteRequest(
ParsePath(List(services,coreguard),_,_,_),_,_) =
RewriteResponse(content :: Nil, Map(tag -
 coreguard))
 case RewriteRequest(
ParsePath(List(services,estatePlanning),_,_,_),_,_) =
 RewriteResponse(content :: Nil, Map(tag -
 estatePlanning))
 case RewriteRequest( 

...
 }

 That sends all my requests to  a content.html template:

 lift:surround with=default at=content
  spanh3lift:MySnippets.content
c:title/
  /lift:MySnippets.content
   /h3/span
 /lift:surround

 The snippet is just as riduculously simple:

 def content(xhtml:NodeSeq):NodeSeq = {
val c = S.param(tag) openOr 

bind(c, xhtml,
title - S.?(c))
  }

 This navigation works, though is repititious.
 It would be relatively easy to extend this idea to generate menus,
 complete with navigation, programatically (say, from an xml file or a
 data table) and allow
 site administrators and other users to drag-and-drop menus as desired.

 The point of all this, in my view, is to eventually populate
 content.html with data/documents/templates/atom feeds, whatever, with
 nothing
 more than the RewriteResponse Map parameter, and voila, you have a
 fledgling CMS built with relatively few lines of code.

 If  you have some alternative ideas for creating a programatic
 navigation system, I would be very interested.

 Glenn...


 On Jun 12, 2:39 pm, David Pollak feeder.of.the.be...@gmail.com
 wrote:
  On Fri, Jun 12, 2009 at 10:44 AM, glenn gl...@exmbly.com wrote:
 
   RewriteRequest isn't working in my app, so I must be doing something
   wrong, or leaving something important out.
 
   I have a menu in my siteMap:
 
   Menu(Loc(contact, List(info, contact), Contact Us, LocGroup
   (info)))
 
   My boot.scala contains this:
 
   LiftRules.rewrite.append {
  case RewriteRequest(
  ParsePath(List(info,contact),_,_,_),_,_) =
  RewriteResponse(content :: Nil, Map(tag -
   contact))
 ...
   }
 
   And I have a content.html page in webapp.
 
  I think there's a better way to achieve what you want... lemme know
 together
  some code for you.
 
 
 
   Clicking on the Contact Us menu returns an HTTP 403 error, not
   content.html.
 
   Any help would be appreciated.