• 精创网络
  • 精创网络
  • 首页
  • 产品优势
  • 产品价格
  • 产品功能
  • 新闻中心
  • 关于我们
  • 在线客服
  • 登录
  • DDoS防御和CC防御
  • 精创网络云防护,专注于大流量DDoS防御和CC防御。可防止SQL注入,以及XSS等网站安全漏洞的利用。
  • 免费试用
  • 新闻中心
  • 关于我们
  • 资讯动态
  • 帮助文档
  • 白名单保护
  • 常见问题
  • 政策协议
  • 帮助文档
  • 掌握ThinkPHP5框架中分页功能的实现方法
  • 来源:www.jcwlyf.com浏览:11更新:2025-11-12
  • 在Web开发中,当需要展示大量数据时,分页功能是必不可少的。ThinkPHP5作为一款优秀的PHP开发框架,提供了便捷的分页功能,能够帮助开发者轻松实现数据的分页展示。本文将详细介绍ThinkPHP5框架中分页功能的实现方法,让你全面掌握这一重要技能。

    ThinkPHP5分页功能概述

    ThinkPHP5的分页功能是基于数据库查询结果进行封装的,它可以自动生成分页链接和分页信息。使用ThinkPHP5的分页功能,你无需手动计算分页的偏移量、每页显示的记录数等复杂的逻辑,框架会帮你处理好这些细节,大大提高开发效率。

    环境准备

    在开始使用ThinkPHP5的分页功能之前,需要确保你已经安装了ThinkPHP5框架。如果你还没有安装,可以通过Composer进行安装,打开命令行工具,执行以下命令:

    composer create-project topthink/think=5.1.* tp5 --prefer-dist

    安装完成后,进入项目目录,配置好数据库连接信息,在项目的 application/database.php 文件中进行配置,示例如下:

    return [
        // 数据库类型
        'type'            => 'mysql',
        // 服务器地址
        'hostname'        => '127.0.0.1',
        // 数据库名
        'database'        => 'your_database_name',
        // 用户名
        'username'        => 'your_username',
        // 密码
        'password'        => 'your_password',
        // 端口
        'hostport'        => '3306',
        // 数据库编码默认采用utf8
        'charset'         => 'utf8',
        // 数据库表前缀
        'prefix'          => '',
    ];

    基本分页实现

    下面我们通过一个简单的示例来演示ThinkPHP5分页功能的基本使用。假设我们有一个 users 表,需要对该表中的数据进行分页展示。

    首先,在控制器中编写代码,打开 application/index/controller/Index.php 文件,添加以下代码:

    <?php
    namespace app\index\controller;
    
    use think\Db;
    use think\facade\View;
    
    class Index
    {
        public function index()
        {
            // 查询数据并进行分页,每页显示10条记录
            $list = Db::name('users')->paginate(10);
    
            // 获取分页显示
            $page = $list->render();
    
            // 把分页数据赋值给模板变量list
            View::assign('list', $list);
            // 把分页信息赋值给模板变量page
            View::assign('page', $page);
    
            // 渲染模板输出
            return View::fetch();
        }
    }

    在上述代码中,我们使用 Db::name('users')->paginate(10) 方法从 users 表中查询数据并进行分页,每页显示10条记录。然后使用 $list->render() 方法获取分页的HTML代码。最后,将查询结果和分页信息传递给视图模板。

    接下来,创建视图模板文件,在 application/index/view/index/index.html 中编写以下代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户列表</title>
    </head>
    <body>
        <table border="1">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>邮箱</th>
                </tr>
            </thead>
            <tbody>
                {foreach $list as $user}
                <tr>
                    <td>{$user.id}</td>
                    <td>{$user.username}</td>
                    <td>{$user.email}</td>
                </tr>
                {/foreach}
            </tbody>
        </table>
        <!-- 分页显示 -->
        {$page}
    </body>
    </html>

    在视图模板中,我们使用 {foreach} 标签遍历查询结果并显示数据,使用 {$page} 输出分页信息。

    自定义分页样式

    ThinkPHP5默认的分页样式可能不符合我们的项目需求,这时可以自定义分页样式。ThinkPHP5提供了多种方式来实现自定义分页样式,下面介绍一种常用的方法。

    首先,在控制器中修改代码,指定分页的样式模板文件:

    $list = Db::name('users')->paginate(10, false, [
        'query' => request()->param(),
        'type' => 'app\common\paginate\Bootstrap',
    ]);

    在上述代码中,我们通过 type 参数指定了自定义的分页类 app\common\paginate\Bootstrap。接下来,创建自定义分页类文件 application/common/paginate/Bootstrap.php,添加以下代码:

    <?php
    namespace app\common\paginate;
    
    use think\Paginator;
    
    class Bootstrap 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);
        }
    
        /
         * 页码按钮
         * @return string
         */
        protected function getLinks()
        {
            if ($this->simple) {
                return '';
            }
    
            $block = [
                'first'  => null,
                'slider' => null,
                'last'   => null
            ];
    
            $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 - 1, $this->lastPage);
            } elseif ($this->currentPage > ($this->lastPage - $window)) {
                $block['first'] = $this->getUrlRange(1, 2);
                $block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $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 - 1, $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 string
         */
        public function render()
        {
            if ($this->hasPages()) {
                if ($this->simple) {
                    return sprintf(
                        '<ul class="pager">%s %s</ul>',
                        $this->getPreviousButton(),
                        $this->getNextButton()
                    );
                } else {
                    return sprintf(
                        '<ul class="pagination">%s %s %s</ul>',
                        $this->getPreviousButton(),
                        $this->getLinks(),
                        $this->getNextButton()
                    );
                }
            }
        }
    
        /
         * 生成一个可点击的按钮
         *
         * @param  string $url
         * @param  int    $page
         * @return string
         */
        protected function getAvailablePageWrapper($url, $page)
        {
            return '<a href="' . htmlentities($url) . '">' . $page . '</a>';
        }
    
        /
         * 生成一个禁用的按钮
         *
         * @param  string $text
         * @return string
         */
        protected function getDisabledTextWrapper($text)
        {
            return '<li class="disabled"><span>' . $text . '</span>';
        }
    
        /
         * 生成一个激活的按钮
         *
         * @param  string $text
         * @return string
         */
        protected function getActivePageWrapper($text)
        {
            return '<li class="active"><span>' . $text . '</span>';
        }
    
        /
         * 生成省略号按钮
         *
         * @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 ($page == $this->currentPage()) {
                return $this->getActivePageWrapper($page);
            }
    
            return $this->getAvailablePageWrapper($url, $page);
        }
    }

    通过以上步骤,我们就实现了自定义分页样式。

    分页参数设置

    ThinkPHP5的分页功能还支持一些参数设置,例如自定义分页参数名、自定义分页变量名等。下面介绍一些常用的参数设置方法。

    自定义分页参数名:

    $list = Db::name('users')->paginate(10, false, [
        'query' => request()->param(),
        'var_page' => 'p',
    ]);

    在上述代码中,通过 var_page 参数将分页参数名从默认的 page 改为 p。

    自定义分页变量名:

    $list = Db::name('users')->paginate(10, false, [
        'query' => request()->param(),
        'list_rows' => 'limit',
    ]);

    通过 list_rows 参数将每页显示记录数的变量名从默认的 list_rows 改为 limit。

    总结

    通过本文的介绍,我们详细了解了ThinkPHP5框架中分页功能的实现方法。从基本的分页实现到自定义分页样式,再到分页参数设置,我们逐步掌握了ThinkPHP5分页功能的各个方面。在实际开发中,合理运用分页功能可以提高用户体验,优化数据展示效果。希望本文对你有所帮助,让你在使用ThinkPHP5进行开发时能够更加得心应手。

  • 关于我们
  • 关于我们
  • 服务条款
  • 隐私政策
  • 新闻中心
  • 资讯动态
  • 帮助文档
  • 网站地图
  • 服务指南
  • 购买流程
  • 白名单保护
  • 联系我们
  • QQ咨询:189292897
  • 电话咨询:16725561188
  • 服务时间:7*24小时
  • 电子邮箱:admin@jcwlyf.com
  • 微信咨询
  • Copyright © 2025 All Rights Reserved
  • 精创网络版权所有
  • 皖ICP备2022000252号
  • 皖公网安备34072202000275号