github.com/gogf/gf@v1.16.9/net/ghttp/ghttp_request_param_page.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package ghttp 8 9 import ( 10 "fmt" 11 "github.com/gogf/gf/text/gregex" 12 "github.com/gogf/gf/text/gstr" 13 "github.com/gogf/gf/util/gpage" 14 ) 15 16 // GetPage creates and returns the pagination object for given <totalSize> and <pageSize>. 17 // NOTE THAT the page parameter name from client is constantly defined as gpage.DefaultPageName 18 // for simplification and convenience. 19 func (r *Request) GetPage(totalSize, pageSize int) *gpage.Page { 20 // It must have Router object attribute. 21 if r.Router == nil { 22 panic("Router object not found") 23 } 24 var ( 25 url = *r.URL 26 urlTemplate = url.Path 27 uriHasPageName = false 28 ) 29 // Check the page variable in the URI. 30 if len(r.Router.RegNames) > 0 { 31 for _, name := range r.Router.RegNames { 32 if name == gpage.DefaultPageName { 33 uriHasPageName = true 34 break 35 } 36 } 37 if uriHasPageName { 38 if match, err := gregex.MatchString(r.Router.RegRule, url.Path); err == nil && len(match) > 0 { 39 if len(match) > len(r.Router.RegNames) { 40 urlTemplate = r.Router.Uri 41 for i, name := range r.Router.RegNames { 42 rule := fmt.Sprintf(`[:\*]%s|\{%s\}`, name, name) 43 if name == gpage.DefaultPageName { 44 urlTemplate, err = gregex.ReplaceString(rule, gpage.DefaultPagePlaceHolder, urlTemplate) 45 } else { 46 urlTemplate, err = gregex.ReplaceString(rule, match[i+1], urlTemplate) 47 } 48 if err != nil { 49 panic(err) 50 } 51 } 52 } 53 } else { 54 panic(err) 55 } 56 } 57 } 58 // Check the page variable in the query string. 59 if !uriHasPageName { 60 values := url.Query() 61 values.Set(gpage.DefaultPageName, gpage.DefaultPagePlaceHolder) 62 url.RawQuery = values.Encode() 63 // Replace the encoded "{.page}" to original "{.page}". 64 url.RawQuery = gstr.Replace(url.RawQuery, "%7B.page%7D", "{.page}") 65 } 66 if url.RawQuery != "" { 67 urlTemplate += "?" + url.RawQuery 68 } 69 70 return gpage.New(totalSize, pageSize, r.GetInt(gpage.DefaultPageName), urlTemplate) 71 }