GoFrame 模板布局指南
GoFrame 的 gview
模板引擎支持两种布局方式:
define
+template
方式include
模板嵌入方式
这两种方式都支持模板变量的传递。
define + template 方式
这种方式利用 gview
底层的 ParseFiles
机制,通过 define
标签定义模板块,然后使用 template
标签在其他模板文件中引用。
重要说明:
- 传递变量给子模板时,使用
{{template "xxx" .}}
语法- 所有模板文件的后缀名必须保持一致
示例代码
layout.html:
<!DOCTYPE html>
<html>
<head>
<title>GoFrame Layout</title>
{{template "header" .}}
</head>
<body>
<div class="container">
{{template "container" .}}
</div>
<div class="footer">
{{template "footer" .}}
</div>
</body>
</html>
header.html:
{{define "header"}}
<h1>{{.header}}</h1>
{{end}}
container.html:
{{define "container"}}
<h1>{{.container}}</h1>
{{end}}
footer.html:
{{define "footer"}}
<h1>{{.footer}}</h1>
{{end}}
main.go:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.WriteTpl("layout.html", g.Map{
"header": "This is header",
"container": "This is container",
"footer": "This is footer",
})
})
s.SetPort(8199)
s.Run()
}
include 模板嵌入方式
使用 include
标签实现页面布局是另一种更直接的方式。
重要说明:
- 传递变量给子模板时,使用
{{include "xxx" .}}
语法- 支持动态模板路径
示例代码
layout.html:
{{include "header.html" .}}
{{include .mainTpl .}}
{{include "footer.html" .}}
header.html:
<h1>HEADER</h1>
footer.html:
<h1>FOOTER</h1>
main1.html:
<h1>MAIN1</h1>
main2.html:
<h1>MAIN2</h1>
main.go:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/main1", func(r *ghttp.Request) {
r.Response.WriteTpl("layout.html", g.Map{
"mainTpl": "main/main1.html",
})
})
s.BindHandler("/main2", func(r *ghttp.Request) {
r.Response.WriteTpl("layout.html", g.Map{
"mainTpl": "main/main2.html",
})
})
s.SetPort(8199)
s.Run()
}
两种方式的对比
-
define + template 方式:
- 更适合复杂的模板结构
- 支持跨模板引用
- 需要显式定义模板块
- 所有模板文件后缀必须一致
-
include 方式:
- 语法更简单直观
- 支持动态模板路径
- 更灵活的文件组织方式
- 不需要预定义模板块