CI 묻고 답하기

제목 pagination 작업 하는데 페이지 이동이 안됩니다.
글쓴이 나잇황제 작성시각 2009/09/30 00:09:19
댓글 : 14 추천 : 0 스크랩 : 0 조회수 : 35636   RSS

게시판에 아이디를 부여해서 여러개의 게시판을 만들수 있는 게시판을 만들고 있습니다.

페이징 작업을 하는데, CI  내부에 있는  pagination  라이브러리를 가져다 쓰려고 합니다.

그리하여 페이징은 제대로 되는데, 1, 2, 3 페이지를 클릭할때마다 글이 새롭게 바뀌지 않습니다.

제가 만든 소스

controllers 소스입니다. 
라이브러리 로드는 생성자에서 다 했습니다.

 function lists1( $board_uid='1',$offset='' )
 {
  //$this->load->helper('url');
  //$offset = $this->uri->segment(3); 
 
  $board_uid = 1;
  $limit = 5;
   $total_list = $this -> board_model->get_board_total_list_count($board_uid); // 게시판 총 글 갯수
  $data['list']= $this->board_model->get_board_total_list($board_uid, $limit, $offset); // 게시판 글 정보 배열로 담아오기
  $config['base_url'] = base_url().'board/lists1/';
  $config['total_rows']=$total_list;
  $config['per_page'] = $limit;
  
  $this->pagination->initialize($config);
  
  $data['pag_links'] = $this->pagination->create_links();
  
//게시판 정보 불러오기//
  $board_config = $this->board_model->get_board_config($board_uid);
  $board_config_row = $board_config->row_array();
   
  if ( !$board_uid )
  {
   exit($this->lang->line('error_not_exist_category_value'));
  }
 
  $board_result = $this->board_model->get_board_list($board_uid);
  $boards_data['board_result'] = $board_result;

  $board_skin = $board_config_row['bd_skin']; //게시판 정보
   $data['board_uid'] = $board_uid; //게시판 정보
  $data['bd_config'] = $board_config_row; //게시판 정보
  $data['total_count'] = $total_list; //게시판 정보
  $data['board_title'] = $board_config_row['bd_title']; //게시판 정보
//게시판 정보 불러오기//
  $data['offset'] = $offset;


  $layout_data['body'] = $this->load->view('board/'.$board_skin.'/records', $data, true);
  $this->load->view('layout/layout.board', $layout_data);
}

또한 게시판 아이디를 동적으로 주게 되면
페이징은 되는데 페이지 누를때마다 잘못된 게시물을 보여주고 있습니다. 그래서 현재는 게시판 아이디를 고정시켰습니다.

게시판 URL을 확인하시면 문제를 좀더 빨리 확인하실 수 있을듯 합니다.
http://bluehist.chungbuk.ac.kr/board/lists/1/

조금만 도와주시면 감사하겠습니다. 그럼 수고하세요!!
긴내용 읽어주셔서 감사합니다.
 

 다음글 동일 도메인 내 서로 다른 포트의 웹서버 쿠키 및 세션... (4)
 이전글 php 출력 문의 사항~ (3)

댓글

변종원(웅파) / 2009/09/30 00:18:16 / 추천 0
print_r($data['list']);

해서 값이 바뀌는지 확인바랍니다.
말씀하신 주소 들어가보니 페이징은 처리가 되는데 $this->board_model->get_board_total_list($board_uid, $limit, $offset); 이 부분이 제대로 값이 처리가 안되는 것 같습니다.
ci세상 / 2009/09/30 01:05:19 / 추천 0
모델을 봐야 정확히 알수 있을것 같은데요 limit와 offset이 반대로 된듯 보입니다.

http://codeigniter-kr.org/user_guide/database/active_record.html
$query = $this->db->get('mytable', 10, 20);

// 생성결과: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
나잇황제 / 2009/09/30 01:08:10 / 추천 0
답변 주셔서 감사합니다.
웅파님 말씀대로 계속 같은 값이 출력되고 있는 듯 합니다.

 값을 불러오는 모델이 아래와 같습니다. 

 function get_board_total_list($board_uid, $limit, $offset)
 {
  $this->db->limit($limit, $offset);
  $this->db->where('bd_uid', $board_uid);
  $this->db->join('bd_contents', 'bd_list.lst_uid=bd_contents.lst_uid');
  $this->db->orderby('bd_list.lst_head_num');
  $result=$this->db->get('bd_list');
  return $result->result();
 
 }

CI세상님 LIMIT 와 OFFSET 순서는 맞는듯 한데.. 틀린겁니까?

변종원(웅파) / 2009/09/30 10:05:04 / 추천 0
echo $offset; 해보시면 옵셋값이 변하지않을 겁니다.

아래 라인 추가해주세요.

$config['uri_segment'] = 3;
$page=$offset = $this->uri->segment(3, 0); 
//페이지 이동에 따라 오프셋 값이 변화를 해야 그에 맞는 데이터를 가져옵니다.
ci세상 / 2009/09/30 11:22:53 / 추천 0
1.7.2 버젼이라면 아래 부분도 한번 시도해 보세요^^

system/database/DB_active_rec.php 1605줄

if (is_numeric($this->ar_limit) && is_numeric($this->ar_offset))
{
	$sql .= "\n";
	$sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset);
}

