| 제목 | 페이지네이션 라이브러리 입니다. | ||
|---|---|---|---|
| 글쓴이 | 천재작곡가 | 작성시각 | 2016/12/30 15:06:43 |
|
|
|||
|
페이지네이션 라이브러리입니다. 페이지네이션 stirng 형식이 아닌 배열 형태로 반환합니다.
뷰단에서 javascript로 사용할때 퍼블리셔분이 자유자재로 사용하게 하기위해서 만들었습니다 혹시나 쓰실분있나해서 공유합니다.
application/libraries/Paging.php
<?php
class Paging {
protected $CI;
protected $page = 1; // 현재 페이지
protected $base_url = ""; // 기본 URL
protected $page_rows = 10; // 한번에 표시할 목록 수
protected $total_rows = 0; // 총 행수
protected $fixed_num = 10; // 한번에 표시할 페이지 수
protected $add_param = array(); // 추가 패러미터 (배열형식)
protected $page_variable = "page"; // 페이지 패러미터 이름
const PAGE_TYPE_FIRST = "FIRST";
const PAGE_TYPE_PREV = "PREV";
const PAGE_TYPE_NUMBER = "NUMS";
const PAGE_TYPE_NEXT = "NEXT";
const PAGE_TYPE_LAST = "LAST";
/**
* 생성자
* Paging constructor.
* @param array $param
*/
function __construct($param = array())
{
$this->CI =& get_instance();
$this->initialize($param);
}
/**
* 변수 설정
* @param array $params
* @return $this
*/
public function initialize(array $params = array())
{
foreach ($params as $key => $val)
{
if (property_exists($this, $key))
{
$this->$key = $val;
}
}
return $this;
}
public function create()
{
$return = array();
// 만약 총 Rows가 0이거나, 한줄당 표시가 0 인경우는 return 한다.
if ($this->total_rows == 0 OR $this->page_rows == 0) return array();
// 총 몇페이지가 나올지 계산한다
$num_pages = (int) ceil($this->total_rows / $this->page_rows);
// 한번에 표시할 페이지수를 체크한다.
$this->fixed_num = (int) $this->fixed_num;
if ($this->fixed_num < 0) return array();
// 앞부분링크 URL을 만든다.
$this->base_url = trim($this->base_url);
// 만약 현재 페이지가 전체 페이지보다 많다면 현재페이지는 전체페이지로 바꾼다.
$this->page = ($this->page > $num_pages) ? $num_pages : $this->page;
// 현재 페이지가 1보다 작으면 1로 바꾼다.
$this->page = (int)$this->page < 1 ? 1 : $this->page;
// add_param 중 page 키값이 들어잇을경우 삭제한다.
if( isset($this->add_param[$this->page_variable]) ) unset($this->add_param[$this->page_variable]);
// 시작과 종료 페이지 번호를 얻어온다.
$start = (ceil($this->page / $this->fixed_num) - 1) * $this->fixed_num + 1 + 1;
$end = (ceil($this->page / $this->fixed_num) == ceil($num_pages / $this->fixed_num)) ? $num_pages : ceil($this->page / $this->fixed_num) * $this->fixed_num;
$this->add_param = (is_array($this->add_param) && count($this->add_param) > 0) ? array_merge(array( $this->page_variable=>1), $this->add_param) : array();
// 첫페이지를 만든다.
$this->add_param[$this->page_variable] = 1;
$return[] = array(
"type" => self::PAGE_TYPE_FIRST,
"enabled" => ($this->page > 1),
"page" => 1,
"link" => $this->base_url . "?" . http_build_query($this->add_param)
);
// 이전페이지를 만든다.
$prev = ($this->page == 1 ) ? 1 : $this->page - 1;
$this->add_param[$this->page_variable] = $prev;
$return[] = array(
"type" => self::PAGE_TYPE_PREV,
"enabled" => ($this->page > 1),
"page" => $prev,
"link" => $this->base_url . "?" . http_build_query($this->add_param)
);
// 각 페이지를 만든다.
for($loop = $start -1; $loop <= $end; $loop++ )
{
$this->add_param[$this->page_variable] = $loop;
$return[] = array(
"type" => self::PAGE_TYPE_NUMBER,
"enabled" => ($this->page != $loop),
"page" => $loop,
"link" => $this->base_url . "?" . http_build_query($this->add_param)
);
}
// 다음 페이지를 만든다.
$next = ($this->page == $num_pages) ? $num_pages : $this->page + 1;
$this->add_param[$this->page_variable] = $next;
$return[] = array(
"type" => self::PAGE_TYPE_NEXT,
"enabled" => ($this->page != $num_pages),
"page" => $next,
"link" => $this->base_url . "?" . http_build_query($this->add_param)
);
// 마지막 페이지를 만든다.
$this->add_param[$this->page_variable] = $num_pages;
$return[] = array(
"type" => self::PAGE_TYPE_LAST,
"enabled" => ($this->page != $num_pages),
"page" => $num_pages,
"link" => $this->base_url . "?" . http_build_query($this->add_param)
);
return $return;
}
}
실제 사용
$paging = array(
"page" => $this->input->get('page', TRUE), // 현재 페이지
"page_rows" => 10, // 한페이지에 표시할 행수
"total_rows" => $total_rows, // 총 행수
"fixed_num" => 5, // 한번에 표시할 페이지
"base_url" => current_url(), // 표시할 페이지 URL
"add_param" => $this->input->get() // 추가패러미터 배열
);
$this->load->library('paging', $paging);
$pagination = $this->paging->create();
반환된 결과 array( array( "type" : 타입입니다. ( FIRST, PREV, NUMS, NEXT, LAST ) 로 반환 "enabled" TRUE or FALSE 로 반환 ( NUMS가 아닌 타입중 사용되지 않는 경우는 FALSE를 리턴합니다. ) "current" : NUMS 타입에서 현재페이지의 경우 TRUE를 반환합니다. "page" 해당되는 페이지입니다. "link" base_url 과 add_param 을 기반으로 생성한 링크입니다. ), array( ), ..... )
반환 예시
Array
(
[0] => Array
(
[type] => FIRST
[enabled] => 1
[current] =>
[page] => 1
[link] => http://127.0.0.1/admin/members/lists?page=1
)
[1] => Array
(
[type] => PREV
[enabled] => 1
[current] =>
[page] => 8
[link] => http://127.0.0.1/admin/members/lists?page=8
)
[2] => Array
(
[type] => NUMS
[enabled] => 1
[current] =>
[page] => 6
[link] => http://127.0.0.1/admin/members/lists?page=6
)
[3] => Array
(
[type] => NUMS
[enabled] => 1
[current] =>
[page] => 7
[link] => http://127.0.0.1/admin/members/lists?page=7
)
[4] => Array
(
[type] => NUMS
[enabled] => 1
[current] =>
[page] => 8
[link] => http://127.0.0.1/admin/members/lists?page=8
)
[5] => Array
(
[type] => NUMS
[enabled] => 1
[current] => 1
[page] => 9
[link] => http://127.0.0.1/admin/members/lists?page=9
)
[6] => Array
(
[type] => NUMS
[enabled] => 1
[current] =>
[page] => 10
[link] => http://127.0.0.1/admin/members/lists?page=10
)
[7] => Array
(
[type] => NEXT
[enabled] => 1
[current] =>
[page] => 10
[link] => http://127.0.0.1/admin/members/lists?page=10
)
[8] => Array
(
[type] => LAST
[enabled] => 1
[current] =>
[page] => 15
[link] => http://127.0.0.1/admin/members/lists?page=15
)
)
실제 VIEW 적용
<ul class="pagination">
<?php foreach($pagination as $paging) : ?>
<li class="<?=$paging['enabled']?'':'disabled'?> <?=$paging['current']?'active':''?>">
<a href="<?=$paging['enabled'] && !$paging['current']?$paging['link']:'#'?>" <?=!$paging['enabled']?'onclick="return false;"':''?>>
<?php
if($paging['type'] == 'NUMS') echo $paging['page'];
else if ($paging['type'] == 'FIRST' ) echo "처음";
else if ($paging['type'] == 'PREV') echo '이전';
else if ($paging['type'] == 'NEXT' ) echo '다음';
else if ($paging['type'] == 'LAST') echo '마지막';
?>
</a>
</li>
<?php endforeach;?>
</ul>
|
|||
| 다음글 | 2.2.1 force_download helper 오류... (3) | ||
| 이전글 | Codeigniter 3와 Sentry 연동 쉽게하기 (7) | ||
|
변종원(웅파)
/
2017/01/02 14:05:44 /
추천
0
감사합니다. ci 자체에 파라미터 처리해서 이렇게 제공하면 좋겠네요. ^^
|
|
한대승(불의회상)
/
2017/01/02 14:59:06 /
추천
0
감사 합니다. ^^
|