環境
やりたいこと
- http/templateを使う
- layout.htmlの中で、各パスに対応したHTMLを表示したい
- 雑に言うと、Railsのpartialみたいなことをしたい
やったこと
github.com
テンプレートを登録する部分
e := echo.New()
t := template.Must(template.New("base").Funcs(sprig.FuncMap()).ParseGlob("views/*.html"))
t.ParseGlob("views/*/*.html")
e.Renderer = &utils.Template{
Templates: t,
}
e.GET("/", controller.GetPokemons)
e.GET("/pokemons", controller.GetPokemons)
e.GET("/types", controller.GetTypes)
return e
テンプレートを返す部分
type Template struct {
Templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return template.Must(template.Must(t.Templates.Lookup("layout").Clone()).AddParseTree("content", t.Templates.Lookup(name).Tree)).ExecuteTemplate(w, "layout", data)
}
共通レイアウト
{{- define "layout" }}
{{- $param := . }}
<htmllang="ja"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>{{- $param.pageTitle }}</title></head><body><divclass="container">
{{- template "content" }}
</div></body></html>
{{ end -}}
呼び出し元
func GetPokemons(c echo.Context) error {
return c.Render(http.StatusOK, "pokemons/index", map[string]interface{}{
"pageTitle": "ポケモン一覧",
})
}
func GetTypes(c echo.Context) error {
return c.Render(http.StatusOK, "types/index", map[string]interface{}{
"pageTitle": "タイプ一覧",
})
}
テンプレート
{{- define "pokemons/index" }}
<h2>pokemons index!!</h2>
{{- end }}
{{- define "types/index" }}
<h2>types index!!</h2>
{{- end }}
参考URL