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  }