Server Side form validation 3
This commit is contained in:
		| @ -1,8 +1,10 @@ | ||||
| package forms | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Form creates a custom form struct, embeds a url.Values object | ||||
| @ -19,17 +21,33 @@ func New(data url.Values) *Form { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Required checks required fields | ||||
| func (f *Form) Required(fields ...string) { | ||||
|     for _, field := range fields { | ||||
|         value := f.Get(field) | ||||
|         if strings.TrimSpace(value) == "" { | ||||
|             f.Errors.Add(field, "This field cannot be blank") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Has checks if form field is in post and not emtpy | ||||
| func (f *Form) Has(field string, r *http.Request) bool { | ||||
| 	x := r.Form.Get(field) | ||||
| 	if x == "" { | ||||
| 		f.Errors.Add(field, "This field cannot be blank") | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
|     return x != "" | ||||
| } | ||||
|  | ||||
| // Valid returns true if there are no errors, otherwise false | ||||
| func (f *Form) Valid() bool { | ||||
| 	return len(f.Errors) == 0 | ||||
| } | ||||
|  | ||||
| // MinLength checks for string minimum length | ||||
| func (f *Form) MinLength(field string, length int, r *http.Request) bool { | ||||
|     value := r.Form.Get(field) | ||||
|     if len(value) < length { | ||||
|         f.Errors.Add(field, fmt.Sprintf("This field must have at least %d letters", length)) | ||||
|         return false | ||||
|     } | ||||
|     return true | ||||
| } | ||||
|  | ||||
| @ -69,8 +69,16 @@ func (m *Repository) Majors(w http.ResponseWriter, r *http.Request) { | ||||
|  | ||||
| // MakeReservation is the make reservation page handler | ||||
| func (m *Repository) MakeReservation(w http.ResponseWriter, r *http.Request) { | ||||
|     // For the first time render emptyReservation so that this object is | ||||
|     // filled with the info when sent back. | ||||
|     var emptyReservation models.Reservation | ||||
|     data := make(map[string]interface{}) | ||||
|  | ||||
|     data["reservation"] = emptyReservation | ||||
|  | ||||
| 	render.RenderTemplate(w, r, "make-reservation.page.tmpl", &models.TemplateData{ | ||||
| 		Form: forms.New(nil), | ||||
|         Data: data, | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| @ -91,7 +99,8 @@ func (m *Repository) PostMakeReservation(w http.ResponseWriter, r *http.Request) | ||||
|  | ||||
| 	form := forms.New(r.PostForm) | ||||
|  | ||||
| 	form.Has("first_name", r) | ||||
| 	form.Required("first_name", "last_name", "email") | ||||
|     form.MinLength("first_name", 2, r) | ||||
|  | ||||
| 	if !form.Valid() { | ||||
| 		data := make(map[string]interface{}) | ||||
|  | ||||
| @ -5,6 +5,7 @@ | ||||
|         <div class="col"> | ||||
|             <h1 class="text-center mt-3">Make reservation</h1> | ||||
|  | ||||
|             {{$res := index .Data "reservation"}} | ||||
|             <!-- <form method="post" action="" class="needs-validation" novalidate> --> | ||||
|             <form method="post" action="" class="" novalidate> | ||||
|                 <input type="hidden" name="csrf_token" value="{{.CSRFToken}}"> | ||||
| @ -15,19 +16,27 @@ | ||||
|                     <label class="text-danger">{{.}}</label> | ||||
|                     {{end}} | ||||
|                     <input type="text" name="first_name" id="first_name" class="form-control {{with .Form.Errors.Get "first_name"}} is-invalid {{end}}" | ||||
|                         required autocomplete="off"> | ||||
|                         value="{{$res.FirstName}}" required autocomplete="off"> | ||||
|                 </div> | ||||
|                 <div class="form-group mt-5"> | ||||
|                     <label for="last_name">Last name:</label> | ||||
|                     <input type="text" name="last_name" id="last_name" class="form-control" required autocomplete="off"> | ||||
|                     {{with .Form.Errors.Get "last_name"}} | ||||
|                     <label class="text-danger">{{.}}</label> | ||||
|                     {{end}} | ||||
|                     <input type="text" name="last_name" id="last_name" class="form-control {{with .Form.Errors.Get "last_name"}} is-invalid {{end}}" | ||||
|                         value="{{$res.LastName}}" required autocomplete="off"> | ||||
|                 </div> | ||||
|                 <div class="form-group mt-5"> | ||||
|                     <label for="email">Email:</label> | ||||
|                     <input type="email" name="email" id="email" class="form-control" required autocomplete="off"> | ||||
|                     {{with .Form.Errors.Get "email"}} | ||||
|                     <label class="text-danger">{{.}}</label> | ||||
|                     {{end}} | ||||
|                     <input type="email" name="email" id="email" class="form-control {{with .Form.Errors.Get "email"}} is-invalid {{end}}" | ||||
|                         value="{{$res.Email}}" required autocomplete="off"> | ||||
|                 </div> | ||||
|                 <div class="form-group mt-5"> | ||||
|                     <label for="phone">Phone number:</label> | ||||
|                     <input type="text" name="phone" id="phone" class="form-control" required autocomplete="off"> | ||||
|                     <input type="text" name="phone" id="phone" class="form-control" value="{{$res.Phone}}" autocomplete="off"> | ||||
|                 </div> | ||||
|  | ||||
|                 <hr> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user