diff --git a/g/util/gpage/gpage.go b/g/util/gpage/gpage.go index fad7f6579..a0d449b31 100644 --- a/g/util/gpage/gpage.go +++ b/g/util/gpage/gpage.go @@ -9,20 +9,25 @@ package gpage import ( "gitee.com/johng/gf/g/net/ghttp" + "math" + "fmt" + "net/url" + "gitee.com/johng/gf/g/util/gconv" + "strings" ) type Page struct { - request *ghttp.Request - pageName string // page标签,用来控制url页。比如说xxx.php?PBPage=2中的PBPage - nextPage string // 下一页标签 - prePage string // 上一页标签 - firstPage string // 首页标签 - lastPage string // 尾页标签 - pre_bar string // 上一分页条 - next_bar string // 下一分页条 + pageName string // 分页参数名称 + nextPageTag string // 下一页标签 + prevPageTag string // 上一页标签 + firstPageTag string // 首页标签 + lastPageTag string // 尾页标签 + + prevBar string // 上一分页条 + nextBar string // 下一分页条 formatLeft string formatRight string - isAjax bool // 是否支持AJAX分页模式 + isAjax bool // 是否支持AJAX分页模式 totalSize int pagebarNum int // 控制记录条的个数。 totalPage int // 总页数 @@ -31,98 +36,45 @@ type Page struct { url string // url地址头 offset int } -/** -* constructor构造函数 -* -* @param array array['total'], array['perpage'], array['currentPage'], array['url'], array['ajax']... -*/ -func New(total, perpage int) { - total = intval(array['total']); - perpage = (array_key_exists('perpage',array)) ? intval(array['perpage']) : 10; - currentPage = (array_key_exists('currentPage',array)) ? intval(array['currentPage']) : ''; - url = (array_key_exists('url',array)) ? array['url'] : ''; + +func New(totalSize, perPage, currentPage int, url string) *Page { + page := &Page { + pageName : "page", + totalSize : totalSize, + totalPage : int(math.Ceil(float64(totalSize/perPage))), + currentPage : currentPage, + offset : (currentPage - 1)*perPage, + url : url, + } + if strings.Index(url, "?") != -1 { + page.url = url + "&" } else { - total = array; - perpage = 10; - currentPage =''; - url = ''; -} -if ((!is_int(total)) || (total < 0)) { -this->_error(__FUNCTION__, 'invalid total'); -} -if ((!is_int(perpage)) || (perpage <= 0)) { -this->_error(__FUNCTION__, 'invalid perpage'); -} -if (!empty(array['pageName'])) { -// 设置pagename -this->set('pageName', array['pageName']); -} -this->_setCurrentPage(currentPage); // 设置当前页 -this->_setUrl(url); // 设置链接地址 -this->totalSize = total; -this->totalPage = ceil(total/perpage); -this->offset = (this->currentPage-1)*perpage; -if (!empty(array['ajax'])) { -this->openAjax(array['ajax']);//打开AJAX模式 + page.url = url + "?" + } + page.url += page.pageName + "=" + return page } +// 启用AJAX分页 +func (page *Page)EnableAjax(actionName string) { + page.isAjax = true + page.ajaxActionName = actionName } -/** -* 设定类中指定变量名的值,如果改变量不属于这个类,将throw一个exception -* -* @param string var -* @param string value -*/ -public function set(var, value) -{ -if (inArray(var, get_object_vars(this))) { -this->var = value; -} else { -this->_error(__FUNCTION__, var." does not belong to PB_Page!"); +// 获取显示"下一页"的内容. +func (page *Page) nextPage(curStyle , style string) string { + if page.currentPage < page.totalPage { + return page._getLink(page._getUrl(page.currentPage + 1), page.nextPageTag, "下一页", style) + } + return fmt.Sprintf(`%s`, curStyle, page.nextPageTag) } -} - -/** - * 使用AJAX模式。 - * - * @param string action 默认ajax触发的动作名称。 - * - * @return void - */ -public function openAjax(action) -{ -this->isAjax = true; -this->ajaxActionName = action; -} - -/** -* 获取显示"下一页"的代码. -* -* @param string style -* @return string -*/ -public function nextPage(curStyle = '', style = '') -{ -if (this->currentPage < this->totalPage) { -return this->_getLink(this->_getUrl(this->currentPage+1), this->nextPage, '下一页', style); -} -return ''.this->nextPage.''; -} - -/** -* 获取显示“上一页”的代码 -* -* @param string style -* @return string -*/ -public function prePage(curStyle='', style='') -{ -if (this->currentPage > 1) { -return this->_getLink(this->_getUrl(this->currentPage - 1), this->prePage, '上一页', style); -} -return ''.this->prePage.''; +/// 获取显示“上一页”的内容 +func (page *Page) prevPage(curStyle , style string) string { + if page.currentPage > 1 { + return page._getLink(page._getUrl(page.currentPage - 1), page.prevPageTag, "上一页", style) + } + return fmt.Sprintf(`%s`, curStyle, page.prevPageTag) } /** @@ -130,87 +82,63 @@ return ''.this->prePage.''; * * @return string */ -public function firstPage(curStyle = '', style = '') -{ -if (this->currentPage == 1) { -return ''.this->firstPage.''; -} -return this->_getLink(this->_getUrl(1), this->firstPage, '第一页', style); +func (page *Page)firstPage(curStyle, style string) string { + if page.currentPage == 1 { + return fmt.Sprintf(`%s`, curStyle, page.firstPageTag) + } + return page._getLink(page._getUrl(1), page.firstPageTag, "第一页", style) } -/** -* 获取显示“尾页”的代码 -* -* @return string -*/ -public function lastPage(curStyle='', style='') -{ -if (this->currentPage == this->totalPage) { -return ''.this->lastPage.''; -} -return this->_getLink(this->_getUrl(this->totalPage), this->lastPage, '最后页', style); +// 获取显示“尾页”的内容 +func (page *Page)lastPage(curStyle, style string) string { + if page.currentPage == page.totalPage { + return fmt.Sprintf(`%s`, curStyle, page.lastPageTag) + } + return page._getLink(page._getUrl(page.totalPage), page.lastPageTag, "最后页", style) } -/** - * 获得分页条。 - * - * @param 当前页码 curStyle - * @param 连接CSS style - * @return 分页条字符串 - */ -public function nowbar(curStyle = '', style = '') -{ -plus = ceil(this->pagebarNum / 2); -if (this->pagebarNum - plus + this->currentPage > this->totalPage) { -plus = (this->pagebarNum - this->totalPage + this->currentPage); -} -begin = this->currentPage - plus + 1; -begin = (begin>=1) ? begin : 1; -return = ''; -for (i = begin; i < begin + this->pagebarNum; i++) { -if (i <= this->totalPage) { -if (i != this->currentPage) { -return .= this->_getText(this->_getLink(this->_getUrl(i), i, style)); -} else { -return .= this->_getText(''.i.''); -} -} else { -break; -} -return .= "\n"; -} -unset(begin); -return return; +// 获得分页条。 +func (page *Page) nowBar(curStyle, style string) string { + plus := int(math.Ceil(float64(page.pagebarNum / 2))) + if page.pagebarNum - plus + page.currentPage > page.totalPage { + plus = page.pagebarNum - page.totalPage + page.currentPage + } + begin := page.currentPage - plus + 1 + if begin < 1 { + begin = 1 + } + ret := "" + for i := begin; i < begin + page.pagebarNum; i++ { + if i <= page.totalPage { + if i != page.currentPage { + ret += page._getText(page._getLink(page._getUrl(i), gconv.String(i), style, "")) + } else { + ret += page._getText(fmt.Sprintf(`%d`, curStyle, i)) + } + } else { + break + } + ret += "\n" + } + return ret } /** * 获取显示跳转按钮的代码 * * @return string */ -public function select() -{ -url = this->_getUrl("' + this.value"); -return = "'; -return return; -} - -/** -* 获取mysql 语句中limit需要的值 -* -* @return string -*/ -public function offset() -{ -return this->offset; +func (page *Page) selectBar() string { + url := page._getUrl("' + this.value") + ret := fmt.Sprintf(`" + return ret } /** @@ -219,147 +147,67 @@ return this->offset; * @param int mode 显示风格分类。 * @return string */ -public function show(mode = 1) -{ -switch (mode) { -case '1': -this->nextPage = '下一页'; -this->prePage = '上一页'; -return this->prePage()."{this->currentPage}".this->nextPage(); -break; - -case '2': -this->nextPage = '下一页>>'; -this->prePage = '<<上一页'; -this->firstPage = '首页'; -this->lastPage = '尾页'; -return this->firstPage().this->prePage().'[第'.this->currentPage.'页]'.this->nextPage().this->lastPage().'第'.this->select().'页'; -break; - -case '3': -this->nextPage = '下一页'; -this->prePage = '上一页'; -this->firstPage = '首页'; -this->lastPage = '尾页'; -pageStr = this->firstPage()." ".this->prePage(); -pageStr .= ' '.this->nowbar('current'); -pageStr .= ' '.this->nextPage()." ".this->lastPage(); -pageStr .= "当前页{this->currentPage}/{this->totalPage} 共{this->totalSize}条"; -return pageStr; -break; - -case '4': -this->nextPage = '下一页'; -this->prePage = '上一页'; -this->firstPage = '首页'; -this->lastPage = '尾页'; -pageStr = this->firstPage()." ".this->prePage(); -pageStr .= ' '.this->nowbar('current'); -pageStr .= ' '.this->nextPage()." ".this->lastPage(); -return pageStr; -break; +func (page *Page)show(mode int) string { + //switch (mode) { + //case '1': + //page.nextPage = '下一页' + //page.prevPage = '上一页' + //return page.prevPage()."{page.currentPage}".page.nextPage() + //break + // + //case '2': + //page.nextPage = '下一页>>' + //page.prevPage = '<<上一页' + //page.firstPage = '首页' + //page.lastPage = '尾页' + //return page.firstPage().page.prevPage().'[第'.page.currentPage.'页]'.page.nextPage().page.lastPage().'第'.page.select().'页' + //break + // + //case '3': + //page.nextPage = '下一页' + //page.prevPage = '上一页' + //page.firstPage = '首页' + //page.lastPage = '尾页' + //pageStr = page.firstPage()." ".page.prevPage() + //pageStr .= ' '.page.nowbar('current') + //pageStr .= ' '.page.nextPage()." ".page.lastPage() + //pageStr .= "当前页{page.currentPage}/{page.totalPage} 共{page.totalSize}条" + //return pageStr + //break + // + //case '4': + //page.nextPage = '下一页' + //page.prevPage = '上一页' + //page.firstPage = '首页' + //page.lastPage = '尾页' + //pageStr = page.firstPage()." ".page.prevPage() + //pageStr .= ' '.page.nowbar('current') + //pageStr .= ' '.page.nextPage()." ".page.lastPage() + //return pageStr + //break + //} + return "" } +// 为指定的页面返回地址值 +func (page *Page) _getUrl(pageNoStr string) string { + return page.url + pageNoStr } -/*----------------private function (私有方法)-----------------------------------------------------------*/ -/** -* 设置url头地址 -* @param: string url -* @return boolean -*/ -private function _setUrl(url = "") -{ -if (!empty(url)) { -//手动设置 -this->url = url.((stristr(url,'?')) ? '&' : '?').this->pageName."="; -} else { -parse = parse_url(_SERVER['REQUEST_URI']); -query = array(); -if (!empty(parse['query'])) { -parse_str(parse['query'], query); -if (!empty(query) && isset(query[this->pageName])) { -unset(query[this->pageName]); -} -} -array = explode('?', _SERVER['REQUEST_URI']); -if (!empty(query)) { -this->url = array[0].'?'.http_build_query(query)."&{this->pageName}="; -} else { -this->url = array[0]."?{this->pageName}="; -} -} +// 获取分页显示文字,比如说默认情况下_getText('1')将返回[1] +func (page *Page)_getText(str string) string { + return page.formatLeft + str + page.formatRight } -/** -* 设置当前页面 -*/ -private function _setCurrentPage(currentPage) -{ -if(empty(currentPage)) { -// 系统获取 -if(isset(_GET[this->pageName])) { -this->currentPage = intval(_GET[this->pageName]); -} -} else { -//手动设置 -this->currentPage = intval(currentPage); -} +// 获取链接地址 +func (page *Page)_getLink(url, text, title, style string) string { + if len(style) > 0 { + style = fmt.Sprintf(`class="%s"`, style) + } + if (page.isAjax) { + return fmt.Sprintf(`%s`, style, page.ajaxActionName, url, text) + } else { + return fmt.Sprintf(`"%s"`, style, url, title, text) + } } -/** -* 为指定的页面返回地址值 -* -* @param int pageNo -* @return string url -*/ -private function _getUrl(pageNo=1) -{ -return this->url.pageNo; -} - -/** -* 获取分页显示文字,比如说默认情况下_getText('1')将返回[1] -* -* @param String str -* @return string url -*/ -private function _getText(str) -{ -return this->formatLeft.str.this->formatRight; -} - -//获取链接地址 -private function _getLink(url, text, title='', style='') -{ -style = (empty(style)) ? '' : 'class="'.style.'"'; -if (this->isAjax) { -//如果是使用AJAX模式 -return "ajaxActionName}('url');\">text"; -} else { -return "text"; -} -} - -//出错处理方式 -/** - * 展示错误病终止执行. - * - * @param string function 错误产生的函数名称. - * @param string errormsg 错误信息. - * - * @return void - */ -private function _error(function, errormsg) -{ -die('Error in file '.__FILE__.' ,Function '.function.'() :'.errormsg); -} -} - - - - - - - -