Document usage of utils/pagination. Refs #835.
Showing
2 changed files
with
75 additions
and
0 deletions
| ... | @@ -12,6 +12,55 @@ | ... | @@ -12,6 +12,55 @@ |
| 12 | // See the License for the specific language governing permissions and | 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. | 13 | // limitations under the License. |
| 14 | 14 | ||
| 15 | // Usage | ||
| 16 | // | ||
| 17 | // In your beego.Controller: | ||
| 18 | // | ||
| 19 | // package controllers | ||
| 20 | // | ||
| 21 | // import "github.com/astaxie/beego/utils/pagination" | ||
| 22 | // | ||
| 23 | // type PostsController struct { | ||
| 24 | // beego.Controller | ||
| 25 | // } | ||
| 26 | // | ||
| 27 | // func (this *PostsController) ListAllPosts() { | ||
| 28 | // // sets this.Data["paginator"] with the current offset (from the url query param) | ||
| 29 | // postsPerPage := 20 | ||
| 30 | // paginator := pagination.SetPaginator(this, postsPerPage, CountPosts()) | ||
| 31 | // | ||
| 32 | // // fetch the next 20 posts | ||
| 33 | // this.Data["posts"] = ListPostsByOffsetAndLimit(paginator.Offset(), postsPerPage) | ||
| 34 | // } | ||
| 35 | // | ||
| 36 | // | ||
| 37 | // In your view templates: | ||
| 38 | // | ||
| 39 | // {{if .paginator.HasPages}} | ||
| 40 | // <ul class="pagination pagination"> | ||
| 41 | // {{if .paginator.HasPrev}} | ||
| 42 | // <li><a href="{{.paginator.PageLinkFirst}}">{{ i18n .Lang "paginator.first_page"}}</a></li> | ||
| 43 | // <li><a href="{{.paginator.PageLinkPrev}}">«</a></li> | ||
| 44 | // {{else}} | ||
| 45 | // <li class="disabled"><a>{{ i18n .Lang "paginator.first_page"}}</a></li> | ||
| 46 | // <li class="disabled"><a>«</a></li> | ||
| 47 | // {{end}} | ||
| 48 | // {{range $index, $page := .paginator.Pages}} | ||
| 49 | // <li{{if $.paginator.IsActive .}} class="active"{{end}}> | ||
| 50 | // <a href="{{$.paginator.PageLink $page}}">{{$page}}</a> | ||
| 51 | // </li> | ||
| 52 | // {{end}} | ||
| 53 | // {{if .paginator.HasNext}} | ||
| 54 | // <li><a href="{{.paginator.PageLinkNext}}">»</a></li> | ||
| 55 | // <li><a href="{{.paginator.PageLinkLast}}">{{ i18n .Lang "paginator.last_page"}}</a></li> | ||
| 56 | // {{else}} | ||
| 57 | // <li class="disabled"><a>»</a></li> | ||
| 58 | // <li class="disabled"><a>{{ i18n .Lang "paginator.last_page"}}</a></li> | ||
| 59 | // {{end}} | ||
| 60 | // </ul> | ||
| 61 | // {{end}} | ||
| 62 | // | ||
| 63 | // See also http://beego.me/docs/mvc/view/page.md | ||
| 15 | package pagination | 64 | package pagination |
| 16 | 65 | ||
| 17 | import ( | 66 | import ( |
| ... | @@ -23,6 +72,7 @@ type PaginationController interface { | ... | @@ -23,6 +72,7 @@ type PaginationController interface { |
| 23 | GetData() map[interface{}]interface{} | 72 | GetData() map[interface{}]interface{} |
| 24 | } | 73 | } |
| 25 | 74 | ||
| 75 | // Instantiates a Paginator and assigns it to controller.Data["paginator"]. | ||
| 26 | func SetPaginator(controller PaginationController, per int, nums int64) (paginator *Paginator) { | 76 | func SetPaginator(controller PaginationController, per int, nums int64) (paginator *Paginator) { |
| 27 | request := controller.GetCtx().Request | 77 | request := controller.GetCtx().Request |
| 28 | paginator = NewPaginator(request, per, nums) | 78 | paginator = NewPaginator(request, per, nums) | ... | ... |
| ... | @@ -21,6 +21,7 @@ import ( | ... | @@ -21,6 +21,7 @@ import ( |
| 21 | "strconv" | 21 | "strconv" |
| 22 | ) | 22 | ) |
| 23 | 23 | ||
| 24 | // Paginator within the state of a http request. | ||
| 24 | type Paginator struct { | 25 | type Paginator struct { |
| 25 | Request *http.Request | 26 | Request *http.Request |
| 26 | PerPageNums int | 27 | PerPageNums int |
| ... | @@ -32,6 +33,7 @@ type Paginator struct { | ... | @@ -32,6 +33,7 @@ type Paginator struct { |
| 32 | page int | 33 | page int |
| 33 | } | 34 | } |
| 34 | 35 | ||
| 36 | // Returns the total number of pages. | ||
| 35 | func (p *Paginator) PageNums() int { | 37 | func (p *Paginator) PageNums() int { |
| 36 | if p.pageNums != 0 { | 38 | if p.pageNums != 0 { |
| 37 | return p.pageNums | 39 | return p.pageNums |
| ... | @@ -44,14 +46,17 @@ func (p *Paginator) PageNums() int { | ... | @@ -44,14 +46,17 @@ func (p *Paginator) PageNums() int { |
| 44 | return p.pageNums | 46 | return p.pageNums |
| 45 | } | 47 | } |
| 46 | 48 | ||
| 49 | // Returns the total number of items (e.g. from doing SQL count). | ||
| 47 | func (p *Paginator) Nums() int64 { | 50 | func (p *Paginator) Nums() int64 { |
| 48 | return p.nums | 51 | return p.nums |
| 49 | } | 52 | } |
| 50 | 53 | ||
| 54 | // Sets the total number of items. | ||
| 51 | func (p *Paginator) SetNums(nums interface{}) { | 55 | func (p *Paginator) SetNums(nums interface{}) { |
| 52 | p.nums, _ = ToInt64(nums) | 56 | p.nums, _ = ToInt64(nums) |
| 53 | } | 57 | } |
| 54 | 58 | ||
| 59 | // Returns the current page. | ||
| 55 | func (p *Paginator) Page() int { | 60 | func (p *Paginator) Page() int { |
| 56 | if p.page != 0 { | 61 | if p.page != 0 { |
| 57 | return p.page | 62 | return p.page |
| ... | @@ -69,6 +74,15 @@ func (p *Paginator) Page() int { | ... | @@ -69,6 +74,15 @@ func (p *Paginator) Page() int { |
| 69 | return p.page | 74 | return p.page |
| 70 | } | 75 | } |
| 71 | 76 | ||
| 77 | // Returns a list of all pages. | ||
| 78 | // | ||
| 79 | // Usage (in a view template): | ||
| 80 | // | ||
| 81 | // {{range $index, $page := .paginator.Pages}} | ||
| 82 | // <li{{if $.paginator.IsActive .}} class="active"{{end}}> | ||
| 83 | // <a href="{{$.paginator.PageLink $page}}">{{$page}}</a> | ||
| 84 | // </li> | ||
| 85 | // {{end}} | ||
| 72 | func (p *Paginator) Pages() []int { | 86 | func (p *Paginator) Pages() []int { |
| 73 | if p.pageRange == nil && p.nums > 0 { | 87 | if p.pageRange == nil && p.nums > 0 { |
| 74 | var pages []int | 88 | var pages []int |
| ... | @@ -98,6 +112,7 @@ func (p *Paginator) Pages() []int { | ... | @@ -98,6 +112,7 @@ func (p *Paginator) Pages() []int { |
| 98 | return p.pageRange | 112 | return p.pageRange |
| 99 | } | 113 | } |
| 100 | 114 | ||
| 115 | // Returns URL for a given page index. | ||
| 101 | func (p *Paginator) PageLink(page int) string { | 116 | func (p *Paginator) PageLink(page int) string { |
| 102 | link, _ := url.ParseRequestURI(p.Request.RequestURI) | 117 | link, _ := url.ParseRequestURI(p.Request.RequestURI) |
| 103 | values := link.Query() | 118 | values := link.Query() |
| ... | @@ -110,6 +125,7 @@ func (p *Paginator) PageLink(page int) string { | ... | @@ -110,6 +125,7 @@ func (p *Paginator) PageLink(page int) string { |
| 110 | return link.String() | 125 | return link.String() |
| 111 | } | 126 | } |
| 112 | 127 | ||
| 128 | // Returns URL to the previous page. | ||
| 113 | func (p *Paginator) PageLinkPrev() (link string) { | 129 | func (p *Paginator) PageLinkPrev() (link string) { |
| 114 | if p.HasPrev() { | 130 | if p.HasPrev() { |
| 115 | link = p.PageLink(p.Page() - 1) | 131 | link = p.PageLink(p.Page() - 1) |
| ... | @@ -117,6 +133,7 @@ func (p *Paginator) PageLinkPrev() (link string) { | ... | @@ -117,6 +133,7 @@ func (p *Paginator) PageLinkPrev() (link string) { |
| 117 | return | 133 | return |
| 118 | } | 134 | } |
| 119 | 135 | ||
| 136 | // Returns URL to the next page. | ||
| 120 | func (p *Paginator) PageLinkNext() (link string) { | 137 | func (p *Paginator) PageLinkNext() (link string) { |
| 121 | if p.HasNext() { | 138 | if p.HasNext() { |
| 122 | link = p.PageLink(p.Page() + 1) | 139 | link = p.PageLink(p.Page() + 1) |
| ... | @@ -124,34 +141,42 @@ func (p *Paginator) PageLinkNext() (link string) { | ... | @@ -124,34 +141,42 @@ func (p *Paginator) PageLinkNext() (link string) { |
| 124 | return | 141 | return |
| 125 | } | 142 | } |
| 126 | 143 | ||
| 144 | // Returns URL to the first page. | ||
| 127 | func (p *Paginator) PageLinkFirst() (link string) { | 145 | func (p *Paginator) PageLinkFirst() (link string) { |
| 128 | return p.PageLink(1) | 146 | return p.PageLink(1) |
| 129 | } | 147 | } |
| 130 | 148 | ||
| 149 | // Returns URL to the last page. | ||
| 131 | func (p *Paginator) PageLinkLast() (link string) { | 150 | func (p *Paginator) PageLinkLast() (link string) { |
| 132 | return p.PageLink(p.PageNums()) | 151 | return p.PageLink(p.PageNums()) |
| 133 | } | 152 | } |
| 134 | 153 | ||
| 154 | // Returns true if the current page has a predecessor. | ||
| 135 | func (p *Paginator) HasPrev() bool { | 155 | func (p *Paginator) HasPrev() bool { |
| 136 | return p.Page() > 1 | 156 | return p.Page() > 1 |
| 137 | } | 157 | } |
| 138 | 158 | ||
| 159 | // Returns true if the current page has a successor. | ||
| 139 | func (p *Paginator) HasNext() bool { | 160 | func (p *Paginator) HasNext() bool { |
| 140 | return p.Page() < p.PageNums() | 161 | return p.Page() < p.PageNums() |
| 141 | } | 162 | } |
| 142 | 163 | ||
| 164 | // Returns true if the given page index points to the current page. | ||
| 143 | func (p *Paginator) IsActive(page int) bool { | 165 | func (p *Paginator) IsActive(page int) bool { |
| 144 | return p.Page() == page | 166 | return p.Page() == page |
| 145 | } | 167 | } |
| 146 | 168 | ||
| 169 | // Returns the current offset. | ||
| 147 | func (p *Paginator) Offset() int { | 170 | func (p *Paginator) Offset() int { |
| 148 | return (p.Page() - 1) * p.PerPageNums | 171 | return (p.Page() - 1) * p.PerPageNums |
| 149 | } | 172 | } |
| 150 | 173 | ||
| 174 | // Returns true if there is more than one page. | ||
| 151 | func (p *Paginator) HasPages() bool { | 175 | func (p *Paginator) HasPages() bool { |
| 152 | return p.PageNums() > 1 | 176 | return p.PageNums() > 1 |
| 153 | } | 177 | } |
| 154 | 178 | ||
| 179 | // Instantiates a paginator struct for the current http request. | ||
| 155 | func NewPaginator(req *http.Request, per int, nums interface{}) *Paginator { | 180 | func NewPaginator(req *http.Request, per int, nums interface{}) *Paginator { |
| 156 | p := Paginator{} | 181 | p := Paginator{} |
| 157 | p.Request = req | 182 | p.Request = req | ... | ... |
-
Please register or sign in to post a comment