peixunguanwang/core/view/Paging.php
2022-03-30 09:13:50 +08:00

396 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @copyright (C)2016-2099 Hnaoyun Inc.
* @author XingMeng
* @email hnxsh@foxmail.com
* @date 2016年11月6日
* 分页控制类
*/
namespace core\view;
use core\basic\Config;
class Paging
{
// 每页数量
public $pageSize;
// 当前页码
public $page;
// 数字条数量
public $num = 5;
// 调整数量
public $start = 1;
// 总记录
private $rowTotal = 0;
// 页面数量
private $pageCount;
// 存储前置URL
private $preUrl;
// 分页实例
private static $paging;
private function __construct()
{
// 禁用类new实例化
}
// 获取单一实例
public static function getInstance()
{
if (! self::$paging) {
self::$paging = new self();
}
return self::$paging;
}
// 限制语句
public function limit($total = null, $morePageStr = false)
{
// 起始数据调整
if (! is_numeric($this->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 ($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 "<span class='page-none' style='color:#999'>未查询到任何数据!</span>";
$string = "<span class='page-status'>{$this->pageStatus()}</span>";
$string .= "<span class='page-index'><a href='" . $this->pageIndex() . "'>首页</a></span>";
$string .= "<span class='page-pre'><a href='" . $this->pagePre() . "'>前一页</a></span>";
$string .= "<span class='page-numbar'>{$this->pageNumBar()}</span>";
$string .= "<span class='page-next'><a href='" . $this->pageNext() . "'>后一页</a></span>";
$string .= "<span class='page-last'><a href='" . $this->pageLast() . "'>尾页</a></span>";
// $string .= "<span class='page-select'>{$this->pageSelectBar()}</span>";
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 .= '<span class="page-num">···</span>';
}
if ($this->page <= $halfl || $this->pageCount < $total) { // 当前页小于一半或页数小于总数
for ($i = 1; $i <= $total; $i ++) {
if ($i > $this->pageCount)
break;
if ($this->page == $i) {
$num_html .= '<a href="' . $this->buildPath($i) . '" class="page-num page-num-current">' . $i . '</a>';
} else {
$num_html .= '<a href="' . $this->buildPath($i) . '" class="page-num">' . $i . '</a>';
}
}
} elseif ($this->page + $halfl >= $this->pageCount) { // 当前页为倒数页以内
for ($i = $this->pageCount - $total + 1; $i <= $this->pageCount; $i ++) {
if ($this->page == $i) {
$num_html .= '<a href="' . $this->buildPath($i) . '" class="page-num page-num-current">' . $i . '</a>';
} else {
$num_html .= '<a href="' . $this->buildPath($i) . '" class="page-num">' . $i . '</a>';
}
}
} else { // 正常的前后各5页
for ($i = $this->page - $halfl; $i <= $this->page + $halfl; $i ++) {
if ($this->page == $i) {
$num_html .= '<a href="' . $this->buildPath($i) . '" class="page-num page-num-current">' . $i . '</a>';
} else {
$num_html .= '<a href="' . $this->buildPath($i) . '" class="page-num">' . $i . '</a>';
}
}
}
if ($this->pageCount > $total && $this->page < $this->pageCount - $halfl) {
$num_html .= '<span class="page-num">···</span>';
}
return $num_html;
}
// 跳转分页
private function pageSelectBar()
{
if (! $this->pageCount)
return;
$select_html = '<select onchange="changepage(this)" lay-ignore>';
for ($i = 1; $i <= $this->pageCount; $i ++) {
if ($i == $this->page) {
$select_html .= '<option value="' . $i . '" selected="selected">跳到' . $i . '页</option>';
} else {
$select_html .= '<option value="' . $i . '">跳到' . $i . '页</option>';
}
}
$select_html .= '</select><script>function changepage(tag){window.location.href="' . $this->buildPath('"+tag.value+"') . '";}</script>';
return $select_html;
}
}