【问题标题】:Lift - Getting the rendered output of a template in a string variableLift - 在字符串变量中获取模板的渲染输出
【发布时间】:2013-07-06 11:57:18
【问题描述】:

我们有一个用 Scala/Liftweb 编写的 Web 应用程序,运行良好。现在我们需要将一些视图/报告呈现为 PDF 文件。我们已经使用了可以采用格式良好的 XHTML 并将其输出为 PDF 的库,因此我试图将渲染的 Lift 模板的输出作为字符串输入到我们的 PDF 库中。

如何将模板的输出作为变量获取?我看到 this discussion David Pollak 谈到使用 S.render 返回 NodeSeq,但我们在这方面没有取得太大进展。

理想情况下,我会这样做:

val seq = S.render(NodeSeq, ???)
val stringOutput = seq.toString()    

【问题讨论】:

    标签: scala lift


    【解决方案1】:

    如果你做这样的事情,它应该呈现页面:

    val htmlString:Box[String] = for{
      r <- S.request
      t <- Templates("index" :: Nil)
    } yield S.render(t, r.request))
    

    其中index 应替换为您要呈现的模板的路径。这应该适用于基本实例,但如果您使用 Menu.params 或其他 URL 类型变量,则需要做一些额外的工作。

    更新:

    如果您需要在 HTTP 请求线程之外访问会话对象,则需要初始化会话。为此,您可以像这样修改上面的内容:

    val html = for{
      r <- S.request
      sn <- S.session 
      t <- Templates("index" :: Nil)
    } yield S.initIfUninitted(sn) { 
      S.render(t, r.request)) 
    }
    

    【讨论】:

    • 是的,应该可以,但是htmlString 上的返回类型将是Box[NodeSeq] - 你至少要在产量中做S.render(t, r.request).toString。
    • 糟糕,我还是有问题。我渲染了模板,但没有看到模板使用的任何 SessionVar 对象。它几乎就像在没有看到登录的用户对象的情况下运行模板一样。知道如何让 S.render 看到当前会话信息以便填充变量吗?
    • 您是否在与会话初始化的单独线程中进行处理?如果是这样,您可以使用S.initIfUninitted 方法。我将更新答案以显示您如何使用它
    • 这没有帮助。我想知道问题是否在于我在 RestHelper 对象中执行此操作。我会在 RestHelper 上阅读,看看我是否需要做一些特别的事情才能从那里看到会话。
    • 好的,问题是我用于我的 RestHelper 的 LiftRules 调用。我使用的是 LiftRules.statelessDispatchTable(MyRestHelperObject) - duh - 而不是 LiftRules.dispatch(MyRestHelperObject)。现在一切都好!
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2012-02-17
    • 2018-10-09
    • 2016-05-22
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多