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
+17.9k Golang : Clearing slice
+19.4k Golang : Convert date string to variants of time.Time type examples
+23k Golang : Call function from another package
+6.6k Golang : Convert(cast) io.Reader type to string
+4.3k Javascript : Change page title to get viewer attention
+3.8k Chrome : How to block socketloop.com links in Google SERP?
+14.9k Golang : How to check if input from os.Args is integer?
+35.1k Golang : Display float in 2 decimal points and rounding up or down
+5.6k Android Studio : Hello World example
+6.9k Golang : Check from web if Go application is running or not
+11.9k Golang : Handle or parse date string with Z suffix(RFC3339) example
+24.7k Mac/Linux and Golang : Fix bind: address already in use error