2017-05-14 14 views
4

Yesodは、warpのポートを通じて外部から要求されたときはいつでも、Webページ(Widgetから構築)をHTMLにレンダリングするのが非常に簡単です。なぜなら、それはもちろん、正確には、通常はにはHTMLが必要です。ウィジェットを外部リクエストとは関係なく1回だけレンダリングするには?

しかし、通常のHandlerの設定とは独立して生成された「内部目的」のHTMLのコピーが必要な場合はどうなりますか? Widgetは本質的に単なるリーダー/ライターの組み合わせで、Yesodを読んで、HTML、CSS、JSの結果のタプルを書いていると思います。 The documentation itselfは "...これは単にWriterT ..."と言っています。 [OK]を、しかし...

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

ハンドラデーターアウトアウトデータルート... ugh。

実際にウィジェットをHandlerに埋め込むことなく、これを呼び出して通常はクライアントに直接送信される結果HTMLを得るにはどうすればよいですか?

だから、私は基本的にしたい

runWidget :: Widget -> MyYesod -> IO Html 

すなわち

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

は、私はちょうどこれを行い、いくつかの機能が欠けアム、または問題がある - おそらくウィジェットは実際に私が思ったよりも強力ですか?もしそうなら、HTMLとCSSを合わせてWriterだけを表現する正しいタイプは何でしょうか

答えて

2

私はあなたが最初defaultLayoutあるいはwidgetToPageContentwithUrlRendererを使用してHandlerWidgetをオンにしてから、この小さなヘルパーでそれを「実行」することができ、疑う:

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

あなたはまた、DBを「実行」するhandler . runDBを使用することができますこのように行動する。

+0

'do {html < - defaultLayout widget; sendByEmail受信者html} ' – Jakub

関連する問題