• 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
  • 相关阅读:
    布局常见问题之css实现多行文本溢出显示省略号(…)全攻略
    网站常用js代码搜集
    js--事件对象的理解5-
    js--事件对象的理解4
    关于.NET邮件的收发问题总结
    .net 与 javascript脚本的几种交互方法
    word在线编辑生成图片(包含截图与合并)
    使用GDI+轻松创建缩略图
    C#反射之基础应用
    C# Winform 实现自定义半透明loading加载遮罩层
  • 原文地址:https://www.cnblogs.com/zhouqingda/p/5903503.html
Copyright © 2020-2023  润新知