用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4800|回复: 15
收起左侧

[讨论/交流] 请问 动态数据库 读取出的表格 进行分页 如何实现?MVC结构

[复制链接]
发表于 2015-5-7 15:50:28 | 显示全部楼层 |阅读模式
    请教怎样简单的实现网页内容的分页?
发表于 2015-5-18 15:15:55 | 显示全部楼层
本帖最后由 tokyo2006 于 2015-5-18 15:18 编辑

我来贴一个我自己写的Page类吧
PHP复制代码
<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

 
class Page {
 
    var $page_size = DEFAULT_PAGE_SIZE;
    var $start = DEFAULT_PAGE_START;
    var $total_count;
    var $result;
    var $to_string='this is page object';
 
    function __construct() {
 
    }
 
    public function init($start, $total_count, $page_size, $result)
    {
        $this->page_size = $page_size;
        $this->result = $result;
        $this->total_count = $total_count;
        $this->start = $start;
        return $this;
    }
    /**
     * 取总记录数.
     */

    public function getTotalCount() {
        return $this->total_count;
    }
 
    /**
     * 取总页数.
     */

    public function getTotalPageCount() {
        if ($this->total_count % $this->page_size == 0)
            return intval($this->total_count / $this->page_size);
        else
            return intval($this->total_count / $this->page_size + 1);
    }
 
    /**
     * 取每页数据容量.
     */

    public function getPageSize() {
        return $this->page_size;
    }
 
    /**
     * 取当前页中的记录.
     */

    public function getResult() {
        return $this->result;
    }
 
    /**
     * 取该页当前页码,页码从1开始.
     */

    public function getCurrentPageNo() {
        return intval($this->start / $this->page_size + 1);
    }
 
    /**
     * 该页是否有下一页.
     */

    public function hasNextPage() {
 
        return ($this->getCurrentPageNo() < $this->getTotalPageCount());
    }
 
    /**
     * 该页是否有上一页.
     */

    public function hasPreviousPage() {
        return $this->getCurrentPageNo() > 1;
    }
 
}
 
?>
复制代码


使用的时候你可以先载入这个类然后使用它,请确保在autoload.php中载入了这个类,下面是一个使用page的方法
PHP复制代码
/**     * search area list for page
     * @param type $name
     * @param type $headName
     * @param type $currentPostion
     * @param type $limit
     * @param type $orderName
     * @param type $asc
     * @return type
     */

    public function getAreaList($name, $headName, $currentPage, $limit, $orderName, $asc) {
        $currentPostion = ($currentPage-1)*$limit;
 
        $select = 'select id,name,depth,headName,parentId ';
        $from = ' from tour_area';
        $where = ' where 1=1';
        if ($headName != '') {
            $where = $where . ' and headName='.$headName;
        }
        if ($name != '') {
            $where = $where . ' and name like '.'\'%'.$name.'%\'';
        }
        if ($asc) {
            $where = $where . ' order by ' . ' ' . $orderName . ' asc';
        } else {
            $where = $where . ' order by ' . ' ' . $orderName . ' desc';
        }
        $total_count = $this->db->query('select count(0) as cnt '.$from.$where)->row()->cnt;
        $where = $where . ' limit ' . $currentPostion . ',' . $limit;
        $result = $this->db->query($select.$from.$where)->result();
        $page = new Page();
 
        $page->init($currentPostion, $total_count, $limit,$result);
        return $page;
    }
复制代码

虽然我的实现方法可能有些笨拙,但是基本上可以满足我的开发需求
发表于 2015-5-7 16:01:27 | 显示全部楼层
你該先看的是 Active Record 类的 $this->db->limit();
 楼主| 发表于 2015-5-7 16:58:46 | 显示全部楼层
Closer 发表于 2015-5-7 16:01
你該先看的是 Active Record 类的 $this->db->limit();

很感谢你的指点。
 楼主| 发表于 2015-5-9 09:48:04 | 显示全部楼层
本帖最后由 greedefoxes 于 2015-5-9 09:53 编辑

因为动态数据库,记录数会一直变化,这种情况下将记录以表格形式进行分页展示,该怎样写代码?有高人再指点下吗?就是手册的那个pagination具体该怎么应用,谁告诉下吧。。。我可以获取到当前记录总数,就是怎么套用这个pagination不晓得。。现在只会将全部记录展示在一张网页里。。。数据量大的话很不现实。。。
发表于 2015-5-10 02:12:40 | 显示全部楼层
greedefoxes 发表于 2015-5-9 09:48
因为动态数据库,记录数会一直变化,这种情况下将记录以表格形式进行分页展示,该怎样写代码?有高人再指点 ...

沒用過分頁類...
自己寫的彈性比較高
我已經跟你提示 limit() 了
做個分頁,Active Record 类都能幫你達成
 楼主| 发表于 2015-5-11 10:59:13 | 显示全部楼层
