페이징 함수

인터넷관련 2008. 2. 16. 12:54

/**
 * 페이징 함수
 *
 * @author Woo,Yeon-geun <cjdma@cjdma.com>
 *
 * @param int $total;
 * @param int $now;
 * @param int $page;
 * @param int $scale;
 * @param int $block_scale;
 *
 * @return int  $prev  이전 페이지
 * @return int  $page  현재 페이지
 * @return int  $next  다음페이지
 * @return int  $first 시작할 때의 글번호
 * @return array $range 출력하려는 페이지들
 */
function OBS_pubPaging($param)
{
    $total      = $param['total'];
    $now        = $param['now'];
    // 현재페이지 (없으면 1)
    $page        = $param['page']        ? $param['page']        :  1;
    // 한 페이지에 출력하는 row수
    $scale      = $param['scale']      ? $param['scale']      : 20;
    // 한 페이지에 화면에 출력하는 페이지수 ([prev] 1.2.3.4.5 [next] <- 이 때는 block_scale '5')
    $block_scale = $param['block_scale'] ? $param['block_scale'] : 10;

    // $now(현재글번호)가 들어올 경우 $now값을 가지고 몇번째 페이지인지 알아내기 (공식 : floor(($now - 1) / $scale) * $scale)
    if($now) {
        $page = $now ? floor(($now - 1) / $scale) : $page;
    }

    // 전체 페이지 수
    $pages = ceil($total / $scale);

    // 현재페이지에서의 첫글번호, 끝글번호
    $begin_page = $block_scale * ($page - 1);
    $end_page  = $block_scale *  $page;

    // 첫번째블럭번호, 마지막블럭번호 (5,6,7,8,9 <- 여기서 $begin=5, $end=9)
    $begin = floor($page / $block_scale) * $block_scale;
    $end  = $begin + $block_scale;

    // 출력될 때의 글번호 10,9,8,7... <- 여기서 first는 '10'
    $first = $total - ($scale * ($page - 1));

    // 내부적으로 시작값이 '0'인 변수를 '1'로 맞추기...
    $begin++;

    // 블럭내 끝  record($end)가 전체값($total)을 넘을 수 없으므로...
    if($end > $pages) { $end = $pages; }
    if($end == 0)    { $end = 1; }

    // prev 5.6.7.8.9 next - 이 경우에 array(5,6,7,8,9)
    $range = range($begin, $end);
    // prev(이전페이지)출력 - $page가    1이 아닐 때
    if($page != 1)
        { $prev = $page - 1; }
    // next(다음페이지)출력 - $page가 $end가 아닐 때
    if($page != $pages && $end != 1)
        { $next = $page + 1; }

    $return['prev']  = $prev;
    $return['page']  = $page;
    $return['next']  = $next;
    $return['range'] = $range;
    $return['first'] = $first;

    return $return;
} // function
-------------------------------------------------------------------------------
사용예...


[ 로직부분 ]
$url  = 'OpenBBS.com/bbs_list.php';
$total = 98; // 전체 글 수
$page  = 1;  // 현재 페이지
$scale = 10; // 한페이지에 나타낼 글의 수
$block_scale = // 하단에 나타낼 페이지 수 ( prev 1.2.3.4.5 next ) <- 이럴 경우 $block_scale은 5

// 변수들을 하나로 묶어서
$param = compact('url', 'total', 'page', 'scale', 'block_scale');
// 페이징 함수에 넣는거죠~ ^^
$pub['paging'] = @OBS_pubPaging($param);
// 리턴된 값은 파씽~
$smarty->assign('pub', $pub);


[ 화면 ]
<!-- 페이징 : B -->
<div id="paging">
{if $pub.paging.prev}
    <a href="{$url.bbs_list}&page={$pub.paging.prev}">prev</a>
{/if}

{foreach from=$pub.paging.range key=key item=value}
    {if $value != $pub.paging.page}
        [<a href="{$url.bbs_list}&page={$value}">{$value}</a>]
    {else}
        [{$value}]
    {/if}
{/foreach}

{if $pub.paging.next}
    <a href="{$url.bbs_list}&page={$pub.paging.next}">next</a>
{/if}
</div>
<!-- 페이징 : E -->

,