pemrograman

11 HTML Template Action

Pengenalan Template Action

Tidak hanya teks saja kita bisa render dalam template tetapi kita juga bisa mendukung perintah action seperti percabangan if, perulangan for dan lain-lain. Contoh misalkan kita menggunakan percabangan if seperti ini

Percabangan dengan satu kondisi

{{if .Value}} A1 {{ end }}

Jika Value tidak kosong, maka A1 akan dieksekusi dan jika kosong tidak ada yang akan di eksekusi

Percabangan dengan 2 kondisi

{{if .Value}} A1 {{ else }} A2 {{ end }}

Jika Value tidak kosong, maka A1 akan dieksekusi dan jika kosong akan mengeksekusi A2.

Percabangan dengan 3 Kondisi

{{if .Value1}} A1 {{else if .Value2}} A2 {{ else }} A3 {{ end }}

Jika Value1 tidak kosong, maka A1 akan dieksekusi dan jika Value2 tidak kosong maka akan mengeksekusi A2 dan jika tidak semuanya maka A3 akan dieksekusi.

Implementasi Template If Statement

Berikut ini contoh implementasi template jika kita menggunakan kondisi If statement pada file if.html

<html>
	<body>
		{{if .Name}}
		<h1>Hello {{.Name}}</h1>
		{{else}}
		<h1>Hai</h1>
		{{ end }}
	</body>
</html>

Lalu kita lanjutkan dengan membuat handler fungsi untuk menampilkan halaman yg sudah kita buat.

func TemplateActionIfHandler(w http.ResponseWriter, r *http.Request) {
	t := template.Must(template.ParseFiles("./templates/if.html"))
	t.ExecuteTemplate(w, "if.html", map[string]interface{}{
		"Name": "Santekno",
	})
}

Pada handler ini kita menggunakan map[string]interface{} untuk mengirim data dari handler. Selanjutnya jangan lupa kita tambahkan juga pada route pada file main.go agar halaman yang sudah kita buat bisa di akses pada browser.

mux.HandleFunc("/template-action-if",TemplateActionIfHandler)

Implementasi Template Operator Statement

Selain mendukung kondisi, operator perbandingan pun sudah didukung oleh golang template sehingga kita bisa gunakan untuk membandingkan numer di if statement berikut contoh operator-nya.

OperatorContoh
eqarg1 == arg2
nearg1 != arg2
ltarg1 < arg2
learg1 <= arg2
gtarg1 > arg2
gearg1 >= arg2

Baiklah kita akan coba implementasikan operator yang ada dengan menggunakan if statement. Anda bisa buat file baru dengan nama file comparator.html dengan isi html seperti dibawah ini.

<html>
	<body>
		{{if ge .Value 80}}
		<h1>Good</h1>
		{{else if ge .Value 60}}
		<h1>Nice Try</h1>
		{{else}}
		<h1>Try Again</h1>
		{{end}}
  </body>
</html>

Kenapa operatornya di depan? Hal ini dikarenakan operator perbandingan ini sebuah function atau sering kita dengar function programming. Jadi saat kita menggunakan {{eq First Second}} sebenarnya dia akan memanggil fungsi eq dengan parameter First dan Second atau lebih fammiliarnya seperti ini eq(First,Second).

Selanjutnya kita buat fungsi handler dengan nama TemplateActionComparatorHandler pada file http_handler.go dengan detailnya seperti ini.

func TemplateActionComparatorHandler(w http.ResponseWriter, r *http.Request) {
	t := template.Must(template.ParseFiles("./templates/comparator.html"))
	t.ExecuteTemplate(w, "comparator.html", map[string]interface{}{
		"Name":  "Santekno",
		"Value": 100,
	})
}

Dan yang terakhir kita tambahkan juga fungsi handler-nya pada file main.go.

	mux.HandleFunc("/template-action-comparator", TemplateActionComparatorHandler)

