class Board extends CI_Controller
public function lists()
{
//페이지네이션 라이브러리 로딩 추가
$this->load->library('pagination');
//페이지네이션 설정
$config['base_url']='/todo/board/lists/ci_board/page'; //페이징 주소
//1. 여기서는 카운터 수만 가져온다.
$config['total_rows']=$this->board_m->get_list($this->uri->segment(3), "count");
//게시물의 전체 개수
$config['per_page']=5; //한 페이지에 표시할 게시물 수
$config['uri_segment']=5; //페이지 번호가 위치한 세그먼트
//페이지네이션 초기화
$this->pagination->initialize($config);
//페이징 링크를 생성하여 view에서 사용할 변수에 할당
$data['pagination']=$this->pagination->create_links();
//게시물 목록을 불러오기 위한 offset, limit 값 가져오기
$page=$this->uri->segment(5, 1);
if($page>1)
{
$start=(($page/$config['per_page']))*$config['per_page'];
}
else
{
$start=($page-1)*$config['per_page'];
}
$limit=$config['per_page'];
//2.실질적인 페이징 처리
$data['list']=$this->board_m->get_list($this->uri->segment(3), '' , $start, $limit);
$this->load->view('board/list_v', $data);
}
컨트롤러에서 바뀐 부분은 lists() 메서드의 강조한 부분입니다. 뷰를 호출하는 라인을 빼고 나머지는 전부 바뀌었습니다.
1. pagination 을 이용하기 위해 라이브러리를 로딩합니다.
2. pagination라이브러리 설정 중에서 선언하지 않으면 에러가 날 수 잇는 설정입니다.
3. $config['base_url'] 은 create_links() 함수에서 페이지 이동 html 을 만들어 주는 데 사용할 주소입니다.
앞 절의 게시물 목록 주소를 입력합니다.
$config['uri_segment']가 주소와 연관이 잇어서 먼저 설명합니다. '/bbs/board/lists/ci_board' 의 실제 주소의
http://localhost/bbs/board/lists/ci_baord 이고 , $config['uri_segment'] 는 주소에서 페이지 번호가 위치하는 세그먼트를
가르킵니다. 소스에서 그 값이 '5' 이므로 다섯 번째 세그먼트를 페이지 변수로 사용하겠다라는 의미입니다.
다음 소스는 paginatiobn 라이브러리를 이용해 실제로 생성된 이동 링크입니다. 두 번째 링크를 보면 ci_baord 다음인 다섯 번째
세그먼트에 '5' 라는 값이 있고, 세 번째 링크에 10 이라는 값이 있습니다. 이와 값이 몇 번째 세그먼트를 페이지 변수로 사용하겠다라고
라이브러리에 알려주는 역할을 합니다. 이 설정이 없으면 몇 번째 세그먼트가 페이지 변수인지 알 수가 없어서 실행되지 않습니다.
<a href="/bbs/board/lists/ci_board">1</a>
<a href="/bbs/board/lists/ci_board/5">2</a>
<a href="/bbs/board/lists/ci_board/10">3</a>
$config['total_rows'] 는 전체 게시물의 수인데 이 값을 $config['per_page'] 의 한 페이지에 표시할 게시물 수로 나누면 전체 페이지 수가
나옵니다.
$config['total_rows'] =200; $config['per_page'] =5; //전체 페이지 수 = 총 게시물 수 / 한 페이지에 표시할 게시물 수 200 / 5 =40 |
// 페이지 처리
$config["base_url"] = '/board/test';
$config["prefix"] = 'P';
$config["total_rows"] = $this->board->total_rows();
$config["num_links"] = 10;
$config["per_page"] = 20;
$config["first_link"] = '‹ 처음';
$config["next_link"] = '다음 ›';
$config["prev_link"] = '‹ 이전';
$config["last_link"] = '마지막 ›';
[PHP/Codeigniter] 페이징처리
4. 원하는 설정 값을 선언하고 pagination 라이브러리를 초기화합니다.
5. 초기화 후에 이동 링크를 생성하여 뷰에 전달하기 위해 $data 변수에 담습니다. 여기까지는 뷰에서 이동 링크를 표시하기
위한 순서입니다.( 그림 4-2 의 테이블 하단 '1 2 3' >참고 ).
6. $data['list'] 라인까지는 페이지와 연동되는 게시물을 가져오기 위한 작업입니다.
6번 은 주소에서 다섯 번째 세그먼트 값을 가져오는 함수인데 앞 절에서 사용하던 것과 다르게 두 번째 파라미터가 추가되었습니다.
두 번째 파라미터 값을 선언할 경우 세그먼트 5에 해당하는 값이 없을 경우 자동으로 두 번째 파라미터를 반환합니다.
다음 소스를 보면 이해하기 쉽습니다.
// 주소가 http://localhost/bbs/board/lists/ci_board 일 경우
//다섯 번째 세그먼트 값이 없기 때문에 $page 변수에 1이 담깁니다.
//다르게 표현하면 if($this->uri->segment(5) { $page=$this->uri->segment(5); } else { $page=1; } |
일반적으로 주소를 사용할 때 사용자가 http://localhost/bbs/board/lists/ci_board/page/1 이라고 page 까지 입력하고 접속하는
경우는 드뭅니다. page 변수가 생략된 경우에도 프로그램이 정상적으로 작동하게 하려고 page 변수를 1로 자동 설정하는 루틴입니다.
첫 번째 방식이 간결하므로 변수를 초기활할 필요가 있을 때 사용하기 바랍니다.
class Board_m extends CI_Model
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
공통 게시판 모델
*/
class Board_m extends CI_Model
{
function __construct()
{
parent::__construct();
}
function get_list($table, $type='', $offset='',$limit='')
{
$table='ci_board';
$limit_query ='';
//널일 경우 처리
if(is_null($type))$type='';
if(is_null($offset)) $offset='';
if(is_null($limit)) $limit='';
if($limit !='' OR $offset !='')
{
//페이징이 있을 경우의 처리
$limit_query=' LIMIT '. $offset .', '. $limit ;
}
$sql ="select * from $table order by board_id desc ".$limit_query ;
//$sql="SELECT * FROM $table order by board_id desc ";
$query =$this->db->query($sql);
if($type =='count')
{
//리스트를 반환하는 것이 아니라 전체 게시물의 개수를 반환
$result =$query->num_rows();
//$this->db->count_all($table);
}
else
{
//게시물 리스트 반환
$result=$query->result();
}
return $result;
}
}
list_v.php
<th colspan="5"><?php echo $pagination;?></th>
macaronics.net 샘플 코드
More_list.php
function lists(){
//검색어 초기화
$search_word =$page_url ='';
$uri_segment=6;
$subject=$this->uri->segment(4);
//주소 중에서 q(검색어) 세그먼트가 있는지 검사하기 위해 주소를 배열로 변환
$uri_array =segment_explode($this->uri->uri_string());
if(in_array('s', $uri_array)){
//주소에 검색어가 있을 경우의 처리. 즉 검색 시
$search_word =urldecode(url_explode($uri_array, 's'));
//페이지네이션용 주소
$page_url ='/s/'.$search_word;
$uri_segment =7;
}
//페이지네이션 라이브러리 로딩 추가
$this->load->library('pagination');
//페이지네이션 설정
$config['base_url'] = '/user/more_list/lists/'.$subject.'/'.$page_url.'/page/'; //페이징 주소
$config['total_rows'] = $this->more_list_m->get_list($subject, 'count', '', '', $search_word); //게시물의 전체 갯수
$config['per_page'] = 10; //한 페이지에 표시할 게시물 수
$config['uri_segment'] = $uri_segment; //페이지 번호가 위치한 세그먼트
//페이지 번호
$config['num_links']=5;
//페이지 전체
$config['full_tag_open']='<ul class="pagination">';
$config['full_tag_close']='</ul>';
//처음
$config['first_tag_open']='<li>';
$config['first_tag_close']='</li>';
//마지막
$config['last_tag_open']='<li>';
$config['last_tag_close']='</li>';
//현재
$config['cur_tag_open']='<li class="active"><a href="#">';
$config['cur_tag_close']='<span class="sr-only">(current)</span></a></li>';
//숫자
$config['num_tag_open']='<li>';
$config['num_tag_close']='</li>';
//다음
$config['next_tag_open']='<li>';
$config['next_tag_close']='</li>';
//이전
$config['prev_tag_open']='<li>';
$config['prev_tag_close']='</li>';
//페이지네이션 초기화
$this->pagination->initialize($config);
//페이징 링크를 생성하여 view에서 사용할 변수에 할당
$data['pagination'] = $this->pagination->create_links();
//게시판 목록을 불러오기 위한 offset, limit 값 가져오기
$data['page'] = $page = $this->uri->segment($uri_segment, 1);
if ( $page > 1 )
{
$start = (($page/$config['per_page'])) * $config['per_page'];
}
else
{
$start = ($page-1) * $config['per_page'];
}
$limit = $config['per_page'];
$data['total']=$config['total_rows'];
$data['start']=$start;
//$data['error']=$i;
$data['list']= $this->more_list_m->get_list($subject, '', $start, $limit, $search_word );
$this->load->view('user/more_list_v.php',$data);
}
More_list_m.php
function get_list($subject='', $type='', $offset='', $limit='', $search_word='')
{
$sword='';
if($search_word !='')
{
//검색어가 있을 경우의 처리
$sword = ' where subject like "%'.$search_word.'%" or contents like "%'.$search_word.'%"
or user_nickname like "%'.$search_word.'%" or board_subject like "%'.$search_word.'%" or user_nickname like "%'.$search_word.'%" ' ;
}
$limit_query = '';
if ( $limit != '' OR $offset != '' )
{
//페이징이 있을 경우의 처리
$limit_query = ' LIMIT '.$offset.', '.$limit;
}
$sql = "SELECT * FROM ci_board where board_subject ='".$subject."' ".$sword." ORDER BY reg_date DESC".$limit_query;
$query = $this->db->query($sql);
if ( $type == 'count' )
{
//리스트를 반환하는 것이 아니라 전체 게시물의 갯수를 반환
$result = $query->num_rows();
//$this->db->count_all($table);
}
else
{
//게시물 리스트 반환
$result = $query->result();
}
return $result;
}
댓글 ( 4)
댓글 남기기