13 HTML Template Function
Pengenalan Template Function
Selain mengakses field dalam template, kita juga bisa melakukan akses terhadap suatu fungsi atau function dalam golang. Cara untuk mengakses function sama seperti halnya mengakses field namun jika fungsi tersebut memiliki parameter maka kita bisa gunakan tambahan parameter yang dikirim ketika memanggil fungsi di template-nya tersebut.
Cara untuk melakukan pemanggilan tersebut yaitu dengan menggunakan {{.FunctionName}} ini adalah memanggil field FunctionName atau function FunctionName(). Contoh cara lain lagi seperti {{.FunctionName "santekno","hello"}} berarti ini sama halnya seperti memanggil function FunctionName("santekno","hello").
Cara Implementasi
Baik kita akan coba membuat suatu function yang nantinya akan kita akses dalam template. Sebelumnya kita buat terlebih dahulu struct dibawah ini.
1type MyPage struct {
2 Name string
3}
4
5func (myPage MyPage) SayHello(name string) string {
6 return "Hello " + name + " , My name is " + myPage.Name
7}Lalu kita buat handler yang mana kita akan mengirim functionnya ke dalam template yang akan kita buat.
1func TemplateFunctionHandler(w http.ResponseWriter, r *http.Request) {
2 t := template.Must(template.New("FUNCTION").
3 Parse(`{{ .SayHello "Santekno" }}`))
4 t.ExecuteTemplate(w, "FUNCTION", Page{
5 Title: "Hello",
6 Name: "Santekno",
7 })
8}mux function agar bisa diakses pada browser.1 mux.HandleFunc("/template-function", TemplateFunctionHandler)Hello Santekno , My name is Santekno.Global Function
Pada Golang template memiliki beberapa global function. Global function adalah function yang bisa digunakan secara langsung tanpa menggunakan template data. Berikut adalah beberapa global function Golang Template bisa diakses di sini. https://github.com/golang/go/blob/master/src/text/template/funcs.go
Baik kita akan coba menggunakan Global Function ini pada template dengan buat fungsi handler terlebih dahulu.
1func TemplateGlobalFunctionHandler(w http.ResponseWriter, r *http.Request) {
2 t := template.Must(template.New("FUNCTION").
3 Parse(`{{ len .Name }}`))
4
5 t.ExecuteTemplate(w, "FUNCTION", Page{
6 Title: "Hello",
7 Name: "Santekno",
8 })
9}1 mux.HandleFunc("/template-global-function", TemplateGlobalFunctionHandler)8. Kalau dilihat karena variabel .Name ini diisi oleh Santekno maka jumlah huruf dari Santekno itu adalah 8.Menambahkan Manual Global Function
Kita juga bisa menambahkan global function secara manual dimana untuk menambahkan global function manual, kita bisa menggunakan method Funcs pada template. Perlu diingat bahwa untuk menambahkan global function harus dilakukan sebelum melakukan parsing template.
Pertama, kita akan buat template handler-nya terlebih dahulu seperti dibawah ini.
1func TemplateManualGlobalFunctionHandler(w http.ResponseWriter, r *http.Request) {
2 t := template.New("FUNCTION")
3 t.Funcs(template.FuncMap{
4 "upper": func(value string) string {
5 return strings.ToUpper(value)
6 },
7 })
8 t = template.Must(t.Parse(`{{ upper .Name }}`))
9 t.ExecuteTemplate(w, "FUNCTION", Page{
10 Title: "Hello",
11 Name: "Santekno",
12 })
13}1 mux.HandleFunc("/template-manual-global-function", TemplateManualGlobalFunctionHandler)Terakhir kita jalankan apa yang sudah kita buat dengan perintah terminal
1go build && ./learn-golang-webHasilnya pun akan menampilkan pada browser SANTEKNO dengan huruf kapital semuanya karena kita sudah membuat custom function yang sudah didaftarkan pada template.
Function Pipelines
Golang template mendukung function pipelines yang mana hasil dari suatu function bisa dikirim ke function berikutnya. Jika kita ingin menggunakan function pipelines, kita bisa menggunakan tanda | misalkan:
- {{ sayHello .Name | upper }} berarti kita akan memanggil global function
sayHello(Name)lalu hasil dari fungsi tersebut akan dikirim ke dalam fungsiupper(Result). Dan pada Golang template ini kita bisa menambahkan function pipelines lebih dari satu.
Kita coba tambahkan lagi dengan membuat handler baru seperti dibawah ini.
1func TemplateFunctionPipelinesHandler(w http.ResponseWriter, r *http.Request) {
2 t := template.New("FUNCTION")
3 t.Funcs(template.FuncMap{
4 "sayHello": func(name string) string {
5 return "Hello " + name
6 },
7 "upper": func(value string) string {
8 return strings.ToUpper(value)
9 },
10 })
11 t = template.Must(t.Parse(`{{ sayHello .Name | upper }}`))
12 t.ExecuteTemplate(w, "FUNCTION", Page{
13 Title: "Hello",
14 Name: "Santekno",
15 })
16}mux1 mux.HandleFunc("/template-function-pipelines", TemplateFunctionPipelinesHandler)Jalankan kembali program dan lihat hasilnya, maka akan menampilkan HELLO SANTEKNO dengan huruf besar semuanya.