How to Build a Custom Pagination Class in ThinkPHP 5.1

This guide shows how to create a reusable pagination class for ThinkPHP 5.1, configure it in a paginate.php file, integrate it into your view templates, and style the pagination output with custom CSS.

Open Source Tech Hub
Open Source Tech Hub
Open Source Tech Hub
How to Build a Custom Pagination Class in ThinkPHP 5.1

Custom Pagination Class

<?php
/**
 * +----------------------------------------------------------
 * @desc: Tp5.1 自定义分页类
 * +----------------------------------------------------------
 * @Author Tinywan
 * +----------------------------------------------------------
 */
namespace page;
use think\Paginator;

class Page extends Paginator
{
    /**
     * 上一页按钮
     * @param string $text
     * @return string
     */
    protected function getPreviousButton($text = '< 上一页')
    {
        if ($this->currentPage() <= 1) {
            return $this->getDisabledTextWrapper($text);
        }
        $url = $this->url($this->currentPage() - 1);
        return $this->getPageLinkWrapper($url, $text);
    }

    /**
     * 下一页按钮
     * @param string $text
     * @return string
     */
    protected function getNextButton($text = '下一页 >')
    {
        if (!$this->hasMore()) {
            return $this->getDisabledTextWrapper($text);
        }
        $url = $this->url($this->currentPage() + 1);
        return $this->getPageLinkWrapper($url, $text);
    }

    /**
     * @Desc: 统计信息
     * @return string
     */
    protected function info()
    {
        return '<li><span>共 ' . $this->total . ' 条</span></li>';
    }

    /**
     * 页码按钮
     * @return string
     */
    protected function getLinks()
    {
        $block = [];
        $side = 3;
        $window = $side * 2;
        if ($this->lastPage < $window + 6) {
            $block['first'] = $this->getUrlRange(1, $this->lastPage);
        } elseif ($this->currentPage <= $window) {
            $block['first'] = $this->getUrlRange(1, $window + 2);
            $block['last'] = $this->getUrlRange($this->lastPage, $this->lastPage);
        } elseif ($this->currentPage > $this->lastPage - $window) {
            $block['first'] = $this->getUrlRange(1, 2);
            $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
            $block['last'] = $this->getUrlRange($this->lastPage - $window, $this->lastPage);
        } else {
            $block['first'] = $this->getUrlRange(1, 2);
            $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
            $block['last'] = $this->getUrlRange($this->lastPage - $window, $this->lastPage);
        }
        $html = '';
        if (is_array($block['first'])) {
            $html .= $this->getUrlLinks($block['first']);
        }
        if (is_array($block['slider'])) {
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block['slider']);
        }
        if (is_array($block['last'])) {
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block['last']);
        }
        return $html;
    }

    /**
     * 渲染分页html
     * @return mixed
     */
    public function render()
    {
        if ($this->hasPages()) {
            if ($this->simple) {
                return sprintf('<ul>%s %s %s</ul>', $this->info(), $this->getPreviousButton(), $this->getNextButton());
            } else {
                return sprintf('<ul>%s %s %s %s</ul>', $this->info(), $this->getPreviousButton(), $this->getLinks(), $this->getNextButton());
            }
        }
    }

    /**
     * 生成一个可点击的按钮
     * @param string $url
     * @param int $page
     * @return string
     */
    protected function getAvailablePageWrapper($url, $page)
    {
        return '<li><a href="' . htmlentities($url) . '">' . $page . '</a></li>';
    }

    /**
     * 生成一个禁用的按钮
     * @param string $text
     * @return string
     */
    protected function getDisabledTextWrapper($text)
    {
        return '<li class="disabled"><span>' . $text . '</span></li>';
    }

    /**
     * 生成一个激活的按钮
     * @param string $text
     * @return string
     */
    protected function getActivePageWrapper($text)
    {
        return '<li class="active"><span>' . $text . '</span></li>';
    }

    /**
     * 生成省略号按钮
     * @return string
     */
    protected function getDots()
    {
        return $this->getDisabledTextWrapper('...');
    }

    /**
     * 批量生成页码按钮.
     * @param array $urls
     * @return string
     */
    protected function getUrlLinks(array $urls)
    {
        $html = '';
        foreach ($urls as $page => $url) {
            $html .= $this->getPageLinkWrapper($url, $page);
        }
        return $html;
    }

    /**
     * 生成普通页码按钮
     * @param string $url
     * @param int $page
     * @return string
     */
    protected function getPageLinkWrapper($url, $page)
    {
        if ($this->currentPage() == $page) {
            return $this->getActivePageWrapper($page);
        }
        return $this->getAvailablePageWrapper($url, $page);
    }
}
?>

Configuration File

return [
    'type'      => 'page\Page',
    'var_page'  => 'page',
    'list_rows' => 15,
];

Using the Pagination in a Template

<div class="pagelist">
    {$page|raw}
</div>

Custom CSS Styling

.pagelist {
    margin-top: 50px;
    margin-bottom: 35px;
}
.pagelist ul {
    text-align: center;
    font-size: 0;
}
.pagelist ul li {
    display: inline-block;
    margin: 0 3px;
}
.pagelist ul li a {
    padding: 9px 15px;
    font-size: 14px;
    display: block;
    background: #222;
    color: #fff;
}
.pagelist ul li span {
    padding: 9px 15px;
    font-size: 14px;
    display: block;
    color: #333;
}
.pagelist ul li.active a {
    background: none;
    color: #333;
    border: 1px solid #e5e5e5;
}
.pagelist ul li.disabled span {
    background: none;
    color: #333;
    border: 1px solid #e5e5e5;
}
.pagelist ul li.pageprev a,
.pagelist ul li.pagenext a {
    background: none;
    color: #333;
    border: 1px solid #e5e5e5;
}
.pagelist ul li:hover {
    transform: scale(0.95);
}
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

paginationPHPTutorialThinkPHP
Open Source Tech Hub
Written by

Open Source Tech Hub

Sharing cutting-edge internet technologies and practical AI resources.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.