^ {pageBody pc}来自哪里?

时间:2015-05-19 09:58:20

标签: haskell yesod

在default-layout-wrapper.hamlet文件中,有^ {pageBody pc}允许我嵌入正文内容。我可以在Foundation.hs文件中找到 pc 部分。但是pageBody在哪里构建(在什么文件中)? 这个变量的相同问题#{pageTitle pc}。

3 个答案:

答案 0 :(得分:2)

stackage.org上的Hoogle是解决这些问题的绝佳资源:

http://www.stackage.org/lts/hoogle?q=pageBody

答案 1 :(得分:0)

pageBody是一个在"变量"上调用的函数。叫做pc。像迈克尔所说,pageBody是标准Yesod库的一部分。当你的页面模板由whamlet引擎处理时,它将被评估(这就是^ {...}所做的)。如果您实际使用Yesod创建一个脚手架网站,请花一些时间阅读自动生成的处理函数 - 您将看到如何处理模板。

答案 2 :(得分:0)

简化类型:

XOR

... 代码示例:

data PageContent url = PageContent
    { pageTitle :: Html
    , pageHead :: HtmlUrl url
    , pageBody :: HtmlUrl url
    }
widgetToPageContent :: Widget -> Handler (PageContent url)

和scafolding Foundations.hs:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
import           Yesod

data App = App
mkYesod "App" [parseRoute|
/ HomeR GET
|]

myLayout :: Widget -> Handler Html
myLayout widget = do
    pc <- widgetToPageContent $ do
        widget
        toWidget [lucius| body { font-family: arial } |]
    withUrlRenderer
        [hamlet|
            $doctype 5
            <html>
                <head>
                    <title>#{pageTitle pc}
                    <meta charset=utf-8>
                    ^{pageHead pc}
                <body>
                    <article>
                        ^{pageBody pc}
        |]

instance Yesod App where
    defaultLayout = myLayout

getHomeR :: Handler Html
getHomeR = defaultLayout
    [whamlet|
        <p>Some text!
    |]

main :: IO ()
main = warp 3000 App