Sebelum melanjutkan ke webapp testing menggunakan session, kita akan lakukan sedikit perbaikan untuk file templates.
Karena kita akan menggunakan beberapa halaman web, ada baiknya kita membuat template dasar yang akan digunakan oleh file template lainnya.
Buat file templates/base.layout.gohtml, lalu tambahkan kode berikut.
{{define "base"}} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous"> <title>Home</title> </head> <body> {{block "content" .}} {{end}} </body> </html> {{end}}
Kemudian modifikasi file templates/home.page.gohtml, seperti berikut.
{{template "base" .}} {{define "content"}} <div class="container"> <div class="row"> <div class="col"> <h1 class="mt-3">Home Page</h1> <hr> <form action="/login" method="post"> <div class="mb-3"> <label for="email" class="form-label">Email address</label> <input type="email" class="form-control" id="email" name="email"> </div> <div class="mb-3"> <label for="password" class="form-label">Password</label> <input type="password" class="form-control" id="password" name="password"> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <hr> <small>Your request came from {{.IP}}</small> </div> </div> </div> {{end}}
Karena kita sekarang menggunakan 2 file templates, pada file handlers.go perlu diupdate dengan menambahkan file base.layout.gohtml.
package main import ( "fmt" "html/template" "log" "net/http" "path" ) var templatePath = "./templates/" func (app *application) Home(w http.ResponseWriter, r *http.Request) { _ = app.render(w, r, "home.page.gohtml", &TemplateData{}) } type TemplateData struct { IP string Data map[string]any } func (app *application) render(w http.ResponseWriter, r *http.Request, t string, data *TemplateData) error { //parse template parsedTemplate, err := template.ParseFiles(path.Join(templatePath, t), path.Join(templatePath, "base.layout.gohtml")) if err != nil { http.Error(w, "bad request", http.StatusBadRequest) return err } //gunakan middleware yang telah kita buat. data.IP = app.ipFromContext(r.Context()) //execute template err = parsedTemplate.Execute(w, data) if err != nil { return err } return nil } func (app *application) Login(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { log.Println(err) http.Error(w, "bad request", http.StatusBadRequest) return } //validation goes here form := NewForm(r.PostForm) form.Required("email", "password") if !form.Valid() { fmt.Fprint(w, "Invalid form") return } email := r.Form.Get("email") password := r.Form.Get("password") log.Println(email, password) fmt.Fprint(w, email) }