【问题标题】:How would you create your own default layout in Yesod?您将如何在 Yesod 中创建自己的默认布局?
【发布时间】:2022-01-20 18:36:21
【问题描述】:

我是一名 C# 后端开发人员,正在尝试使用 haskell 和 Yesod 学习 Web 开发,所以请多多包涵。

我的问题是,关于创建自己的默认布局的约定是什么。您应该在代码中动态创建它还是更改标记?

据我了解,这意味着整个网络应用程序的一致性,至少对于使用默认布局的部分而言。因此,它通常是静态的,在运行时对于使用它的每个部分都保持不变,直到您希望更改一次,并让它影响使用它的每个部分。无需为每个加载的页面生成默认布局。

非常感谢。

【问题讨论】:

  • 我认为约定是分离关注点,所以使用 hamlet 文件并在代码中引用它们。 Yesod Book 有例子。

标签: haskell layout widget yesod conventions


【解决方案1】:

两者兼而有之。

如果您使用Yesod scaffolding,则主页的示例处理程序使用定义如下的函数defaultLayout

defaultLayout :: Widget -> Handler Html
defaultLayout widget = do
    master <- getYesod
    mmsg <- getMessage

    muser <- maybeAuthPair
    mcurrentRoute <- getCurrentRoute

    -- Get the breadcrumbs, as defined in the YesodBreadcrumbs instance.
    (title, parents) <- breadcrumbs

    -- Define the menu items of the header.
    ...

    pc <- widgetToPageContent $ do
        addStylesheet $ StaticR css_bootstrap_css
        $(widgetFile "default-layout")
    withUrlRenderer $(hamletFile "templates/default-layout-wrapper.hamlet")

这会设置一些动态信息(任何待处理的“消息”?用户已通过身份验证?),然后使用 templates 目录中的两个静态 Hamlet 模板呈现页面(即,defaultLayoutWidget 参数):

default-layout-wrapper.hamlet
default-layout.hamlet

第一个是站点范围的&lt;html&gt; 元素模板,除了&lt;body&gt; 的内容放在第二个模板中。由于某些技术原因,它们被分开了。

因此,默认布局是使用静态 Hamlet 模板的动态 defaultLayout 函数的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2015-02-12
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多