Heist:如何将子模板的动态列表插入模板?

maf*_*maf 6 haskell web-applications haskell-snap-framework heist

我正在为在线调查写一个网站.我有一个问题列表,所有问题都在一个html页面上进行,列表的长度未知.每个问题都有表格存储在模板中qu1.tpl,页面是qu.tpl.现在我想:

  1. qu1.tpl为每个问题替换一些名称

  2. qu.tpl一次性更换一些东西

  3. 并坚持的所有实例qu1.tplqu.tpl

用我在教程中了解到,我试图递归更换标签<qulist/><apply template="qu1.tpl"><qulist/>qu.tpl使用localHeistbindString但这不能工作,因为qu.tpl这样的新插入的应用标签不能解决已经呈现.

我该怎么做呢?

(我想这是一个更普遍的问题.如果您能想到答案适用的其他应用程序,请为搜索引擎添加文本和标签.)

mig*_*yte 4

在 Heist 中,当您执行涉及动态数据计算的操作时,通常会使用拼接。前两点可以通过绑定接头来处理。对于第三点,我将首先创建一个呈现特定问题模板的 splice 函数。它看起来像这样:

questionSplice :: Monad m => Int -> Splice m
questionSplice n = do
  splices <- setupSplicesForThisQuestion
  mTemplate <- callTemplate (B.pack ("qu"++(show n))) splices
  return $ fromMaybe [] mTemplate
Run Code Online (Sandbox Code Playgroud)

现在您可以为调查问题列表创建一个拼接:

surveyQuestions :: Monad m => Splice m
surveyQuestions = do
  questions <- getSurveyQuestions
  mapSplices questionSplice questions
Run Code Online (Sandbox Code Playgroud)

然后您可以将此拼接绑定到特定标签并在 qu.tpl 或任何其他模板中的任何位置使用它。

这里重要的部分是 callTemplate 函数。这是 Heist 的函数,用于从 TemplateMonad 计算内部渲染模板。我认为教程中对此没有过多讨论,因为它不是人们通常关心的用例,并且在 API 文档中很容易被忽略。