CI中的分页,框架分页函数及相关知识

  依照MVC的怀恋,分页是亟需传数据到模型中,把页码传过去,在模型中依照页码分配;

诚如在多少分页的时候要求得到当前页的数码和总条数,一般人是在model中封装多个函数分别取得当前页的多少和数量总条数,业务逻辑类似,感觉有点冗余,可以封装在一道:

相似在数码分页的时候须求得到当前页的多少和总条数,一般人是在model中封装多个函数分别赢得当前页的数据和数据总条数,业务逻辑类似,感觉有点冗余,可以封装在共同:

复制代码 代码如下:

  愈多分页类函数可以透过CI手册的分页类查看;

复制代码 代码如下:

复制代码 代码如下:

<?php
function page($page,$total,$phpfile,$pagesize=10,$pagelen=7){
    $pagecode = ”;//定义变量,存放分页生成的HTML
    $page = intval($page);//幸免非数字页码
    $total = intval($total);//有限支撑总记录数值类型正确
    if(!$total) return array();//总记录数为零重临空数组
    $pages = ceil($total/$pagesize);//计算总分页
    //处理页码合法性
    if($page<1) $page = 1;
    if($page>$pages) $page = $pages;
    //统计查询偏移量
    $offset = $pagesize*($page-1);
    //页码范围总结
    $init = 1;//伊始页码数
    $max = $pages;//甘休页码数
    $pagelen = ($pagelen%2)?$pagelen:$pagelen+1;//页码个数
    $pageoffset = ($pagelen-1)/2;//页码个数左右偏移量

    $this -> load
->library(‘pagination’);    //加载分页类;

/**
* 获取分页数据及总条数
* @param string @tablename 表名
* @param mixed $where 条件
* @param int $limit 每页条数
*CI中的分页,框架分页函数及相关知识。 @param int $offset 当前页
*/
public function get_page_data($tablename, $where, $limit, $offset,
$order_by, $db)
{
if(empty($tablename))
{
return FALSE;
}

/**
     * 获取分页数据及总条数
     * @param string @tablename 表名
     * @param mixed $where 条件
     * @param int $limit 每页条数
     * @param int $offset 当前页
     */
    public function get_page_data($tablename, $where, $limit, $offset,
$order_by, $db)
    {
        if(empty($tablename))
        {
            return FALSE;
        }
       
        $dbhandle = empty($db) ? $this->db : $db;
       
        if($where)
        {
            if(is_array($where))
            {
                $dbhandle->where($where);
            }
            else
            {
                $dbhandle->where($where, NULL, false);
            }
        }
       
        $db = clone($dbhandle);
        $total = $dbhandle->count_all_results($tablename);
       
        if($limit)
        {
            $db->limit($limit);
        }
       
        if($offset)
        {
            $db->offset($offset);
        }
       
        if($order_by)
        {
            $db->order_by($order_by);
        }
       
        $data = $db->get($tablename)->result_array();
       
        return array(‘total’ => $total, ‘data’ => $data);
    }

    //生成html
    $pagecode='<div class=”page”>’;
    $pagecode.=”<span>$page/$pages</span>”;//第几页,共几页
    //如果是第贰页,则不出示第3、页和上一页的连日
    if($page!=1){
        $pagecode.=”<a href=\”{$phpfile}?page=1\”><<</a>”;//第一页
        $pagecode.=”<a href=\”{$phpfile}?page=”.($page-1).”\”><</a>”;//上一页
    }
    //分页数大于页码个数时可以偏移
    if($pages>$pagelen){
        //若是当前页小于等于左偏移
        if($page<=$pageoffset){
            $init=1;
            $max = $pagelen;
        }else{//若是当前页大于左偏移
            //假若当前页码右偏移超出最大分页数
            if($page+$pageoffset>=$pages+1){
                $init = $pages-$pagelen+1;
            }else{
                //左右偏移都留存时的计量
                $init = $page-$pageoffset;
                $max = $page+$pageoffset;
            }
        }
    }
    //生成html
    for($i=$init;$i<=$max;$i++){
        if($i==$page){
            $pagecode.='<span>’.$i.'</span>’;
        } else {
            $pagecode.=”<a href=\”{$phpfile}?page={$i}\”>$i</a>”;
        }
    }
    if($page!=$pages){
        $pagecode.=”<a href=\”{$phpfile}?page=”.($page+1).”\”>></a>”;//下一页
        $pagecode.=”<a href=\”{$phpfile}?page={$pages}\”>>></a>”;//最终一页
    }
    $pagecode.=”<input type=\”text\” size=\”3\” onkeydown=\”if(event.keyCode==13) {window.location.href='{$phpfile}?page=’+this.value; return false;}\” /></div>”;
    return array(‘pagecode’=>$pagecode,’sqllimit’=>’ limit ‘.$offset.’,’.$pagesize);
}
?>

    $this -> load -> helper[‘uri’];    //加载uri类;

$dbhandle = empty($db) ? $this->db : $db;

CI框架分页类使用体验

加了页码跳转文本框
以下是新手使用验证

    $page_size = 10;    //定义1个每页显示10条数据的变量;

if($where)
{
if(is_array($where))
{
$dbhandle->where($where);
}
else
澳门葡京备用网址 ,{
$dbhandle->where($where, NULL, false);
}
}

CI分页的url地址有三种办法
a) locahost/news/page/2 这些2代表第贰页
b) localhost/news/page/20
那一个20表示从第30条记下开头分页,即页面的率先条记下,是数据库中的第一0条记下。
c) localhost/news?per_page=2 第二页
d) localhost/news?per_page=20 同b)

