본문 바로가기

웹 응용/codeigniter

코드이그나이터 페이징

실제로 사내 erp 시스템 개발중에 사용한 건데, 

보안상으로 DB관련된 내용들만 빼고 적어보려고 합니다. 

 

페이징을 2페이지(all.php/each.php) 에 해야했기 때문에 중복된 내용이 많았습니다. 

그래서 컨트롤러 -> 라이브러리 -> 컨트롤러 -> 뷰 형태로 했습니다. 

 

컨트롤러에 적게 되면 줄이 너무 길어서, 차라리 공통된 내용들은 라이브러리에 묶었습니다. 

 

컨트롤러 

public function all() {
  // $page 변수
  if(!$_GET) {
  	$getpage = '1'; // 현재 페이지 (값이 없으면)
  } else {
  	$getpage = $_GET['page']; // 주소창에 GET으로 받은게 있으면
  }

  // 배열 정리
  $type = array();

  $row = '15'; // 한 페이지에 나오게 할 갯수
  $block = '5'; // 페이지당 블록

  // 테스트 아이디 전체조회
  $total =  $this->DB이름->DB스키마('DB', 'DB', 'DB');

  // 페이징 라이브러리 호출
  $pageing = $this->paging->procee($row, $block, $getpage, $total);

  // 테스트
  $nomal = $this->DB이름->DB스키마('DB', 'DB', 'DB', $pageing['0']['pageSet'], $pageing['0']['limitIdx']);


  // 유형 확인
  $this->load->view('sidemenu');
  $this->load->view('/페이지폴더/all', ['nomal' => $nomal, 'pageing' => $pageing] );
}

 라이브러리 

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class paging {
    function procee($row, $block, $getpage, $TotaltestId) {

  $countTestId = count($TotaltestId); // 총 갯수 확인

  if(!$_GET) {
  	$page = '1'; // 현재 페이지 (값이 없으면)
  } else {
  	$page = $getpage; // 주소창에 GET으로 받은게 있으면
  }

  $pageSet = $row; // 한 페이지에 보여지는 줄 수
  $rowBlock = $block; // 상단 보이는 페이지 갯수 (1번에 5개씩 보이게)

  $totalPage = ceil($countTestId/$pageSet); // 보일 총 페이지 (상단 표시)
  $totalBlock = ceil($totalPage/$rowBlock); // 보일 블럭 갯수
  $nowBlock = ceil($page/$rowBlock); // 현재 블럭

  $startPage = ($nowBlock*$rowBlock)-3; // 시작 페이지

  // 마지막 페이지 세기
  if($startPage<=1) {
  	$startPage = '1';
  }

  // 마지막 페이지
  $lastPage = min($totalPage,$nowBlock*$rowBlock);


  // 마지막 페이지와 총 페이지 번호가 동일 할 시
  if($totalPage<=$lastPage) {
  	$lastPage = $totalPage;
  }

  $limitIdx = ($page - 1)*$pageSet; // 처음에 시작하는 페이지 갯수

  $prevPage = $page - 1; // 이전페이지
  $nextPage = $page + 1; // 다음페이지

  $prevBlock = $rowBlock - 1; // 이전 페이지
  $nextBlock = $rowBlock + 1; // 현재 페이지

  if($nextPage>=$totalPage) {
  	$nextPage = $totalPage;
  }

  $pageing = array();

  array_push($pageing, array(
    'page' => $page,
    'startPage' => $startPage,
    'lastPage' => $lastPage,
    'nextPage' => $nextPage,
    'prevPage' => $prevPage,
    'pageSet' => $pageSet,
    'limitIdx' => $limitIdx,
    'totalPage' => $totalPage
  ));

  return $pageing;
  }
}
?>

뷰 (페이징 부분만) 

    <!--페이징 목록 나오는 부분-->
    <? if($pageing['0']['prevPage'] > 0) : ?>
        <!--페이징 목록 나오는 부분(이전 / 현재 페이지 / 다음 페이지)-->
        <a href="./페이지이름?page=<?=$pageing['0']['prevPage']?>" class="클래스이름">[이전]</a>
    <? else : ?>
        [이전]
    <? endif; ?>

    <a href="./페이지이름?page=1" class="클래스이름">1</a> ...
    <? for ($i=-2; $i<3; $i++) :
        if(!$_GET) :

        elseif ($pageing['0']['page'] + $i == $_GET['page'] || !isset($_GET)) : ?>
            <!--선택한 페이지 번호 = 현재 페이지 번호이면 글씨 초록색 및 bold 처리-->
            <a href="./all?page=<?=$pageing['0']['page'] + $i;?>" class="클래스이름"><?=$pageing['0']['page'] + $i;?></a>
        <? else : ?>
            <!--선택한 페이지 번호 != 현재 페이지 번호-->
            <? if($pageing['0']['page'] + $i <= '0' || $pageing['0']['page'] + $i > $pageing['0']['totalPage']) : ?>
            <? else : ?>
                <a  href="./all?page=<?=$pageing['0']['page'] + $i;?>" class="클래스이름"><?=$pageing['0']['page'] + $i;?></a>
            <? endif; ?>
        <? endif;
    endfor;?>
    ... <a href="./all?page=<?=$pageing['0']['totalPage']?>" class="클래스이름"><?=$pageing['0']['totalPage']?></a>

    <!--다음페이지-->
    <? if($pageing['0']['nextPage'] != $pageing['0']['page']) : ?>
        <!--페이징 목록 나오는 부분(다음페이지)-->
        <a href="./all?page=<?=$pageing['0']['nextPage']?>" class="클래스이름">[다음]</a>
    <? else : ?>
        [다음]
    <? endif; ?>

모델 

public function DB이름($dbname, $need, $order, $limit1, $limit2) {
  $this->db->select('*');
  $this->db->from($dbname); 
  $this->db->order_by($need, $order);
  $this->db->limit($limit1, $limit2);

  $query = $this->db->get()->result_array();

  return $query;
}

 

이렇게 작업해서 생겨난 것이 

 

페이징 번호, 페이징 내용까지 정리 

전 제 컴퓨터로 확인했을 때 15줄로 해야 위아래 여백이 조금 생겨서 컨트롤러에서 $row=15 로 조절했습니다. 

혹시나 더 많이 보였으면 하는 분들은 컨트롤러에서 $row = 20 이런식으로 바꾸시면 줄수가 바뀌게 됩니다.