start) || $this->start < 1) { $this->start = 1; } if ($this->start > $total) { $this->start = $total + 1; } // 设置总数 if ($total) { $this->rowTotal = $total - ($this->start - 1); } // 设置分页大小 if (! isset($this->pageSize)) { $this->pageSize = get('pagesize') ?: Config::get('pagesize') ?: 15; } // 分页数字条数量 $this->num = Config::get('pagenum') ?: 5; // 计算页数 $this->pageCount = @ceil($this->rowTotal / $this->pageSize); // 获取当前页面 $this->page = $this->page(); // 定义相关常量,用于方便模板引擎解析序号等计算和调用 define('ROWTOTAL', $this->rowTotal); define('PAGECOUNT', $this->pageCount); define('PAGE', $this->page); define('PAGESIZE', $this->pageSize); // 注入分页模板变量 $this->assign($morePageStr); // 返回限制语句 return ($this->page - 1) * $this->pageSize + ($this->start - 1) . ",$this->pageSize"; } // 快速分页字符代码 public function quikLimit() { $page = get('page', 'int') ?: 1; if ($page < 1) { $page = 0; } $pagesize = config::get('pagesize') ?: 15; return ($page - 1) * $pagesize . ",$pagesize"; } // 注入页面相关信息,用于模板调用,如:{$pagebar}调用分页条 private function assign($morePageStr = false) { assign('pagebar', $this->pageBar()); if ($morePageStr) { assign('pagecurrent', $this->page()); // 注入当前页 assign('pagecount', $this->pageCount); // 注入总页数 assign('pagerows', $this->rowTotal); // 注入总数据 assign('pageindex', $this->pageIndex()); // 注入首页链接 assign('pagepre', $this->pagePre()); // 注入前一页链接 assign('pagenext', $this->pageNext()); // 注入后一页链接 assign('pagelast', $this->pageLast()); // 注入最后一页链接 assign('pagestatus', $this->pageStatus()); // 注入分页状态 assign('pagenumbar', $this->pageNumBar()); // 注入数字 assign('pageselectbar', $this->pageSelectBar()); // 注入选择栏 } } // 当前页码容错处理 private function page() { $page = get('page', 'int') ?: $this->page; if (is_numeric($page) && $page > 1) { if ($page > $this->pageCount && $this->pageCount) { return $this->pageCount; } else { return $page; } } else { return 1; } } // 过滤pathinfo中分页参数 private function getPreUrl() { if (! isset($this->preUrl) && URL) { $url = parse_url(URL); $path = preg_replace('/\/page\/[0-9]+/i', '', $url['path']); if (defined('CMS_PAGE') && CMS_PAGE == true) { // 使用CMS分页时去除扩展 $url_rule_suffix = Config::get('url_rule_suffix'); if (! ! $pos = strripos($path, $url_rule_suffix)) { $path = substr($path, 0, $pos); } } $this->preUrl = $path; } return $this->preUrl; } // 构建链接地址 private function buildPath($page) { if ($page) { if (defined('CMS_PAGE') && CMS_PAGE == true) { $url_rule_type = Config::get('url_rule_type') ?: 3; $url_rule_suffix = Config::get('url_rule_suffix') ?: '.html'; $url_break_char = Config::get('url_break_char') ?: '_'; $url_rule_sort_suffix = '/'; if ($url_rule_type == 1 || $url_rule_type == 2) { if (defined('CMS_PAGE_CUSTOM')) { // 去分页参数 $prepath = preg_replace('/(.*)' . $url_break_char . '[0-9]+$/', '$1', rtrim($this->getPreUrl(), '/')); } else { $prepath = preg_replace('/(.*)(' . $url_break_char . '[0-9]+)' . $url_break_char . '[0-9]+$/', '$1$2', rtrim($this->getPreUrl(), '/')); } if ($prepath) { // 非首页分页 if ($page == 1) { // 第一页处理 $path = $prepath . $url_rule_sort_suffix . query_string('p,s'); } else { $path = $prepath . $url_break_char . $page . $url_rule_sort_suffix . query_string('p,s'); } } else { // 首页分页 $path = ($page == 1) ? SITE_INDEX_DIR . '/' : '?page=' . $page; } } else { if ($url_rule_type == 3 && isset($_SERVER["QUERY_STRING"]) && $qs = $_SERVER["QUERY_STRING"]) { parse_str($qs, $output); unset($output['page']); if ($output && ! current($output)) { $path_qs = key($output); // 第一个参数为路径信息,注意PHP数组会自动将点转换下划线 unset($output[$path_qs]); // 去除路径参数 // 去后缀扩展 $temp_suffix = substr($url_rule_suffix, 1); if (! ! $pos = strripos($path_qs, '_' . $temp_suffix)) { $path = substr($path_qs, 0, $pos); // 去扩展 } else { $path = $path_qs; } // 去除原分页参数 if (defined('CMS_PAGE_CUSTOM')) { $path = preg_replace('/(.*)' . $url_break_char . '[0-9]+$/', "$1", rtrim($path, '/')); } else { $path = preg_replace('/(.*)(' . $url_break_char . '[0-9]+)' . $url_break_char . '[0-9]+$/', "$1$2", rtrim($path, '/')); } // 第一页链接处理 if ($page == 1) { $path = SITE_INDEX_DIR . '/?' . $path . $url_rule_sort_suffix; } else { $path = SITE_INDEX_DIR . '/?' . $path . $url_break_char . $page . $url_rule_sort_suffix; } // 附加参数 if (! ! $qs = http_build_query($output)) { $path = rtrim($path, '/') . '&' . $qs; } } } if (! $path) { // 转基本分页模式 return $this->buildBasicPage($page); } } return $path; } else { return $this->buildBasicPage($page); } } else { return 'javascript:;'; } } // 构建基本分页 private function buildBasicPage($page) { // 对于路径保留变量给予去除 $qs = $_SERVER["QUERY_STRING"]; if ((M == 'home' && Config::get('url_rule_type') == 2) || (M != 'home' && Config::get('app_url_type') == 2)) { $qs = preg_replace('/[&\?]?p=([\w\/\.]+)?&?/i', '', $qs); $qs = preg_replace('/[&\?]?s=([\w\/\.]+)?&?/i', '', $qs); } $qs = preg_replace('/[&\?]?page=([0-9]+)?/i', '', $qs); if (C == 'Tag') { $qs = false; } if ($page == 1) { if ($qs) { return $this->getPreUrl() . '?' . $qs; } else { return $this->getPreUrl(); } } else { if ($qs) { return $this->getPreUrl() . '?' . $qs . '&page=' . $page; } else { return $this->getPreUrl() . '?page=' . $page; } } } // 分页条 private function pageBar() { if (! $this->pageCount) return "未查询到任何数据!"; $string = "{$this->pageStatus()}"; $string .= "首页"; $string .= "前一页"; $string .= "{$this->pageNumBar()}"; $string .= "后一页"; $string .= "尾页"; // $string .= "{$this->pageSelectBar()}"; return $string; } // 当前页面情况 private function pageStatus() { if (! $this->pageCount) return; return "共" . $this->rowTotal . "条 当前" . $this->page . "/" . $this->pageCount . "页"; } // 首页链接 private function pageIndex() { if (! $this->pageCount) return $this->buildPath(''); return $this->buildPath(1); } // 上一页链接 private function pagePre() { if (! $this->pageCount) return $this->buildPath(''); if ($this->page > 1) { $pre_page = $this->buildPath($this->page - 1); } else { $pre_page = $this->buildPath(''); } return $pre_page; } // 下一页链接 private function pageNext() { if (! $this->pageCount) return $this->buildPath(''); if ($this->page < $this->pageCount) { $next_page = $this->buildPath($this->page + 1); } else { $next_page = $this->buildPath(''); } return $next_page; } // 尾页 private function pageLast() { if (! $this->pageCount) return $this->buildPath(''); return $this->buildPath($this->pageCount); } // 数字分页,要修改数字显示的条数,请修改类头部num属性值 private function pageNumBar() { if (! $this->pageCount) return; if (M == 'admin') { $total = 5; } else { $total = $this->num; } $halfl = intval($total / 2); $halfu = ceil($total / 2); $num_html = ''; if ($this->page > $halfu) { $num_html .= '···'; } if ($this->page <= $halfl || $this->pageCount < $total) { // 当前页小于一半或页数小于总数 for ($i = 1; $i <= $total; $i ++) { if ($i > $this->pageCount) break; if ($this->page == $i) { $num_html .= '' . $i . ''; } else { $num_html .= '' . $i . ''; } } } elseif ($this->page + $halfl >= $this->pageCount) { // 当前页为倒数页以内 for ($i = $this->pageCount - $total + 1; $i <= $this->pageCount; $i ++) { if ($this->page == $i) { $num_html .= '' . $i . ''; } else { $num_html .= '' . $i . ''; } } } else { // 正常的前后各5页 for ($i = $this->page - $halfl; $i <= $this->page + $halfl; $i ++) { if ($this->page == $i) { $num_html .= '' . $i . ''; } else { $num_html .= '' . $i . ''; } } } if ($this->pageCount > $total && $this->page < $this->pageCount - $halfl) { $num_html .= '···'; } return $num_html; } // 跳转分页 private function pageSelectBar() { if (! $this->pageCount) return; $select_html = ''; return $select_html; } }