复制代码 代码如下:

    $config[‘base_url’] =
site_url(‘控制器/方法’)  //动态获取分页类链接;

$db = clone($dbhandle);
$total = $dbhandle->count_all_results($tablename);

先是我们先看一下CI分页的参数:

<?php
$phpfile = ‘index.php’;//页面文件名
$page= isset($_GET[‘page’])?$_GET[‘page’]:1;//默许页码
$db = mysql_connect(‘localhost’,’test’,’test’);//链接数据库
mysql_select_db(‘test’,$db);//采取数据库
$counts = mysql_num_rows(mysql_query(‘select `id` from `test`’,$db));//获取要求的数额总条数
$sql=’select `id`,`title` from `test`’;//定义查询语句SQL
$getpageinfo = page($page,$counts,$phpfile);//调用函数,生成分页HTML 和 SQL LIMIT 子句
$sql.=$getpageinfo[‘sqllimit’];//组合完整的SQL语句
$data = $row = array();//伊始化数组
$result = mysql_query($sql,$db);//获取结果集
//将数据装入$data数组
while($row = mysql_fetch_array($result)){
     $data[]=$row;
}
?>
<?php
echo $getpageinfo[‘pagecode’];//突显分页的html代码
?>

    $config[‘total_rows’] = 100 ;    //配置分页总条数;

if($limit)
{
$db->limit($limit);
}

复制代码 代码如下:

======================
补贴css

    $config[‘per_page’] = $page_size
;    //配置暗中同意设置每页展现多少条数据;

if($offset)
{
$db->offset($offset);
}

$config[‘base_url’] = $url;  
/* 分页的根基 U奇骏L
假使你想用a、b的链接情势,则该url应该格局如/news/page/ 
设若链接是c、d的款型,则url应该如/news? 
*/ 
$config[‘total_rows’] =
$total;//记录总数,那么些没什么好说的了,就是您从数据库取得记录总数  
$config[‘per_page’] = $pagesize;
//每页条数。额,那一个也没怎么好说的。。自个儿设定。专断认同为10近乎。  
$config[‘page_query_string’] = TRUE;  
/*传参形式。开启true则会自动在您的url后边加上&per_page=3。(这个per_page是默许的查询字符,当然你也可以用$config[‘query_string_segment’]来协调设定)
因而c、d中的方式一般是为localhost/news?&per_page=2不过都同样,没什么影响。get的per_page还是3 
*/ 
$config[‘first_link’] = ‘首页’; // 第一,页呈现  
$config[‘last_link’] = ‘末页’; // 最终一页突显  
$config[‘next_link’] = ‘下一页 >’; // 下一页突显  
$config[‘prev_link’] = ‘< 上一页’; // 上一页突显  
$config[‘cur_tag_open’] = ‘ <a class=”current”>’; //
当前页开始样式  
$config[‘cur_tag_close’] = ‘</a>’;  
/*当前页甘休样式。那几个你可以团结尝试一下。
譬如说笔者想让当前页的分页数字样式美观一点,青色字体等。你就足以在current上添加css代码 
*/ 
$config[‘num_links’] = 2;//
当前连年内外展现页码个数。意思就是说您当前页是第6、页,那么你可以见见3、四,五,六,7页。  
$config[‘uri_segment’] = 4;  
/*这一个是你在用a)、b)链接样式的时候,用来判定页页数。
比如localhost/news/page/3 
这个uri_segment就要设定为3。localhost/news/title/page/3那个即将设定为4 
*/ 
$config[‘use_page_numbers’] = TRUE;  
/*以此就是a)、b)的反差了。开启了,page就会表示页数。false就会表示记录数
*/ 

复制代码 代码如下:

    $config[‘frist_link’] = ‘首页’;    //首页按钮

if($order_by)
{
$db->order_by($order_by);
}

刚开始在网上查资料的时候,有众多那种写法。

<style type=”text/css”>
body{font-family:Tahoma;}
.page{padding:2px;font-weight:bolder;font-size:12px;}
.page a{border:1px solid #ccc;padding:0 5px 0 5px;margin:2px;text-decoration:none;color:#333;}
.page span{padding:0 5px 0 5px;margin:2px;background:#09f;color:#fff;border:1px solid #09c;}
</style>

    $config[‘prev_link’] = ‘上一页’;

$data = $db->get($tablename)->result_array();

复制代码 代码如下:

    $config[‘next_link’] = ‘下一页’;

return array(‘total’ => $total, ‘data’ => $data);
}

$this->model->get_news($config[‘per_page’],$this->uri->segment(3)); 

    $config[‘last_link’] = ‘尾页’;

CI框架分页类使用体验

实则那种写法就是针对b)那种连接格局的。这里的$this->uri->segment(3)就是取到page/20中的记录数20。$config[‘per_page’]就是限量出口多少条。
有很大的局限性和误导性。作者起来就是死都不清楚干什么那样写。。后来才发现,手册才是最好的讲师。

    $this -> pagination ->
initialize($config)    //将配置好的音信传进参数举办最先化;

CI分页的url地址有多样办法
a) locahost/news/page/2 这些2表示第壹页
b) localhost/news/page/20
那个20意味着从第壹0条记下开始分页,即页面的第贰,条记下,是数据库中的第1、0条记下。
c) localhost/news?per_page=2 第二页
d) localhost/news?per_page=20 同b)

当大家把CI分页类的局地参数都安排好了将来,$this->pagination->initialize($config);//配置分页

    $offset = intval($this -> uri ->
sagment(3));    //获取偏移量limit,使用intval将字符转换为数值可以获拿到0,否则获取到三个空字符;

率先我们先看一下CI分页的参数:

复制代码 代码如下:

    $sql = “select * from 表名 limit
$offset,$page_size”;  //sql语句动态获取到偏移量以及历次得到到的数额条数;

复制代码 代码如下:

$page = $this->pagination->create_links(); 
//大家就取得了分页了 

    CI中的分页和其余的框架分裂,CI不提供一个limit参数,大家要求成立一个链接来博取urlinfo,limit数值就在分页类链接中;

$config[‘base_url’] = $url;
/* 分页的根基 U奥德赛L
一经您想用a、b的链接方式,则该url应该形式如/news/page/
如若链接是c、d的花样,则url应该如/news?
*/
$config[‘total_rows’] =
$total;//记录总数,那几个没什么好说的了,就是你从数据库取得记录总数
$config[‘per_page’] = $pagesize;
//每页条数。额,这一个也没怎么好说的。。自身设定。暗中认同为10近乎。
$config[‘page_query_string’] = TRUE;
/*传参格局。开启true则会自动在您的url前边加上&per_page=3。(这个per_page是暗中同意的查询字符,当然你也可以用$config[‘query_string_segment’]来自个儿设定)
由此c、d中的格局一般是为localhost/news?&per_page=2不过都一律,没什么影响。get的per_page还是3
*/
$config[‘first_link’] = ‘首页’; // 第1页突显
$config[‘last_link’] = ‘末页’; // 最后一页突显
$config[‘next_link’] = ‘下一页 >’; // 下一页突显
$config[‘prev_link’] = ‘< 上一页’; // 上一页突显
$config[‘cur_tag_open’] = ‘ <a class=”current”>’; //
当前页初步样式
$config[‘cur_tag_close’] = ‘</a>’;
/*当前页截至样式。那些你可以团结尝试一下。
譬如说我想让当前页的分页数字样式赏心悦目一点,酸性绿字体等。你就可以在current上添加css代码
*/
$config[‘num_links’] = 2;//
当前连接内外突显页码个数。意思就是说您当前页是第五,页,那么你可以看看三,肆,伍,六,7页。
$config[‘uri_segment’] = 4;
/*本条是你在用a)、b)链接样式的时候,用来判定页页数。
比如localhost/news/page/3
这个uri_segment就要设定为3。localhost/news/title/page/3那个将要设定为4
*/
$config[‘use_page_numbers’] = TRUE;
/*以此就是a)、b)的异样了。开启了,page就会意味着页数。false就会表示记录数
*/

一贯传送到视图页,即可。

    $data[‘links’] = $this -> pagination ->
creat_links();    //成立一个分页类链接(创建上一页下一页等按钮)并赋值,方便调用到view视图使用;

刚初叶在网上查资料的时候,有不少那种写法。

关于怎么加载模型,怎么存取数据记录,怎么传递变量到视图,那里就不说了,看手册好了。

    $this -> load ->
view(‘视图路径/视图文件名’,$data);    //加载视图并将数据传入;

复制代码 代码如下:

忘却说了,带查询参数的分页,笔者是如此做的。视图少将查询参数get提交到控制器的search方法。在search中,用$get
= $this->input->get();去拿到到查询参数。
然后加载model,用带查询参数和分页参数去读取记录,将结果突显到视图。。

  在view视图中平昔<? =$links ?>即可;

$this->model->get_news($config[‘per_page’],$this->uri->segment(3));

除此以外还发现个小bug,比如/news/page/-一千那样的时候,下边的分页链接将会现出负值
发现system/libraries/Pagination.php代码如下

实质上那种写法就是针对b)那种连接方式的。那里的$this->uri->segment(3)就是取到page/20中的记录数20。$config[‘per_page’]就是限量出口多少条。
有很大的局限性和误导性。作者起来就是死都不领悟为什么这样写。。后来才发现,手册才是最好的先生。

复制代码 代码如下:

当大家把CI分页类的片段参数都配置好了之后,$this->pagination->initialize($config);//配置分页

if ($this->use_page_numbers AND $this->cur_page == 0)  
{  
    $this->cur_page = $base_page;  
}  
//应为  
if ($this->use_page_numbers AND $this->cur_page <= 0)  
{  
    $this->cur_page = $base_page;  

复制代码 代码如下:

才对吗,经过改动后,那些标题从未了。

$page = $this->pagination->create_links(); //大家就赢得了分页了

您或然感兴趣的小说:

  • php完结仿写CodeIgniter的购物车类
  • Codeigniter购物车类无法添加普通话的消除办法
  • 据悉Codeigniter框架完结的student音讯种类站点动态发表成效详解
  • CodeIgniter接纳config控制的多语言落成基于浏览器语言自动转换职能
  • CI(CodeIgniter)框架中的增删改查操作
  • CodeIgniter启用缓存和排除缓存的艺术
  • CodeIgniter扶助函数helper详解
  • Codeigniter注册登录代码示例
  • Codeigniter完结拍卖用户登录验证后的UMuranoL跳转
  • 据悉CI(CodeIgniter)框架完结购物车作用的法门

直白传送到视图页,即可。

至于怎么加载模型,怎么存取数据记录,怎么传递变量到视图,那里就隐瞒了,看手册好了。

遗忘说了,带查询参数的分页,作者是那般做的。视图旅长查询参数get提交到控制器的search方法。在search中,用$get
= $this->input->get();去赢拿到查询参数。
然后加载model,用带查询参数和分页参数去读取记录,将结果显示到视图。。

别的还发现个小bug,比如/news/page/-一千那样的时候,下面的分页链接将会并发负值
察觉system/libraries/Pagination.php代码如下

复制代码 代码如下:

if ($this->use_page_numbers AND $this->cur_page == 0)
{
$this->cur_page = $base_page;
}
//应为
if ($this->use_page_numbers AND $this->cur_page <= 0)
{
$this->cur_page = $base_page;
}

才对啊,经过改动后,这几个难点没有了。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website