Codeigniter

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;
	}	

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

What can't be cured must be endured. (고칠 수 없는 것은 참아야 한다.)

댓글 ( 4)

댓글 남기기

작성

Codeigniter 목록    more