2017-05-14 2 views
4

Yesod는 외부에서 warp의 포트를 통해 요청할 때마다 HTML로 렌더링되는 웹 페이지 (Widget에서 작성)를 매우 간단하게 만듭니다. 왜, 물론 그것은 우리가 보통 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 ... ugh.

Handler에 실제로 위젯을 삽입하지 않고도이 코드를 호출하고 클라이언트에게 바로 보내지는 결과 HTML을 얻으려면 어떻게해야합니까??

그래서, 기본적으로

원하는
runWidget :: Widget -> MyYesod -> IO Html 

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

난 그냥이 작업을 수행하거나 문제가 일부 기능 실종 - 아마도 위젯 실제로 내가 생각했던 것보다 더 강력를? 그렇다면 HTML과 CSS의 Writer을 함께 표현하는 올바른 유형은 무엇입니까?

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

또한 DB를 "실행"을 handler . runDB를 사용할 수 있습니다

답변

2

난 당신이 defaultLayout 또는 widgetToPageContentwithUrlRenderer 첫째을 사용하여 Handler으로 Widget을 켠 다음이 작은 도우미와 함께 "실행"수, 의심 이렇게 행동하십시오.

+0

'do {html <- defaultLayout 위젯; sendByEmail 수신자 html}' – Jakub

관련 문제