TIP게시판

제목 페이지네이션 라이브러리 입니다.
글쓴이 천재작곡가 작성시각 2016/12/30 15:36:43
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 1862   RSS

페이지네이션 라이브러리입니다.

페이지네이션 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:35:44 / 추천 0
감사합니다. ci 자체에 파라미터 처리해서 이렇게 제공하면 좋겠네요. ^^
한대승(불의회상) / 2017/01/02 15:29:06 / 추천 0
감사 합니다. ^^