如何独立于外部请求呈现Widget一次?

时间:2017-05-14 21:48:04

标签: html haskell yesod monad-transformers

Yesod使得通过Widget端口从外部请求的网页(由warp构建)呈现为HTML非常简单。为什么,这当然正是我们通常需要HTML的地方。

但是,如果我还需要一份用于“内部目的”的HTML副本,而不是通常的Handler设置?您认为Widget本质上只是一个读者/作者组合,阅读Yesod并编写HTML,CSS和JS结果的元组。 The documentation itself说“......这只是WriterT ......”。好的,但是......

newtype WidgetT site m a = WidgetT
    { unWidgetT :: HandlerData site (MonadRoute m) -> m (a, GWData (Route site))
    }

handlerdatasiteroutegwdataroute ...呃。

如何调用此方法并获取通常只是直接发送到客户端的结果HTML ,而不实际将小部件嵌入到任何Handler中?

所以,我基本上想要

runWidget :: Widget -> MyYesod -> IO Html

             WidgetT MyYesod IO () -> MyYesod -> IO Html

我只是缺少一些能够做到这一点的功能,或者是否存在问题 - 或许小部件实际上比我想象的更强大?如果是这样,那么将 Writer HTML和CSS一起表达的正确类型是什么

1 个答案:

答案 0 :(得分:2)

我怀疑,您可以首先使用WidgetHandlerdefaultLayoutwidgetToPageContent变为withUrlRenderer,然后使用此微小“运行”它助手:

handler :: Handler a -> IO a
handler h = getAppSettings >>= makeFoundation >>= flip unsafeHandler h

您也可以使用handler . runDB以这种方式“运行”数据库操作。