maf*_*maf 6 haskell web-applications haskell-snap-framework heist
我正在为在线调查写一个网站.我有一个问题列表,所有问题都在一个html页面上进行,列表的长度未知.每个问题都有表格存储在模板中qu1.tpl
,页面是qu.tpl
.现在我想:
qu1.tpl
为每个问题替换一些名称
qu.tpl
一次性更换一些东西
并坚持的所有实例qu1.tpl
进qu.tpl
用我在教程中了解到,我试图递归更换标签<qulist/>
与<apply template="qu1.tpl"><qulist/>
在qu.tpl
使用localHeist
和bindString
但这不能工作,因为qu.tpl
这样的新插入的应用标签不能解决已经呈现.
我该怎么做呢?
(我想这是一个更普遍的问题.如果您能想到答案适用的其他应用程序,请为搜索引擎添加文本和标签.)
在 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 文档中很容易被忽略。