ThinkPHP 分页功能梳理

      最近在开发一个项目,使用了国内流行的ThinkPHP框架,我之前没怎么用过这个框架,也是临时抱佛脚,用的不怎么样?可能理解不是很深刻,如果有说的不对或不正确的地方,请大家多包涵,多指教。

ThinkPHP简介

      首先,说说怎么学习这个框架,当然是上官网,看官方的文档。地址如下:http://thinkphp.cn,可以下载开发包和开发手册。

      第二,说说这个框架的优点,这个框架能流行起来,一定有很多优点。我仅根据我的感受说三点:1)注释完全中文化,我喜欢(因为俺E文不好);2)框架的功能实现比较简洁,相比其它的框架,学习成本较低;3)广泛使用cacha,大大提升了网站的运行速度。

分页思考

      说了这么题外话,还没有说到今天的主题知识---分页。接下来,就详细梳理一下,ThinkPHP分页流程。

      首先问两个小白问题:

     1)为什么要分页?

  分页确实有效,但它一定会加大系统的复杂度,但可否不分页呢? 如果数据量少的话当然可以.但是对于企业信息系统来说数据量不会限制在一个小范围内.如果不顾一切的Select * from某个表,再将返回的数据一古脑的扔给客户,即使客户能够忍受成千上万足够让人眼花缭乱的表格式数据,繁忙的网络,紧张的服务器也会提出它们无声的抗议,甚至有时会以彻底的罢工作为终结.

     2)在哪里进行分页比较合适?

     要回答这个问题,就要了解我们的系统架构,现在的B/S系统一般都是三层架构,如下图所示。

     

     也就是说,分页可以在浏览器,web服务器和数据库三个地方实现。究竟哪个地方好呢?为什么?(这个问题留给大家思考)

分页实现

     上面说的都是原理,下面说说技术实现。thinkphp的分页处理放在数据库这一层上面,是非常合理的做法。下面分页的实例基于ThinkPHP3.2.3实现。

     首先,我们要创建需要分页的数据。建表如下:

     CREATE TABLE `my_usertest` (
             `id` int(11) NOT NULL,
             `account` varchar(32) NOT NULL,
             `pwd` varchar(64) NOT NULL,
             PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     自己可以根据需要插入多条数据。

     第二步, 创建分页对象函数,获取thinkPHP自带的分页组件。     

/**
 * TODO 基础分页的相同代码封装,使前台的代码更少
 * @param $count 要分页的总记录数
 * @param int $pagesize 每页查询条数
 * @return ThinkPage
 */
function getpage($count, $pagesize = 10) {
    $p = new ThinkPage($count, $pagesize);
    $p->setConfig('header', '<li class="rows">共<b>%TOTAL_ROW%</b>条记录&nbsp;第<b>%NOW_PAGE%</b>页/共<b>%TOTAL_PAGE%</b>页</li>');
    $p->setConfig('prev', '上一页');
    $p->setConfig('next', '下一页');
    $p->setConfig('last', '末页');
    $p->setConfig('first', '首页');
    $p->setConfig('theme', '%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%%HEADER%');
    $p->lastSuffix = false;//最后一页不显示为总页数
    return $p;
}

      第三步,在控制器侧,进行调用分页对象。

public function showAllUsers() {
        $m = M('usertest');      
        $where = "id>10";
        $count = $m->where($where)->count();
        $p = getpage($count,3);
        $list = $m->field(true)->where($where)->order('id')->limit($p->firstRow, $p->listRows)->select();
        $this->assign('select', $list); // 赋值数据集
        $this->assign('page', $p->show()); // 赋值分页输出
        $this->display();
    }

     第四步,页面数据展示处理。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>分页实例</title>
        
        <style>
        .pages a,.pages span {
            display:inline-block;
            padding:2px 5px;
            margin:0 1px;
            border:1px solid #f0f0f0;
            -webkit-border-radius:3px;
            -moz-border-radius:3px;
            border-radius:3px;
        }
        .pages a,.pages li {
            display:inline-block;
            list-style: none;
            text-decoration:none; color:#58A0D3;
        }
        .pages a.first,.pages a.prev,.pages a.next,.pages a.end{
            margin:0;
        }
        .pages a:hover{
            border-color:#50A8E6;
        }
        .pages span.current{
            background:#50A8E6;
            color:#FFF;
            font-weight:700;
            border-color:#50A8E6;
        }
        </style>
    </head>

    <body>
        <table width="80%" border="1" cellpadding="1" cellspacing="1" bgcolor="#99CC33" bordercolor="#FFFFFF">

            <tr>
                <td colspan="3" bgcolor="#FFFFFF" class="title" align="center">用户表分页</td>
            </tr>
            <tr class="title">
                <td bgcolor="#FFFFFF" width="44">ID</td>
                <td bgcolor="#FFFFFF" width="120">账号</td>
                <td bgcolor="#FFFFFF" width="223">密码</td>
            </tr>
            <foreach name='select' item='user' >
                <tr class="content">
                    <td bgcolor="#FFFFFF">&nbsp;{$user.id}</td>
                    <td bgcolor="#FFFFFF">&nbsp;{$user.account}</td>
                    <td bgcolor="#FFFFFF">&nbsp;{$user.pwd}</td>
                </tr>
            </foreach>
            <tr class="content">
                <td colspan="3" bgcolor="#FFFFFF"><div class="pages">
                    {$page}
                </div></td>  
            </tr>
        </table>
    </body>
</html>

       最后效果如下图所示:

       

      

      

本博客的所有博文,大都来自自己的工作实践。希望对大家有用,欢迎大家交流和学习。 我的新站:www.huishougo.com
原文地址:https://www.cnblogs.com/zhouqingda/p/5903503.html