출처 : http://codeigniter.com/forums/viewthread/129405/
나잇황제 / 2009/09/30 12:27:53 / 추천 0
먼저 웅파님 ci세상님 이렇게 답변해주셔서 감사합니다.

제가 $offset 을 찍어본 결과 값은 잘 넘어오거든요. 페이징처리가 되어 게시물이 변경되기는 하나 5개씩가지 않고 하나씩 올라가네요. 사이트 보시면 확인이 가능할겁니다. 
 
이 방법도 해봤었는데 그런 오류가 나서 일단 uri->segment 를 주석처리했었거든요.

ci세상님 버전이 1.7.2가 아닌가 봅니다. 아마도 1.7.0이지 않을까...
그파일에 가서 1605번째 라인에 보았는데.. 다른 코딩이 있더군요.

아.. 안될 이유가 없는데.. 참 답답하네요.ㅠㅠ
변종원(웅파) / 2009/09/30 12:43:02 / 추천 0
지금 확인해보니 값이 제대로 바뀌네요.
어떤 처리하셨는 궁금.. ^^
나잇황제 / 2009/09/30 12:56:17 / 추천 0
바뀌나요?? 안바뀔텐데..
보면.. 값이 바뀌긴 하는데... 원래 5개씩 바뀌어야 되는게.. 지금 하나씩만 위로 올라가고 있는 형국입니다.
예를들어...
1페이지에 게시글 11, 10, 9, 8, 7 이렇게 있으면 2페이지에는 10, 9, 8, 7, 6 이런식으로 나오고 있습니다.

저도 왜그런지 도무지 이해가 안가네요... $offset은 제대로 넘어가는데...
나잇황제 / 2009/09/30 13:06:26 / 추천 0
웅파님... CI 말고 일반적으로 프로그램 할때 limt 20, 10 이면, 20번부터 10개를 가져오는거잖아요..
그렇게 해서... 20번을 구해주는 연산을 만들고요..
근데 CI는 $offset 만 넘겨주면 자동으로 값을 만들어 주는건가요??
board_model에 들어오는 값을 확인해보니, $limit =5, $offset은 0, 2, 3, 4 이런식으로 들어오고 있거든요..

그래서.. 2페이지에는 2번부터 5개,  3페이지에는 3번부터 5개, 이런식으로 값이 표현이 됩니다.
나잇황제 / 2009/09/30 13:20:52 / 추천 0
웅파님... 일단은 편법으로 해결은 했는데 이게 맞는지 모르겠네요...
아래와 같이 $offset 이 0일때는 1로 셋팅해주고, 아닐때는 저런식으로 계산을 해서 시작점을 맞춰주고 있습니다.

if( $offset == 0 )
  {
   $offset =1;
  }
  $offset = ($offset-1)*$limit;

이건 그냥 날코딩할때와 별반 다를게 없는것 같은데... 이게 맞는지 모르겠네요...
이렇게 하면 문제는 해결이 되긴 하는데...

변종원(웅파) / 2009/09/30 14:27:56 / 추천 0
CI 원본으로 작업하셨는지요?
CI 원본이라면 페이징주소가 lists/1/10, lists/1/20 이런식으로 변할텐데요?

그리고 맨뒷쪽의 페이지 부분은 pagination 프로그램에서 자동으로 만들어주는 부분입니다.

그리고 전에 $config['uri_segment'] 부분을 선언안하셨을때 이상하게 나오는 것은 디폴트값이 3으로
되어있어서 입니다. /board/lists/1/1 이면 항상 첫번째 1을 페이징변수로 생각해서 원하는 결과가 안나온 것입니다.

$config['uri_segment'] <- 페이징변수가 들어가는 세그먼트 번호를 넣어줘야합니다.
변종원(웅파) / 2009/09/30 14:28:45 / 추천 0
보통 기본적으로 사용하는 페이지네이션 셋입니다.

$config['base_url']=site_url('directory/prog/index/'.$gubun.'/'); //페이징처리 링크주소
$config['uri_segment'] = 5;
$data['perPage']=$config['per_page']='10'; //페이지당 리스트 노출갯수
$page=$offset = $this->uri->segment(5, 0);
$data['dir_info']=$this->dir_model->dir_list($gubun, $data['class1'], $data['class2'], $data['s_word'], $offset, $data['perPage']); //리스트 가져오기
$data['getTotalData']=$config['total_rows']=$this->dir_model->dir_cnt($gubun,$data['class1'], $data['class2'], $this->input->post('s_word'));
$config['page_query_string']=FALSE; // 두가지 주소체계를 동시에 사용할 경우 선언해줘야합니다.
$this->pagination->initialize($config);
$data['pagenav'] = $this->pagination->create_links();
$this->load->view('directory/main', $data);



ci세상 / 2009/10/01 09:00:25 / 추천 0
페이지네이션 번호체계가 틀린것을 보니 라이브러리를 변경하시거나 확장하신듯 보입니다.^^

matchbox 적용을 안하셨으면 application 폴더를 압축해서 올려주세요 수정해서 드리겠습니다.
나잇황제 / 2009/10/06 14:30:13 / 추천 0

ci님 너무 감사합니다. 제가 1.7.2 버전으로 다시 다 옮기고 있으니 거기서 해보고 안되면 부탁드리도록 하겠습니다.
1.7.1버전 사용했었는데 머 라이브러리를 수정하거나 그런거 없었는데...
그러네요*^^*