### 模板
#### 模板渲染
* Context#ViewData().Set(key string, value interface{}) error
用于向模板傳遞自定義數據,可多次調用
* Context#View(name string) error
Context#ViewC(code int, name string) error
用于渲染一個模板,然后可選擇發送一個 text/html 的狀態響應,默認為200。我們可以使用任何模板引擎,只要實現DotWeb.Renderer接口,并使用 DotWeb.HttpServer#SetRenderer()注冊。
* Renderer#SetTemplatePath(path ...string)
用于設置模板引擎默認搜索目錄,板查找順序從最后一個插入的元素開始往前找
默認設置:
* 框架默認自帶Go html/template的Render實現
* 模板根目錄默認添加base、base/templates、base/views,其中base為執行文件所在目錄
#### 默認Go html/template用法:
~~~
app.HttpServer.Renderer().SetTemplatePath("/wwwroot/views/")
func TestView(ctx dotweb.Context) error {
ctx.ViewData().Set("data", "圖書信息")
ctx.ViewData().Set("user", &UserInfo{UserName: "user1", Sex: true})
err := ctx.View("testview.html")
return err
}
~~~
首先設置模板默認目錄,在使用模板時,只需指定模板名稱即可。
testview.html:
~~~
<html>
<head><title>load common template</title></head>
<body>
<h1>{{.data}}</h1>
<div>
<b>User Profile:</b>
<br>
UserName => {{.user.UserName}}
<br>
Sex => {{.user.Sex}}
</div>
</body>
</html>
~~~
#### 自定義模板
通過實現DotWeb.Renderer接口,并使用 DotWeb.HttpServer#SetRenderer()注冊。
例如,我們使用github.com/CloudyKit/jet 模板
首先,我們定義struct
~~~
type jetRenderer struct {
htmlSet *Set
}
~~~
實現Render接口
~~~
func (r *jetRenderer) Render(w io.Writer, tpl string, data interface{}, ctx *dotweb.HttpContext) error {
view, err := r.htmlSet.GetTemplate(tpl)
fmt.Println(view, err)
if err != nil {
fmt.Println("Unexpected template err:", err.Error())
}
//if use vars mode, template not use "."
vars := convertMapToVar(data)
return view.Execute(w, vars, nil)
//if use data mode, template use "."
//return view.Execute(w, nil, data)
}
~~~
實現SetTemplatePath接口
~~~
func (r *jetRenderer) SetTemplatePath(path ...string) {
r.htmlSet = jet.NewHTMLSet(path)
}
~~~
實現New函數
~~~
func NewJetRenderer() *jetRenderer {
r := new(jetRenderer)
return r
}
~~~
注冊jet模板
~~~
app.HttpServer.SetRenderer(NewJetRenderer().Reload(true))
app.HttpServer.Renderer().SetTemplatePath("/wwwroot/views/")
~~~
到此,就已經實現了自定義Render,在Context中的使用方法與默認模板一致