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一起表达的正确类型是什么?
答案 0 :(得分:2)
我怀疑,您可以首先使用Widget
或Handler
和defaultLayout
将widgetToPageContent
变为withUrlRenderer
,然后使用此微小“运行”它助手:
handler :: Handler a -> IO a
handler h = getAppSettings >>= makeFoundation >>= flip unsafeHandler h
您也可以使用handler . runDB
以这种方式“运行”数据库操作。