模版文件读取
开发网站,我们是不可能将所有的页面都写在代码里的,对于前端工程师来说,他们可以写出.html页面。那么我们如何将.html文件读入到代码中呢。
Book的第十五章是有关于外部文件读取的,P187提供了读取文件的方法,即使用widgetFile
函数,他会自动读取templates
文件夹下的四种文件,那么我们如何使用呢
- 安装
hledger-web
库并加入到.cabal文件中 - import Settings
- 在src的同级建立目录templates
- 在templates中增加一个文件,例如homepage.hamlet
- 按Book上的方式增加代码
- 运行
- 补充:需要在代码中开启
{-# LANGUAGE TemplateHaskell #-}
模版的模版
如果我们需要将每个页面的Page注入到基础模版中,应该怎么做呢
getHomeR = do
pc <- widgetToPageContent $(widgetFile "homepage")
giveUrlRenderer $(hamletFile "templates/default-layout.hamlet")
homepage.hamlet内容
<h1>Hello Brant!
default-layout.hamlet内容
$doctype 5
<html>
<head>
<body>
<h1>This is template
^{pageBody pc}
如果需要动态设置某个参数
getHomeR = do
let keys = "Fruits"::Text
PageContent _ _ bodys <- widgetToPageContent $(widgetFile "homepage")
let title = "Home"::Text
giveUrlRenderer $(hamletFile "templates/defaule-layout-wrapper.hamlet")
homepage的内容
<h1>Hello Brant!
<ol>#{keys}
<li>apple
<li>banana
default-layout-wrapper.hamlet的内容
$doctype 5
<html>
<head>
<title>#{title}
<bodu>
<h1>This is template
<h2>#{keys}
^{bodys}
也就是说,从widgetFile
拿到的文件,通过widgetToPageContent
进行了转换。虽然说是构成一个PageContent title headTags bodyTags
,但其实title
和headTags
并没有什么(luan)用,必须通过手工设置。当然也可以再用另一个widgetFile
获取到,只要参照上面的实例,让参数名保持在上下文中即可。切一个关键字可以对应多个XXXFile
的上下文–参见keys
的用法。至此,我们已经具备了一个小型网站的template
结构化