在default-layout-wrapper.hamlet文件中,有^ {pageBody pc}允许我嵌入正文内容。我可以在Foundation.hs文件中找到 pc 部分。但是pageBody在哪里构建(在什么文件中)? 这个变量的相同问题#{pageTitle pc}。
答案 0 :(得分:2)
stackage.org上的Hoogle是解决这些问题的绝佳资源:
答案 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