웹마스터 팁

음...생각보다 페이지의 출력 방식 때문에 고생하시는 분들이 좀 있는 것 같아서 티나보드에서 사용하는 페이지수의 출력 부분을 알려드릴게요~

(이것두 알고리즘이라 해야하나?)
음..암튼 나름대로 제가 머리굴려서 구현한 페이지부분 입니다.
아주 세세하게 설명을 하면 너무 길어 질것 같아서 간력히 하겠습니다.
어렵다 싶으신 분들은 소스를 보시면서 대충 이렇구나 하시고 이해하시면 될거여요.
어디까지나 페이지수를 구하는 방법과 출력 방법일 뿐 입니다.
결과값을 가지고 페이지에 맞는 게시물의 출력 방식은 알아서 해주셔야겠죠.
그리고 코드정리가 좀 귀찬아서 티나보드 소스를 그대로 가져 왔으니까 html 태그는 무시하고 봐주세요.

[1]...[9][10][11][12][13][14][15][16]...[42]

이런식으로 출력됩니다.

아래의 코드중 실제로 게시판에서 가공되어 사용되는 변수(결과값)는 $page 달랑하나 입니다.
나머지는 페이지수를 구하고 페이지를 그룹에 맞추어 출력해 줍니다.
30개의 페이지가 있다면
1 부터 30 까지 한화면에 출력해서는 안되겠죠.

--------------------------------------------------------------------------------------------

if($total_arti) {
if($page_num==1) echo "<font size=1 color=#333333>[1]</font></td>";
  elseif($page_num>1) { $base_page=$start_page; $start_page=$start_page;
if($start_page>7) { $priv_page=$start_page-1; $start_base_page=$start_page-8;
                      echo "<a href=?code=administration&id=$id&page=0$get_query><font size=1 color=#333333>[1]</font></a>
                            <a href=?code=administration&id=$id&page=$priv_page&start_page=$start_base_page$get_query>....</a> ";
                   }
    for($i=0;$i<8;$i++) {
     $print_page=$start_page+1; $now_page=$page+1;
      if($now_page==$print_page) echo "<font size=1><b>[".$print_page."]</font></b>";
      else echo "<a href=?code=administration&id=$id&page=$start_page&start_page=$base_page$get_query><font size=1 color=#333333>[".$print_page."]</font></a>"; $start_page++;
      if($page_num==$print_page) break; }
$more_page=$page_num-$print_page;
if($more_page>0) {
  $last_page=$page_num-1;
   if($last_base_page=(int)$page_num%8) $last_base_page=$page_num-$last_base_page;
   else $last_base_page=$page_num-8;
  }
}
}

--------------------------------------------------------------------------------------------
**페이지당 출력 수를 20이라 가정합니다. **

