假设您想要显示有关使用编译拼接的人员列表的信息(假设我们从由snap init
.)
一个非常简单的_persons.tpl
具有虚拟值的模板类似于
<body>
<person>
<div>
<h1><name>dummy name</name></h1>
<p><age>77</age></p>
<p><location>jauja</location></p>
</div>
</person>
</body>
Where person
, name
, age
, and location
是要拼接的标签。
我们定义一个简单的 Snaplet 来保存信息
data Foo = Foo
{
_persons :: [Person]
}
makeLenses ''Foo
data Person = Person
{
_name :: Text
, _age :: Int
, _location :: Text
}
makeLenses ''Person
我们将它添加到App
record:
data App = App
{ _heist :: Snaplet (Heist App)
, _sess :: Snaplet SessionManager
, _auth :: Snaplet (AuthManager App)
, _foo :: Snaplet Foo
}
我们将以下内容添加到应用程序初始化程序中
f <- nestSnaplet "foo" foo $ makeSnaplet "foo" "Foo Snaplet" Nothing $ return $ Foo $
[ Person "Ricardo" 33 "Los Cantones"
, Person "Luis" 38 "Montealto"
]
...
return $ App h s a f
该函数构造一个返回人员列表的处理程序(使用view
from Control.Lens
):
personH :: SnapletLens b Foo -> Handler b b [Person]
personH l = withTop l $ view persons <$> get
该函数从一个构造适当的编译器拼接RuntimeSplice
产生一个人员列表。RuntimeSplice
s 表示只能在运行时而不是加载时才能知道的信息:
personSplice :: Monad n => RuntimeSplice n [Person] -> C.Splice n
personSplice = C.manyWithSplices C.runChildren splicefuncs
where
splicefuncs = mconcat
[ "name" ## (C.pureSplice . C.textSplice $ view name)
, "age" ## (C.pureSplice . C.textSplice $ T.pack . show . view age)
, "location" ## (C.pureSplice . C.textSplice $ view location)
]
此功能可用于在全局 Heist 配置中注册拼接。请注意,我们举起了Handler
into a RuntimeSplice
:
addPersonSplices :: HasHeist b => Snaplet (Heist b) ->
SnapletLens b Foo ->
Initializer b v ()
addPersonSplices h l = addConfig h $ mempty
{
hcCompiledSplices = "person" ## (personSplice . lift $ personH l)
}
请务必将此行添加到应用程序初始值设定项中:
addPersonSplices h foo
并将以下对添加到应用程序的路由中:
("/persons", cRender "_persons")
如果您现在运行服务器,请导航到http://127.0.0.1:8000/persons
应该显示列表。
UPDATE
对于更简单的情况(没有复杂的记录,没有镜头),您只想显示字符串列表。
模板可能是这样的:
<body>
<strings>
<p><string>dummy value</string></p>
</strings>
</body>
顶层拼接将是:
stringSplice :: Monad n => C.Splice n
stringSplice = C.manyWithSplices C.runChildren splicefuncs (return ["aa","bb","cc"])
where
splicefuncs = "string" ## (C.pureSplice . C.textSplice $ id)
这意味着“当我们遇到与此拼接关联的标签时,执行一个生成字符串列表的操作,并为每个字符串呈现标签的内容,用当前字符串替换string
tag".
请注意,签名多带拼接 http://hackage.haskell.org/package/heist-0.13.0.2/docs/Heist-Compiled.html#v:manyWithSplices迫使东西在右边(##)
有类型RuntimeSplice n Text -> Splice n
. Here id
有类型Text -> Text
. C.TextSplice
将其转化为某种类型的东西Text -> Builder
, and C.pureSplice
执行最终转换为RuntimeSplice n Text -> Splice n
.
代替(return ["aa","bb","cc"])
您可以提供一个更复杂的操作来连接数据库并从那里提取字符串。
注册该拼接的函数是:
addStringSplices :: HasHeist b => Snaplet (Heist b) -> Initializer b v ()
addStringSplices h = addConfig h $ mempty
{
hcCompiledSplices = "strings" ## stringSplice
}