Selesai, kita jalankan program kita dan akan menampilkan nama dan value Good karena nilainya dari variabel value adalah 100. Coba kita ganti menjadi 60 apa yang akan terjadi? Maka akan keluar Nice Try.

Operasi Perulangan menggunakan Range

Range adalah operasi perulangan atau iterasi yang dilakukan pada data template. Dalam Golang template perulangan ini tidak bisa menggunakan for. Biasanya perulangan data ini menggunakan range untuk iterasi tiap data array, slice, map ataupun channel. Contohnya

{{ range $index, $element := .Value }}
	A1
{{ end }}

Jika Value memiliki data, maka A1 akan dieksekusi sebanyak element value dan kita bisa menggunakan $index untuk mengakses index dan $element untuk mengakses elementnya.

Contoh lagi misalkan seperti ini

{{ range $index, $element := .Value }}
	A1
{{ else }}
	A2
{{ end }}

Pada contoh kedua ini sebenarnya sama seperti halnya contoh yang pertama namun jika ada value tidak memiliki element apapun maka A2 yang akan dieksekusi.

Kita coba langsung dengan membuat file range.html dengan isi kode html seperti dibawah ini.

<html>
	<body>
		{{range $index, $element := .Hobbies}}
			<h1>{{ $element }}</h1>
		{{else}}
			<h1>Anda tidak punya hobi</h1>
		{{end}}
	</body>
</html>

Dan selanjutnya kita akan membuat handler dengan template yang sudah dibuat diatas.

func TemplateActionRangeHandler(w http.ResponseWriter, r *http.Request) {
	t := template.Must(template.ParseFiles("./templates/range.html"))
	t.ExecuteTemplate(w, "range.html", map[string]interface{}{
		"Hobbies": []string{
			"Gaming", "Reading", "Coding",
		},
	})
}

Dilanjutkan dengan membuat fungsi handler seperti dibawah ini.

	mux.HandleFunc("/template-action-range", TemplateActionRangeHandler)

Jalankan program dan akses browser maka akan menampilkan seperti dibawah ini.

Gaming
Reading
Coding

Operasi With

Kaadang kala kita sering membuat suatu nested struct yang mana jika menggunakan template kita bisa mengaksesnya dengan menggunakan .Value.NestedValue dalam template action With dengan mengubah scope dot menjadi onject yang ingin kita mau. Contoh halnya seperti ini

  • {{with .Value}} A1 {{ end }} berarti jika value tidak kosong, di A1 semua dot akan merefer ke value
  • {{with .Value}} A1 {{ else }} A2 {{ end }} berarti sama halnya seperti sebelumnya namun jika value kosong maka A2 yang akan dieksekusi

Kita akan mencobanya dengan membuat file template-nya terlebih dahulu seperti ini

<html>
	<body>
			{{/* contoh komentar */}}
			Name : {{.Name}} <br>
			{{with .Address}}
			Address Street : {{.Street}}<br>
			Address City : {{.City}}<br>
			{{end}}
	</body>
</html>

Selanjutnya kita akan membuat fungsi handler baru untuk membaca file template diatas seperti ini.

func TemplateActionWithHandler(w http.ResponseWriter, r *http.Request) {
	t := template.Must(template.ParseFiles("./templates/address.html"))
	t.ExecuteTemplate(w, "address.html", map[string]interface{}{
		"Name": "Santekno",
		"Address": map[string]interface{}{
			"Street": "Jalan Padjadjaran",
			"City":   "Bogor",
		},
	})
}

Lalu jangan lupa juga untuk memanggil fungsi handler tersebut pada file main.go untuk inisialisasi endpoint-nya.

mux.HandleFunc("/template-action-with", TemplateActionWithHandler)

Build ulang dan coba jalankan kembali programnya.

go build && ./learn-golang-web

Setelah di buld dan dijalankan akan tampak tampilan pada halaman browser setelah diakses seperti dibawah ini

Name : Santekno
Address Street : Jalan Padjadjaran
Address City : Bogor
comments powered by Disqus