pemrograman

09 Mengenal HTML Template

Web Dinamis menggunakan Template

Pada postingan sebelumnya kita telah membahas web dinamis tetapi dengan menggunakan respon string yang terdapat pada statik file. Maka pada kesempatan kali ini kita akan mencoba mengenal templating pada golang dimana halaman katakanlah html tersebut akan dinamis dan bisa berubah-ubah dengan data yang diakses oleh user.

Golang memiliki fitur HTML template yang mana fitur tersebut bisa kita gunakan untuk membuat HTML yang dinamis. Fitur ini terdapat pada package html/template. Sebelum kita menggunakan HTML template, kita perlu membuat template-nya terlebih dahulu lalu nanti akan kita kirimkan variabel, string ataupun file sehingga ada bagian dinamis pada HTML Template yang mana pada golang akan menggunakan tanda {{ }}.

Membuat HTML Template

Saat kita membuat template dengan string, kita perlu memberi tahu nama template-nya dengan menggunakan text template yang mana konten tersebut yang akan kita jadikan dinamis dengan menggunakan tanda {{.}}. Misalkan seperti ini.

<html>
	<body>{{.}}</body>
</html>

Agar lebih paham lagi kita coba langsung saja membuat HTML Template string seperti dibawah ini.

func SimpleHTMLTemplateHandler(w http.ResponseWriter, r *http.Request) {
	templateText := `<html><body>{{.}}</body></html>`
	t, err := template.New("SIMPLE").Parse(templateText)
	if err != nil {
		panic(err)
	}

	t.ExecuteTemplate(w, "SIMPLE", "Hello HTML Template")
}

Setelah itu kita daftarkan fungsi handler kita ke dalam handler mux yang sudah kita pelajari sebelumnya seperti dibawah ini.

	...
	mux.HandleFunc("/template", SimpleHTMLTemplateHandler)
	...

Lalu kita jalankan dan akses localhost:8080/template maka akan keluar halaman website dengan menampilkan kata Hello HTML Template. Berarti halaman template kita sudah benar dan bisa diakses pada browser.

Membuat HTML Template Dari File

Selain membuat template menggunakan string seperti yang sebelumnya sudah dibuat, kita juga bisa membuat langsung dari file. Hal ini memudahkan kita untuk langsung membuat file HTML dan ketika kita menggunakan file secara otomatis nama file tersebut menjadi nama template-nya. Misalkan kita punya file simple.html maka nama template-nya itu adalah sample.html.

Kita coba langsung untuk membuat HTML Template ini dari file dengan membuat file simple.html pada project dan pada folder templates ini lalu isi seperti dibawah ini.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>{{ . }}</title>
  </head>
  <body>
    <h1>{{ . }}</h1>
  </body>
</html>

Selanjutnya, kita buat baru handler lagi untuk menambahkan endpoint yang mana bisa membaca file HTML Template seperti dibawah ini.

func SimpleHTMLFileTemplateHandler(w http.ResponseWriter, r *http.Request) {
	t, err := template.ParseFiles("./templates/simple.html")
	if err != nil {
		panic(err)
	}

	t.ExecuteTemplate(w, "simple.html", "Hello Santekno, HTML File Template")
}

Setelah dibuat handler-nya jangan lupa tambahkan atau inisialisasi juga pada main handleFunc agar bisa diakses oleh browser URL-nya.

	...
	mux.HandleFunc("/template-file", SimpleHTMLFileTemplateHandler)
	...

Jalankan kembali dan lihat hasilnya, kita sudah bisa membuat HTML Template menggunakan File template dengan mengirimkan variabel ke dalam html tersebut sehingga nanti bisa kita buat dinamis variabel tersebut.

Template Directory

Biasanya kita jarang sekali menyebutkan file template satu persatu maka baiknya untuk template ini kita simpan dalam satu direktori. Golang template tersebut sudah mendukung proses load template dari direktori sehingga memudahkan kita agar tidak perlu menyebutkan satu persatu nama file-nya.

func TemplateDirectoryHanlder(w http.ResponseWriter, r *http.Request) {
	t := template.Must(template.ParseGlob("./templates/*.html"))
	t.ExecuteTemplate(w, "simple.html", "Hello Santekno, HTML Directory File Template")
}

Sejak Golang 1.16 sudah mendukung Golang Embed sehingga direkomendasikan Golang Embed untuk menyimpan data template. Dengan menggunakan Golang Embed kita tidak perlu lagi ikut meng-copy template file lagi karena sudah otomatis di embed di dalam distribution file-nya.

// go:embed templates/*.html
var templates embed.FS

func TemplateEmbedHandler(w http.ResponseWriter, r *http.Request) {
	t, err := template.ParseFS(templates, "templates/*.html")
	if err != nil {
		panic(err)
	}

	t.ExecuteTemplate(w, "simple.html", "Hello Santekno, HTML Embed Template")
}

Lalu jangan lupa tambahkan juga pada handler mux untuk tambahan template handler yang sudah kita buat tersebut seperti ini.

	...
	mux.HandleFunc("/template-directory", TemplateDirectoryHanlder)
	mux.HandleFunc("/template-embed", TemplateEmbedHandler)
	...
comments powered by Disqus