如何在IHP应用程序中更改<title>?

问题描述

我看到<title>App</title>硬编码在Web / View / Layout.hs的defaultLayout中,而Web / View / Context.hs具有

    let viewContext = ViewContext {
            requestContext = ?requestContext,user = currentUserOrnothing,flashMessages,controllerContext = ?controllerContext,layout = let ?viewContext = viewContext in defaultLayout
        }

但是如何为特定的View使用其他功能? View类的html函数似乎没有返回新的上下文,只是部分页面的新html。

解决方法

弄清楚了:您可以在beforeRender类中重写一个View函数,例如,

data ShowView = ShowView { targets :: [Include "comments" Post],postTitle :: Text }

instance View ShowView ViewContext where
    beforeRender (context,view) = (context { layout = myLayout (postTitle view) },view)
    html ShowView { .. } = [hsx| … |]

(并在Web / Controller / Posts.hs中设置postTitle,然后将Web / View / Layout.hs更改为

defaultLayout :: Html -> Html
defaultLayout = myLayout "App"

myLayout :: Text -> Html -> Html
myLayout title inner = H.docTypeHtml ! A.lang "en" $ [hsx|
<head>
    {metaTags}

    {stylesheets}
    {scripts}

    <title>{title}</title>
</head>
<body>
    <div class="container mt-4">
        {renderFlashMessages}
        {inner}
    </div>
</body>
|]