golangでhtml/templateを使用したHTML表示を作成したので、理解したことを整理するために書いてみます。
フレームワークとしてechoを使用しています。
テンプレートファイル
読み込みを行うファイルを指定するので、ファイルの拡張子に決まりはないです。
「tpl」や「html」で大丈夫です。
ファイルリストの読み込み指定
list, err := template.New("t").ParseGlob("template/*.tpl")
t := &Template{
templates: template.Must(list, err),
}
Template構造体の宣言
type Template struct {
templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
echo にテンプレート情報を設定
e := echo.New() e.Renderer = t
goのソースから呼び出す際にがRendar関数で呼び出します。第二引数でテンプレートを指定し、第三引数で使用するパラメータを渡します。構造体も使用できます。
func Hello(c echo.Context) error {
return c.Render(http.StatusOK, "xxx", "aaa")
}
テンプレートファイルにはdefineとend構文でそれぞれ定義をしていきます。
{{define "xxx" }}
<html>
<head></head>
<body>{{.}}</body>
</html>
{{end}}
表示だけならこれでできます。
テンプレートフォルダを分ける
規模が大きくなるとファイル数が増えていき、可読性が下がるので、ディレクトリを複数指定できるようにしました。
探してみましたが、ディレクトリの指定が一つの場合が多く、複数指定の記事がなかったですね。
テンプレートファイルからテンプレートを呼び出す場合には、template文を使用します。引数を指定することが可能です。
{{define "name"}}
{{.}}さん
{{end}}
{{template "name" .Name}}
関数呼び出し
定義を作成し、templateに設定しておきます。
funcMap := template.FuncMap{
"name" : func(v string) string {
return v + "さん"
},
"nl2br": func(text string) template.HTML {
return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br />", -1))
},
}
list, err := template.New("t").Funcs(funcMap).ParseGlob("template/*.tpl")
テンプレートファイルからは、設定した関数名を呼び出すだけです。
{{nl2br .Memo}}
注意事項として、関数名を間違えると面倒でした。
Golandでのgoテンプレート補完
JetBrainsのGolandで開発を行なっていますが、templateのコード補完で調べても出てこないので、書いておきます。
以前一度見つけてから、再度見つけるのに時間がかかってしまったので、メモです。
参考
html/templateで困った際に参考にさせてもらったサイト
マニュアル
かなり理解できるようになりました。
- 作者: Mat Ryer,鵜飼文敏,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/01/22
- メディア: 大型本
- この商品を含むブログ (3件) を見る