//$total_arti => 전체게시물 숫자
if($total_arti) {
//게시물이 하나라도 있다면 실행됩니다. 이말은 게시물이 없다면 총 페이지 숫자가 뜨지 않는다는 이야기도 돼죠.

if($page_num==1) echo "<font size=1 color=#333333>[1]</font></td>";
//전체게시물이 관리자가 정한 게시물 출력수에 못미치면 페이지근 당근 1이 되죠. 고로 '[1]'을 출력합니다.

  elseif($page_num>1) { $base_page=$start_page; $start_page=$start_page;
//전체 게시물이 관리자가 정한 게시물수를 초과한다면 페이지는 한페이지 이상이 됩니다.
//$start_page => 한번에 보여질 페이지번호의 목록에서 첫페이지번호 ex) [1]...[9][10][11][12][13][14][15][16] <= 하나의 그룹
//화면상에 보여지는 첫번째 페이지는 [9]이지만 프로그램에서는 [8]로 해석합니다.
//출력되는값                     : [1][2][3]
//프로그램에서 해석되는 값 : [0][1][2]

if($start_page>7) { $priv_page=$start_page-1; $start_base_page=$start_page-8;
                      echo "<a href=?code=administration&id=$id&page=0$get_query><font size=1 color=#333333>[1]</font></a>
                            <a href=?code=administration&id=$id&page=$priv_page&start_page=$start_base_page$get_query>....</a> ";
                   }
//'...'과 [1]은 페이지가 8을 넘었다면 출력됩니다.
//사용자가 [1]을 클릭하면 처음 페이지로 이동하고,
//사용자가 '...'을 클릭하면 현재 페이지 목록이 어디이건간에 페이지는 이전의 그룹으로 이동합니다.

    for($i=0;$i<8;$i++) {
//for($i=0;$i<8;$i++) 변수에 정의하지 않고 저는 8로 사용하였지만 변수로 정의하셔서 원하실때마다 바꾸어 주셔도 좋겠죠.
//물론 번호가 몇번이든간에 [number]식으로 8번을 출력합니다.

     $print_page=$start_page+1; $now_page=$page+1;
//왜 1씩을 더하는지 아시죠? 해석되는 페이지의 값은 출력 값보다 1이 낮습니다.
//$now_page => 현재 사용자가 위치한 페이지와 동시에 get쿼리로 넘겨받은 값입니다.
//이 값이 있어야 사용자가 위치한 페이지와 페이지에 맞는 게시물을 뿌려줄수가 있겠죠.

      if($now_page==$print_page) echo "<font size=1><b>[".$print_page."]</font></b>";
//현재 위치한 페이지가 출력될 페이지수와 일치한다면 링크를 걸지 않고 일반텍스트로 출력합니다.

      else echo "<a href=?code=administration&id=$id&page=$start_page&start_page=$base_page$get_query><font size=1 color=#333333>[".$print_page."]</font></a>"; $start_page++;
//그렇지 않다면 페이지마다 링크를 걸게됩니다.


      if($page_num==$print_page) break; }
//$page_num => 전체 페이지수 입니다.
//전체 페이지수는 출력될 전체 게시물/출력될 페이지수 입니다.
//나눠서 나머지값이 있다면 +1을 하고 딱 떨어진다면 그 값을 그대로 사용합니다.
//$page_num(총페이지수)가 $print_page 수와 일치하면 루프가 종료됩니다.

$more_page=$page_num-$print_page;
//$more_page => 현재 위치한 페이지를 기준으로 페이지가 더 있는지 값을 구합니다.

if($more_page>0) {
  $last_page=$page_num-1;
   if($last_base_page=(int)$page_num%8) $last_base_page=$page_num-$last_base_page;
   else $last_base_page=$page_num-8;
//페이지가 더있다면 전체페이지를 관리자가 정한 페이지수를 나눠서 나머지 값이 있는지를 구하고 나머지 값이 있다면 $last_base_page는 총페이지 수에서 1혹은 0을 뺍니다.
//$last_page => 마지막 페이지의 출력번호입니다. 총페이지 수에서 1을 빼줍니다.
//$last_base_page의 결과값을 정수로 선언해 주어야 3.45464처럼 애메한 페이지가 나오지 않습니다.
//총페이지가 더블이라면 해보진 않았지만 웃기겠네요
//화면상에 총 3.42343의 페이지가 존재합니다. 하고 출려되면 이상하겠죠?
  }
}
}

위에서도 언급했지만 게시판에서 사용되는 결과값은 $page 뿐입니다.
게시판에서는 다음처럼 응용하셔도 될거여요.
실제로 티나보드에서도 $page의 결과값을 다음처럼 해당 페이지($page)만큼 값을 구하고 그 값만큼 sql에서 뽑아온 $result를 루프시켜 해당 게시물이 나올때까지 pointer를 이동시킵니다.

if($page) {
$null_roop=$page*$페이지당 출력수;
for($i=0;$i<$null_roop;$i++) $null=mysql_fetch_array($result); }

문장력이 없어 제가 봐도 참 이해하기 힘드네요...그래도 조그마한 도움이 되셨기를...