本帖最后由 greedefoxes 于 2015-5-11 11:23 编辑
Closer 发表于 2015-5-10 02:12
沒用過分頁類...
自己寫的彈性比較高
我已經跟你提示 limit() 了

小弟不才,active record还是不太会用。直接用的sql。
function list_users($limit,$offset,$catagory)//获取限定行的函数
{
                                //$this->db->limit($limit,$offset);
                                $sql = "select * from basic_information where catagory='$catagory' &&operator=1 limit $limit,$offset;";
                                $res = $this->db->query($sql);
                                return $res->result_array();
}
可以输出限定行数,我也可以得到总行数的变量值
function get_pgnumber($catagory)//获取特定catagory的总记录数 {
                         $query = $this->db->query("select count(*) as total from basic_information where catagory='$catagory' &&operator=1 ;");
                        $result = $query->result();
                        return $result[0]->total;

}
现在的问题是我怎样实现异步分页,我只会在该网页表格里显示部分行。
这是controllers的部分代码
                        $this->load->model("M_user");
                        $data['users']=$this->M_user->list_users(0,10,1);
                        $data['lists']=$this->M_user->get_pgnumber(1);
                        $this->load->view("meterial\meterial_look",$data);//将数据传到视图层






发表于 2015-5-11 11:33:32 | 显示全部楼层
本帖最后由 Closer 于 2015-5-11 11:43 编辑
greedefoxes 发表于 2015-5-11 10:59
小弟不才,limit还是不太会用。直接用的sql。
function list_users($limit,$offset,$catagory)//获取限定 ...

我這是寫的給你參考 (Model) :
PHP复制代码
 
/*
 * $table = 資料表名稱
 * $th = 欄位
 * $td = 欄位值
 * $order = 排序欄位
 * $mode = 排序方式
 * $start = 起始筆數
*/

 
class Test extends CI_Model {
    //搜尋指定資料表的資料,取出20筆資料,並加以排序
    public function TestModel($table,$th,$td,$order,$mode,$start){
    $query = $this->db->where($th,$td)->order_by($order,$mode)->limit('20',$start)->get($table);
        if($query->num_rows() > 0){
            return $query->result_array();
        }
        return;
    }
}
复制代码


C 端的使用方式 :
PHP复制代码
 
$this->load->model('Test');
$start= ($page - 1) * 20;
$get_data = $this->Test->TestModel($table,$th,$td,$order,$mode,$start);
 
复制代码


如果你搜尋的條件比較多
只要多次執行下面兩段就好 (模糊搜尋 / 絕對搜尋)
$this->db->like();
$this->db->where();
看你有幾個欄位
多次 for OR foreach 的方式去呼叫

對了,上面只有做到 "取值"
如果你需要 < 1 2 3 >
你就依照 $page 作為參數傳入你自製的 model 方法
再回傳分頁的 HTML 語法,用這種方式連接 :
$page_html = '<a>';
$page_html .= 'test';
$page_html .= '</a>';
 
 楼主| 发表于 2015-5-12 11:22:42 | 显示全部楼层
我觉得如果没有封装好的方法供我使用的话,分页对我来说很烦恼,按照前辈的方法我取数据是没有问题了,但是视图界面还是个困扰,对View而言,他是不知道我一共有多少页,那我页码、链接这块的代码该怎么写
fpage.jpg
发表于 2015-5-12 15:16:31 | 显示全部楼层
頁碼大部分會用 GET 取
看看你的網址列吧
 楼主| 发表于 2015-5-12 17:01:28 | 显示全部楼层
本帖最后由 greedefoxes 于 2015-5-20 08:54 编辑

原本是想着 用GET 传页码 ,只是在罗列页码时犯了难
                  <ul class="pagination">
                        <li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>
                        <li class="active"><a href="#">1 <span class="sr-only">(current)</span></a></li>
                        <li><a href="#">2 <span class="sr-only">(current)</span></a></li>
                        <li>
                          <a href="#" aria-label="Next">
                                <span aria-hidden="true">»</span>
                          </a>
                        </li>
                  </ul>

我就在想 我又不知道一共多少页 这怎么罗列<li> </li> 啊。然后上网搜CI的分页类,看得一头雾水,所以才来求助。
    多亏前辈帮忙梳理了下头绪,还帮助我理解了Active Record的用法,Active Record帮助我理解了网上关于CI分页类使用方法的例子,我今天初步弄懂了CI的分页类的使用,只不过返回第一页的时候还是有问题,哎,我还得继续摸索。而且,单纯应用CI分页类的话,界面实在太难看了。。。而且,复杂的表格(表格里有按钮的)无法应用。我还得努力啊。。。

本版积分规则