Golang : Pagination with go-paginator configuration example
Here is an example that you can use as reference on how to configure go-paginator properly. The snippets below are from my own project and it took me a while to get it right.
In the main.go
:
import "github.com/go-chi/chi"
...
mx := chi.NewRouter()
...
mx.HandleFunc("/listproperty", controllers.ListProperty) // to handle first page
mx.HandleFunc("/listproperty/{pageNumber}", controllers.ListProperty) // and subsequent pages(pagination)
In the ListProperty.go
controller:
// ListProperty to populate home page
func ListProperty(w http.ResponseWriter, r *http.Request) {
...
currentPageNumber := chi.URLParam(r, "pageNumber")
currentPageNumberInt, _ := strconv.Atoi(currentPageNumber) // convert to int
allRows := conn.Model(properties) <--- replace with your own function that returns all the related rows from database
propertiesPerPage := 3 <---- change this number to your own
paginated := paginator.New(adapter.NewGORMAdapter(allRows), propertiesPerPage)
paginated.SetPage(currentPageNumberInt)
if err = paginate.Results(&properties); err != nil {
panic(err)
}
templateDataMap["propertiesList"] = *properties
paginateView := view.New(&paginate)
templateDataMap["paginatePages"] = paginateView.Pages()
templateDataMap["paginateNext"] = paginateView.Next()
templateDataMap["paginatePrev"] = paginateView.Prev()
templateDataMap["paginateLast"] = paginateView.Last()
templateDataMap["paginateCurrent"] = paginateView.Current()
templateDataMap["paginateHasNext"] = paginate.HasNext()
templateDataMap["paginateHasPrev"] = paginate.HasPrev()
templateDataMap["paginateHasPages"] = paginate.HasPages()
...
// populate the view(template) with data
var listPropertyPageBody = template.Must(template.New("listPropertyPageBody").Parse(body.ListPropertyHTML))
if err := listPropertyPageBody.ExecuteTemplate(w, "listPropertyPageBody", templateDataMap); err != nil {
log.Println(err)
}
and finally in the HTML template:
{{if .paginateHasPages}}
<ul class="pagination">
{{if .paginateHasPrev}}
<li class="page-item"><a class="page-link" href="/listproperty">First</a></li>
{{end}}
{{if .paginateHasPrev}}
<li class="page-item"><a class="page-link" href="/listproperty/{{.paginatePrev}}">Previous</a></li>
{{end}}
{{range .paginatePages}}
{{if (ge $.paginateLast .)}}
<li class="page-item {{if (eq $.paginateCurrent .)}}
{{print "active"}}
{{else}}
{{print ""}}
{{end}}">
<a class="page-link" href="/listproperty/{{.}}">{{.}}</a>
</li>
{{end}}
{{end}}
{{if .paginateHasNext}}
<li class="page-item"><a class="page-link" href="/listproperty/{{.paginateNext}}">Next</a></li>
{{end}}
{{if (gt $.paginateLast $.paginateCurrent)}}
<li class="page-item"><a class="page-link" href="/listproperty/{{.paginateLast}}">Last</a></li>
{{end}}
</ul>
{{end}}
Hope this helps!
References:
https://socketloop.com/tutorials/golang-how-to-use-if-eq-and-print-properly-in-html-template
See also : Golang : How to use if, eq and print properly in html template
By Adam Ng(黃武俊)
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+7.1k Golang : Individual and total number of words counter example
+15.3k Golang : Intercept Ctrl-C interrupt or kill signal and determine the signal type
+5.7k Golang : Denco multiplexer example
+6.7k Golang : Calculate BMI and risk category
+11.4k SSL : The certificate is not trusted because no issuer chain was provided
+7.1k Golang : Scanf function weird error in Windows
+9.4k Random number generation with crypto/rand in Go
+13.9k Golang : Check if a file exist or not
+11.1k Golang : Delay or limit HTTP requests example
+9k Golang : Create and shuffle deck of cards example
+11.3k Golang : Simple file scaning and remove virus example
+6.1k Golang : Selection sort example