【问题标题】:need to render several html snippets in different places inside a hamlet template需要在 hamlet 模板内的不同位置渲染几个 html 片段
【发布时间】:2025-12-26 06:45:06
【问题描述】:

在我的default-layout.hamlet

!!!
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>#{pageTitle pc}
    ^{pageHead pc}
  <body>
    <div id="main">
      <div id="header">
        ????
      <div id="content">
        ^{pageBody pc}

从一个处理函数,我需要用一些 HTML 内容替换上面的????

这是怎么做到的?

感谢您的任何意见。

编辑:

我正在寻找类似于 django 的模板块的功能。我可以在模板中定义一个块,并且使用该模板进行渲染的处理程序可以用所需的内容填充模板的块。现在,yesod 在模板的主体中实际上只有一个块。由调用^{pageBody pc}“定义”。我知道我可以使用addWidget 等以任何我想要的方式构建由pageBody 生成的输出,但是现在我也需要输出我的&lt;div id="header"&gt;&lt;div id="content"&gt;,我想避免这种情况,因为我所有的处理程序必须输出这些 div 以在所有页面中具有相同的标记结构。

【问题讨论】:

  • 任何原因 #{...} 插值不起作用?
  • 你能举个例子如何使用它吗?
  • 您说的是“一些 HTML 内容”。我不太清楚你的意思,但如果你有一个名为foo 类型为Html 的变量,那么你可以替换???? #{foo}.
  • 要在 default-layout.hamlet 中呈现我的变量,我需要在我的基础类型的 defaultLayout 中定义这个变量。如果我这样做,插值工作。我正在寻找一种方法来在我的处理程序中定义这个变量,并且仍然在 default-layout.hamlet 中使用它。我想在 default-layout.hamlet 中有通用的 HTML 结构,处理程序将根据需要填写。
  • 为什么不能在defaultLayout函数里面定义变量呢?我不完全确定您在这里的目的是什么,您能否扩展您的问题以使其更清楚?

标签: yesod hamlet


【解决方案1】:

我认为答案是在defaultLayout之外定义一个函数。 defaultLayout 的唯一神奇之处在于子站点(例如 auth)和错误消息默认使用它。但是您可以定义一个“myDefaultLayout”来获取您想要的其他内容。您甚至可以定义一个辅助函数,将额外的块包装成一个块,然后将其传递给 defaultLayout。

【讨论】: