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

[库 Library] 友好的codeigniter框架分页类

[复制链接]
发表于 2011-1-18 08:04:45 | 显示全部楼层 |阅读模式
本帖最后由 haohailuo 于 2012-1-5 22:16 编辑

原文地址:http://www.it300.com/article-278.html,更多精彩代码尽在浩海代码网

      有些时候,你可能需要把数据库查询所得到的一篇文章或一组结果拆分成多页。在这时,你将需要写某种分页脚本。这对于从没有做过这个的开发者来说还是有一点难度的,但使用 CodeIgniter 却是轻而易举就能完成的。

  CodeIgniter 具有非常容易使用的分页类。在本教程中我会做一个从数据库返回一组结果并分页这些结果的简单例子。我将使用最新版本的 CI。分页类并没有修改(至少我认为没有),用最新的稳定版框架总是好的。现在,让我们开始吧。CodeIgniter默认的分页类形式并不怎么友好,要实现类似http://domain.com/forums/forum-4-2.html或者http://domain.com/forums/forum_4_2.html这种形式,就显得力不从心了,所以我对原有的分页类做了个扩展,源码如下:

PHP复制代码
<?php if (! defined('BASEPATH')) exit('Access Denied!');
/**
 * FILE_NAME : Hpages.php
 * 浩海网络 前台 分页类
 *
 * @package  haohailuo
 * @author  By Laurence.xu <haohailuo@163.com>
 * @copyright Copyright (c) 2010, Haohailuo, Inc.
 * @link  http://www.haohailuo.com
 * @since  Version 1.0 $Id$
 * @version  Wed Dec 08 12:21:17 CST 2010
 * @filesource
*/

class Hpages {
 
 var $base_url   = ''; //基本链接地址
 var $total_rows    = ''; //数据总数
 var $per_page    = 10; //每页条数
 var $num_links   =  2; //要显示的左右链接的个数
 var $cur_page    =  1; //当前页数
 var $first_link     = '‹ First'; //首页字符
 var $next_link   = '>';   //下一页的字符
 var $prev_link   = '<';   //上一页的字符
 var $last_link   = 'Last ›'; //末页的字符
 var $uri_segment  = 3;  //分页数所在的uri片段位置
 var $full_tag_open  = '';  //分页区域开始的html标签
 var $full_tag_close  = '';  //分页区域结束的后html标签
 var $first_tag_open  = '';  //首页开始的html标签
 var $first_tag_close = ' '; //首页结束的html标签
 var $last_tag_open  = ' '; //末页开始的html标签
 var $last_tag_close  = '';  //末页结束的html标签
 var $cur_tag_open  = ' <b>';//当前页开始的...
 var $cur_tag_close  = '</b>'; //当前页结束的...
 var $next_tag_open  = ' '; //下一页开始的.....
 var $next_tag_close  = ' '; //下一页结束的.....
 var $prev_tag_open  = ' '; //上一页开始的.....
 var $prev_tag_close  = '';  //上一页结束的.....
 var $num_tag_open  = ' '; //“数字”链接的打开标签。
 var $num_tag_close  = '';  //“数字”链接的结束标签。
 var $page_query_string = FALSE;
 var $query_string_segment = 'per_page';
 
 var $page_mode   = 'default'; //default for add page at the end? if include {page}, will replace it for current page.
 var $underline_uri_seg = -1;   //存在下划线时,页码所在数组下标位置
 var $custom_cur_page = 0;   //自定义当前页码,存在此值是,系统将不自动判断当前页数,默认不启用
 
 function __construct() {
  $this->Hpages();
 }
 /**
  * Constructor
  *
  * @access public
  */

 function Hpages() {
  if (file_exists(APPPATH.'config/pagination.php')) {
   require_once(APPPATH.'config/pagination.php');
   
   foreach ($config as $key=>$val) {
    $this->{$key} = $val;
   }
  }
 
  log_message('debug', "Hpages Class Initialized");
 }
 
 /**
  * 初始化参数
  *
  * @see  init()
  * @author Laurence.xu <haohailuo@163.com>
  * @version Wed Dec 08 12:26:07 CST 2010
  * @param <array> $params 待初始化的参数
 */

 function init($params = array()) {
  if (count($params) > 0) {
   foreach ($params as $key => $val) {
    if (isset($this->$key)) {
     $this->$key = $val;
    }
   }  
  }
 }
 
 /**
  * 创建分页链接
  *
  * @see  create_links()
  * @author Laurence.xu <haohailuo@163.com>
  * @version Wed Dec 08 15:02:27 CST 2010
  * @param <boolean> $show_info 是否显示总条数等信息
  * @return <string> $output
 */

 function create_links($show_info = false, $top_info = false) {
  //如果没有记录或者每页条数为0,则返回空
  if ($this->total_rows == 0 || $this->per_page == 0) {
   return '';
  }
 
  //计算总页数
  $num_pages = ceil($this->total_rows / $this->per_page);
 
  //只有一页,返回空
  if ($num_pages == 1 && !$show_info) {
   return '';
  }
 
  $CI =& get_instance();
 
  //获取当前页编号
  if ($CI->config->item('enable_query_strings') === TRUE || $this->page_query_string === TRUE) {
   if ($CI->input->get($this->query_string_segment) != 0) {
    $this->cur_page = $CI->input->get($this->query_string_segment);
 
    // Prep the current page - no funny business!
    $this->cur_page = (int) $this->cur_page;
   }
  } else {
   if (intval($this->custom_cur_page) > 0) {
    $this->cur_page = (int) $this->custom_cur_page;
   }else{
    $uri_segment = $CI->uri->segment($this->uri_segment, 0);
    if ( !empty($uri_segment) ) {
     $this->cur_page = $uri_segment;
     //如果有下划线
     if ($this->underline_uri_seg >= 0) {
      if (strpos($this->cur_page, '-') !== false) {
       $arr = explode('-', $this->cur_page);
      }else {
       $arr = explode('_', $this->cur_page);
      }
      $this->cur_page = $arr[$this->underline_uri_seg];
      unset($arr);
     }
     // Prep the current page - no funny business!
     $this->cur_page = (int) $this->cur_page;
    }
   }
  }
  //echo $this->cur_page;exit;
  //左右显示的页码个数
  $this->num_links = (int)$this->num_links;
 
  if ($this->num_links < 1) {
   show_error('Your number of links must be a positive number.');
  }
 
  if ( ! is_numeric($this->cur_page) || $this->cur_page < 1) {
   $this->cur_page = 1;
  }
 
  //如果当前页数大于总页数,则赋值给当前页数最大值
  if ($this->cur_page > $num_pages) {
   $this->cur_page = $num_pages;
  }
 
  $uri_page_number = $this->cur_page;
 
  if ($CI->config->item('enable_query_strings') === TRUE || $this->page_query_string === TRUE) {
   $this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'=';
  } else {
   $this->base_url = rtrim($this->base_url, '/') .'/';
  }
 
  if (strpos($this->base_url, "{page}") !== false) {
   $this->page_mode = 'replace';
  }
 
  $output = $top_output = '';
  //数据总量信息
  if ($show_info) {
   $output = " 共<b>".$this->total_rows ."</b>条记录 <span style='color:#ff0000;font-weight:bold'>{$this->cur_page}</span>/<b>".$num_pages."</b>页 每页<b>{$this->per_page}</b>条 ";
  }
  //数据信息,显示在上面,以供提醒
  if ($top_info) {
   $top_output = " 共 <b>".$this->total_rows ."</b> 条记录 第<span style='color:#ff0000;font-weight:bold'>{$this->cur_page}</span>页/共<b>".$num_pages."</b>页 ";
  }
  //判断是否要显示首页
  if  ($this->cur_page > $this->num_links+1) {
   $output .= $this->first_tag_open.'<a href="'.$this->makelink().'">'.$this->first_link.'</a>'.$this->first_tag_close;
  }
 
  //显示上一页
  if  ($this->cur_page != 1) {
   $j = $this->cur_page - 1;
   if ($j == 0) $j = '';
   $output .= $this->prev_tag_open.'<a href="'.$this->makelink($j).'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
  }
 
  //显示中间页
  for ($i=1; $i <= $num_pages; $i++){
   if ($i < $this->cur_page-$this->num_links || $i > $this->cur_page+$this->num_links) {
    continue;
   }
   
   //显示中间页数
   if($this->cur_page == $i){
    $output .= $this->cur_tag_open.$i.$this->cur_tag_close; //当前页
   }else {
    $output .= $this->num_tag_open.'<a href="'.$this->makelink($i).'">'.$i.'</a>'.$this->num_tag_close;
   }
  }
 
  //显示下一页
  if  ($this->cur_page < $num_pages) {
   $k = $this->cur_page + 1;
   $output .= $this->next_tag_open.'<a href="'.$this->makelink($k).'">'.$this->next_link.'</a>'.$this->next_tag_close;
  }
 
  //显示尾页
  if (($this->cur_page + $this->num_links) < $num_pages) {
   $output .= $this->last_tag_open.'<a href="'.$this->makelink($num_pages).'">'.$this->last_link.'</a>'.$this->last_tag_close;
  }
 
  $output = preg_replace("#([^:])//+#", "\\1/", $output);
 
  // Add the wrapper HTML if exists
  $output = $this->full_tag_open.$output.$this->full_tag_close;
 
  if ($top_info) {
   return array($output, $top_output);
  }else {
   return $output;
  }
 }
 
