On Wed, Dec 30, 2009 at 7:43 PM, Alex Black <a...@alexblack.ca> wrote:

> Ok, I tried this, it gets closer.
>
> I noticed one issue: the head merge didn't get done, so I have two
> <head> tags in the result.  I'm attempting to set the title in the
> 404.html template, maybe there is a way I can set the title without
> using head merge?
>


I'm opening up the merge method, so once the code is in master, you'll be
able to do:


  def generate404(): LiftResponse = {
    import scala.xml.Node

    val resp: Box[Node] =  S.setVars("expandAll" -> "true")  {
      for {
    session <- S.session
    req <- S.request
        rendered <- S.runTemplate("404" :: Nil)
      } yield session.performHeadMerge(rendered, req)
    }

    XhtmlResponse(resp openOr <html><body>Got a 404</body></html>,
                  Empty, List("Content-Type" -> "text/html; charset=utf-8"),

          Nil, 404, S.ieMode)
  }


This will do the head merge and give you the ability to do anything Lift
does.




>
> - Alex
>
> On Dec 30, 2:54 pm, David Pollak <feeder.of.the.be...@gmail.com>
> wrote:
> > In Boot.scala (the boot method):
> >
> >     LiftRules.passNotFoundToChain = false
> >
> >     LiftRules.uriNotFound.prepend {
> >       case _ => generate404()
> >     }
> >
> > In the Boot class:
> >
> >   def generate404(): LiftResponse = {
> >     import scala.xml.Node
> >
> >     val resp: Box[Node] =  S.setVars("expandAll" -> "true")  {
> >       for {
> >         rendered <- S.runTemplate("404" :: Nil)
> >       } yield rendered(0)
> >     }
> >
> >     XhtmlResponse(resp openOr <html><body>Got a 404</body></html>,
> >                   Empty, List("Content-Type" -> "text/html;
> charset=utf-8"),
> > Nil, 404, S.ieMode)
> >   }
> >
> > And a 404.html file (which can be localized):
> >
> > <lift:surround with="default" at="content">
> > Couldn't find your page... sorry
> > </lift:surround>
> >
> > The uriNotFound code is executed within the S scope, so you've got all
> the
> > goodness of knowing who the current user is, etc.
> >
> > The reason that the menu was not being rendered in your example is that
> menu
> > rendering is based on the location property in the Req(uest).  If there
> is
> > no location (as defined in the SiteMap), then no menu can be rendered.
> > There's an option for displaying the entire sitemap by setting the
> > expandAll="true" attribute when invoking the Menu.builder snippet.  But
> you
> > don't really want to show the entire menu on all pages, so the
> > S.setVars("expandAll" -> "true") {...} method (which is a good candidate
> for
> > renaming for all you renamers out there) allows us to set the expandAll
> > attribute for the duration of the code block.
> >
> > Then we use S.runTemplate() to locate and run the 404.html template.
> >
> > Finally, we create the XhtmlResponse with the 404 error code.
> >
> > So, you can put whatever you want in the 404.html template (including
> > snippets) and all will work as expected.
> >
> > Thanks,
> >
> > David
> >
> >
> >
> > On Wed, Dec 30, 2009 at 10:45 AM, Alex Black <a...@alexblack.ca> wrote:
> > > > It's not rewriting.
> >
> > > I didn't say it was. I just said it seemed most similar to re-writing.
> >
> > > > Trying to mix the two will muddy the concept of rewriting and when it
> > > > happens.
> >
> > > Makes sense.
> >
> > > > As far as I can tell, the two problems you are facing are:
> >
> > > >    1. There's a non-trivial amount of your code that needs to run to
> > > render
> > > >    the 404 error page.  This would be corrected by the suggestion
> that I
> > > posted
> > > >    regarding a LiftRule that generates the default 404 template.
> > > >    2. Putting navigation on the page.  I'm still noodling how to
> address
> > > >    this particular issue.
> >
> > > > If there are issues other than 1 and 2, please enumerate them.
> >
> > > Those do sound like the issues.  Just to reflect it back to you from
> > > my perspective (in case one of us is missing something), the issue as
> > > I see it is that I've designed a nice 404 template using lift features
> > > (like surround, sitemap, headmerge), and I'd like to display it to the
> > > user when no handler can be found
> >
> > > Whats preventing me from doing this is: the current notfound mechanism
> > > takes a liftResponse, not a template to render, and as such forces me
> > > to render the template itself, and although Russ proposed a way to do
> > > that Marius indicated this could have side effects and feels like the
> > > wrong approach.
> >
> > > > > What about Either[RewriteResponse, LiftResponse]? E.g. same as what
> > > > > Marius suggested but use RewriteResponse instead of String.
> >
> > > > > On Dec 30, 1:26 pm, Marius <marius.dan...@gmail.com> wrote:
> > > > > > I thought of that but that is problematic because:
> >
> > > > > > 1. Having a TemplateResponse holding a path without the rendering
> > > > > > logic, people could use that to send a response to the client,
> which
> > > > > > would be incorrect as having a LiftResponse holding /a/b/c
> doesn;t
> > > > > > mean anything to a client. And this would alter the semantics of
> a
> > > > > > LiftResponse. That's why I proposed an Either.
> >
> > > > > > 2. On the other hand if we have a TemplateResponse holding the
> logic
> > > > > > of processing a template (similar to the one proposed on this
> thread)
> > > > > > would mean that we're doing the processing outside of the normal
> > > > > > rendering pipeline which has the downsides discussed.
> >
> > > > > > Br's,
> > > > > > Marius
> >
> > > > > > On Dec 30, 8:18 pm, Naftoli Gugenheim <naftoli...@gmail.com>
> wrote:
> >
> > > > > > > Would it not be possible to have a LiftResponse that runs
> through
> > > the
> > > > > regular plumbing? This way instead of introducing Either you can
> just
> > > use a
> > > > > TemplateResponse etc.
> >
> > > > > > > -------------------------------------
> >
> > > > > > > Marius<marius.dan...@gmail.com> wrote:
> >
> > > > > > > Please open a defect herehttp://github.com/dpp/liftweb/issues.
> ..
> > > > > > > whether or not this solution will make it in master will be
> subject
> > > > > > > for reviewboard. The solution I proposed has a breaking change
> by
> > > the
> > > > > > > introduction of Either[List[String], LiftResponse] instead of
> > > > > > > LiftResponse but I don't think that many people are using
> > > uriNotFound
> > > > > > > and it's really quite a small change which regardless needs to
> be
> > > > > > > announced.
> >
> > > > > > > Other opinions on this?
> >
> > > > > > > Br's,
> > > > > > > Marius
> >
> > > > > > > On Dec 30, 6:20 pm, Alex Black <a...@alexblack.ca> wrote:
> >
> > > > > > > > > While I totally agree that a plain 404 + markup is much
> more
> > > > > > > > > straightforward,
> > > > > > > > > "breaks internet" are too big words :) .. sending back a
> > > > > > > > > 302 or 301 tells the UA "you asked me for a resource that I
> > > know I
> > > > > > > > > don't have but I wont tell
> > > > > > > > > you explicitely, instead I want you to go to this location
> as
> > > an
> > > > > > > > > alternative resource". Somehow it's like scratching with
> the
> > > wrong
> > > > > > > > > hand and purely from HTTP protocol perspective this is not
> > > quite
> > > > > > > > > straightforward as 404 + template, but I don't necessarily
> see
> > > it
> > > > > as a
> > > > > > > > > so bad thing.
> >
> > > > > > > > Heh, I apologise, definitely "breaking the internet" is a bit
> > > > > > > > dramatic.  I do have a different view than you though, I
> think
> > > its
> > > > > > > > incorrect to return a 301 or 302 in these scenarios, the
> correct
> > > > > > > > response is 404.  Not only is it the correct response, but
> given
> > > most
> > > > > > > > sites get 50%-90% of their traffic from Google, and Google
> thinks
> > > its
> > > > > > > > also correct to return 404 (
> > >http://www.google.com/url?sa=D&q=http://
> > > > > > > > googlewebmastercentral.blogspot.com/2008/08/farewell-to-
> > > > > > > > soft-404s.html, its in our best financial interest to play
> nice
> > > with
> > > > > > > > Google.
> >
> > > > > > > > > Specifically for 404 (when a template is not found we could
> do
> > > > > > > > > something like:
> >
> > > > > > > > > 1. In LiftRules instead of:
> >
> > > > > > > > > type URINotFoundPF = PartialFunction[(Req, Box[Failure]),
> > > > > > > > > LiftResponse]
> >
> > > > > > > > > use
> >
> > > > > > > > > type URINotFoundPF = PartialFunction[(Req, Box[Failure]),
> > > > > Either[List
> > > > > > > > > [String], LiftResponse]]
> >
> > > > > > > > > so that function can return a template path instead of
> > > response.
> >
> > > > > > > > > 2. In LiftSession#processRequest instead of applying the
> normal
> > > > > > > > > request pipeline only if the addressed template is found,
> we
> > > can
> > > > > use
> > > > > > > > > the path obtained from LiftRules.uriNotFound if Lift fails
> to
> > > find
> > > > > the
> > > > > > > > > normal tempalte. Hence apply the normal rendering pipeline
> to
> > > the
> > > > > > > > > template referenced by uriNotFound.
> >
> > > > > > > > > This approach allows your 404 case to be handled by the
> normal
> > > > > > > > > rendering pipeline without other hacks.
> >
> > > > > > > > > Unless someone thinks this is a bad solution, Alex you
> could
> > > open
> > > > > an
> > > > > > > > > issue and I'll work on it.
> >
> > > > > > > > Thanks for proposing that solution Marius.  I can't really
> > > comment on
> > > > > > > > whether or not its the right way to do it from Lift's point
> of
> > > view,
> > > > > > > > but as a user of Lift it sounds like it would work well.
> >
> > > > > > > > - Alex
> >
> > > > > > > --
> >
> > > > > > > You received this message because you are subscribed to the
> Google
> > > > > Groups "Lift" group.
> > > > > > > To post to this group, send email to lift...@googlegroups.com.
> > > > > > > To unsubscribe from this group, send email to
> > > > > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> <liftweb%2bunsubscr...@googlegroups.com<liftweb%252bunsubscr...@googlegroups.com>
> >
> > > <liftweb%2bunsubscr...@googlegroups.com<liftweb%252bunsubscr...@googlegroups.com>
> <liftweb%252bunsubscr...@googlegroups.com<liftweb%25252bunsubscr...@googlegroups.com>
> >
> >
> > > > > .
> > > > > > > For more options, visit this group athttp://
> > > > > groups.google.com/group/liftweb?hl=en.
> >
> > > > > --
> >
> > > > > You received this message because you are subscribed to the Google
> > > Groups
> > > > > "Lift" group.
> > > > > To post to this group, send email to lift...@googlegroups.com.
> > > > > To unsubscribe from this group, send email to
> > > > > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> <liftweb%2bunsubscr...@googlegroups.com<liftweb%252bunsubscr...@googlegroups.com>
> >
> > > <liftweb%2bunsubscr...@googlegroups.com<liftweb%252bunsubscr...@googlegroups.com>
> <liftweb%252bunsubscr...@googlegroups.com<liftweb%25252bunsubscr...@googlegroups.com>
> >
> >
> > > > > .
> > > > > For more options, visit this group at
> > > > >http://groups.google.com/group/liftweb?hl=en.
> >
> > > > --
> > > > Lift, the simply functional web frameworkhttp://liftweb.net
> > > > Beginning Scalahttp://www.apress.com/book/view/1430219890
> > > > Follow me:http://twitter.com/dpp
> > > > Surf the harmonics
> >
> > > --
> >
> > > You received this message because you are subscribed to the Google
> Groups
> > > "Lift" group.
> > > To post to this group, send email to lift...@googlegroups.com.
> > > To unsubscribe from this group, send email to
> > > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> <liftweb%2bunsubscr...@googlegroups.com<liftweb%252bunsubscr...@googlegroups.com>
> >
> > > .
> > > For more options, visit this group at
> > >http://groups.google.com/group/liftweb?hl=en.
> >
> > --
> > Lift, the simply functional web frameworkhttp://liftweb.net
> > Beginning Scalahttp://www.apress.com/book/view/1430219890
> > Follow me:http://twitter.com/dpp
> > Surf the harmonics
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Lift" group.
> To post to this group, send email to lift...@googlegroups.com.
> To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=en.
>
>
>


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

--

You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to lift...@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