 /**
  * 创建链接url地址
  *
  * @param <string> $str
  * @return <string>
  */

 function makelink($str = '') {
  if($this->page_mode == 'default') {
   return $this->_forsearch($this->base_url.$str);
  } else {
   $url = $this->base_url;
   if ($str == 1) {
    $url = str_replace('/{page}', '', $this->base_url);
   }
   $url = str_replace("{page}", $str, $url);
   
   return $this->_forsearch($url);
  }
 }
 
 /**
  * 处理url地址
  *
  * @see  _forsearch()
  * @author Laurence.xu <haohailuo@163.com>
  * @version Wed Dec 08 14:33:58 CST 2010
  * @param <string> $string pInfo
  * @return <string>
 */

 function _forsearch($string) {
  $length = strlen($string) - 1;
  if($string{$length} == '/') {
   $string = rtrim($string, '/');
  }
 
  return site_url($string);
  return $string;
 }
}
 
// END Pagination Class
 
/* End of file Hpages.php */
/* Location: ./system/libraries/Hpages.php */
复制代码


展示地址:http://www.it300.com/cphp.html具体使用方法:
PHP复制代码
//创建分页
   $config = array();
   $this->load->library('hpages');
   $config['base_url'] = "channel/lists/c{$slug}/{page}";
   $config['total_rows'] = intval($total);
   $config['per_page'] = $pagesize;
   $config['uri_segment'] = 1;
   $config['num_links'] = 3;
   $config['underline_uri_seg'] = 1; //下划线uri中页数所在的位置
   $this->hpages->init($config);
   $this->template['lists'] = $list;
   $this->template['pagestr'] = $this->hpages->create_links(1);
 
复制代码

效果图如下:
20110117234233_53060.jpg
发表于 2011-1-18 11:15:38 | 显示全部楼层
抢沙发
发表于 2011-1-22 22:08:57 | 显示全部楼层
不错,希望代码格式可以整理一下.
发表于 2011-5-8 11:43:34 | 显示全部楼层
你这是神马意思。
发表于 2011-5-10 09:27:26 | 显示全部楼层
下载试用..谢谢
发表于 2011-5-10 13:41:41 | 显示全部楼层
正需要这方面的东西。。。
发表于 2011-5-10 14:01:19 | 显示全部楼层
可以再加上一个下拉列表
发表于 2012-3-18 22:30:09 | 显示全部楼层
请问有CI有木有pdf  或者别的格式的能够下载的  手册呢?
怎么我找了好久都没找到!
顶帖子,很好。打算试用,刚接触CI请指教!

本版积分规则