그누보드5 댓글(코멘트) 페이징 > 그누보드5 팁자료실

그누보드5 팁자료실

그누보드5 댓글(코멘트) 페이징 정보

그누보드5 댓글(코멘트) 페이징

본문

그누보드4용 팁(http://sir.co.kr/g4_tiptech/3455)을 그누보드5에 맞춰서 만들었습니다. 기본 함수 get_paging을 응용합니다 .덧붙여서, 한 페이지당 표시댓글수도 유저가 조절할 수 있게 만들었습니다. 덧글이 수백개씩 달린 경우 상당히 유용합니다.

우선
lib/common.lib.php 를 여시고

중간에 다음 코드를 삽입합니다. (기존 get_paging 함수는 게시글 검색에 사용되기 때문에 불필요한 오류를 막기 위해서입니다. 원본 함수와는 '&page='의 유무의 차이가 있습니다.)


function get_comment_paging($write_pages, $cur_page, $total_page, $url, $add="")
{
    //$url = preg_replace('#&page=[0-9]*(&page=)$#', '$1', $url);
    $url = preg_replace('#&page=[0-9]*#', '', $url) . '';

    $str = '';
    if ($cur_page > 1) {
        $str .= '<a href="'.$url.'1'.$add.'" class="pg_page pg_start">처음</a>'.PHP_EOL;
    }

    $start_page = ( ( (int)( ($cur_page - 1 ) / $write_pages ) ) * $write_pages ) + 1;
    $end_page = $start_page + $write_pages - 1;

    if ($end_page >= $total_page) $end_page = $total_page;

    if ($start_page > 1) $str .= '<a href="'.$url.($start_page-1).$add.'" class="pg_page pg_prev">이전</a>'.PHP_EOL;

    if ($total_page > 1) {
        for ($k=$start_page;$k<=$end_page;$k++) {
            if ($cur_page != $k)
                $str .= '<a href="'.$url.$k.$add.'" class="pg_page">'.$k.'<span class="sound_only">페이지</span></a>'.PHP_EOL;
            else
                $str .= '<span class="sound_only">열린</span><strong class="pg_current">'.$k.'</strong><span class="sound_only">페이지</span>'.PHP_EOL;
        }
    }

    if ($total_page > $end_page) $str .= '<a href="'.$url.($end_page+1).$add.'" class="pg_page pg_next">다음</a>'.PHP_EOL;

    if ($cur_page < $total_page) {
        $str .= '<a href="'.$url.$total_page.$add.'" class="pg_page pg_end">맨끝</a>'.PHP_EOL;
    }

    if ($str)
        return "<nav class=\"pg_wrap\"><span class=\"pg\">{$str}</span></nav>";
    else
        return "";
}


그리고나서

 view_comment.skin.php를 여시고 (기본 skin/board/basic/view_comment.skin.php) 원본 코드를 잘 보고 다음 코드로 대체하세요.

원본 코드(basic 스킨)은 다음과 같습니다.


<!-- 댓글 시작 { -->
<section id="bo_vc">
    <h2>댓글목록</h2>
    <?php
    $cmt_amt = count($list);
    for ($i=0; $i<$cmt_amt; $i++) {
        $comment_id = $list[$i]['wr_id'];
        $cmt_depth = ""; // 댓글단계
        $cmt_depth = strlen($list[$i]['wr_comment_reply']) * 20;
        $comment = $list[$i]['content'];
        /*
        if (strstr($list[$i]['wr_option'], "secret")) {
            $str = $str;
        }
        */
        $comment = preg_replace("/\[\<a\s.*href\=\"(http|https|ftp|mms)\:\/\/([^[:space:]]+)\.(mp3|wma|wmv|asf|asx|mpg|mpeg)\".*\<\/a\>\]/i", "<script>doc_write(obj_movie('$1://$2.$3'));</script>", $comment);
        $cmt_sv = $cmt_amt - $i + 1; // 댓글 헤더 z-index 재설정 ie8 이하 사이드뷰 겹침 문제 해결
    ?>

대체 코드는 다음과 같습니다.


<!-- 댓글 시작 { -->
<section id="bo_vc">
<?php if(!$c_rows) $c_rows = 20; ?> // 표시댓글수가 지정되지 않았을경우 기본값 20
    <div>
    <h2>댓글목록</h2>
    <div align='right'>
    <form method = "post" action = "./board.php?bo_table=<?php echo $bo_table ?>&wr_id=<?php echo $wr_id?>">
    표시댓글수<input type = "number" value="<?php echo $c_rows ?>" name = "c_rows" style="width:50px;">
    <input type = "submit" value = "설정">
    </form>
    </div>
    </div>
   
    <?php // 코멘트 번호 계산식 및 페이징 표시
    $c_total_count = count($list); // 전체 코멘트 수 할당  // 보여줄 개수
    if ($c_total_count != 0){
        $c_total_page  = ceil($c_total_count / $c_rows);  // 전체 페이지 계산
    if (!$c_page) $c_page = 1; // 페이지가 없으면 첫 페이지 (1 페이지)
    $c_from_record = ($c_page - 1) * $c_rows; // 시작 코멘트 구하기
    $c_last_record = $c_from_record + $c_rows; // 끝 코멘트 구하기
    if($c_last_record > $c_total_count){ // 마지막 코멘트가 전체 코멘트 보다 크면 전체 코멘트로 할당
        $c_last_record = $c_total_count;
    }
    }
    // 페이징 처리 함수 및 표시
    $c_pagelist = get_comment_paging($c_rows, $c_page, $c_total_page, "./board.php?bo_table=$bo_table&c_rows=$c_rows&wr_id=$wr_id&c_page=");
    if ($c_pagelist) {
        echo "<table width=100% cellpadding=3 cellspacing=1><tr><td align=right>$c_pagelist</td></tr></table>\n";
    }
?>
 
    <?php
    $cmt_amt = $c_last_record;
    $i = $c_from_record;
    for ($i; $i<$cmt_amt; $i++) {
$comment_id = $list[$i]['wr_id'];
        $cmt_depth = ""; // 댓글단계
        $cmt_depth = strlen($list[$i]['wr_comment_reply']) * 20;
        $comment = $list[$i]['content'];
        /*
        if (strstr($list[$i]['wr_option'], "secret")) {
            $str = $str;
        }
        */
        $comment = preg_replace("/\[\<a\s.*href\=\"(http|https|ftp|mms)\:\/\/([^[:space:]]+)\.(mp3|wma|wmv|asf|asx|mpg|mpeg)\".*\<\/a\>\]/i", "<script>doc_write(obj_movie('$1://$2.$3'));</script>", $comment);
        $cmt_sv = $cmt_amt - $i + 1; // 댓글 헤더 z-index 재설정 ie8 이하 사이드뷰 겹침 문제 해결
    ?>




그리고 같은 파일에서 81줄쯤



</section>
<!-- } 댓글 끝 -->

<?php if ($is_comment_write) {
    if($w == '')
        $w = 'c';
?>


이런 코드가 있을텐데, 이를 다음 코드로 대체해주세요.

<?php
if ($c_pagelist) {
        echo "<table width=100% cellpadding=3 cellspacing=1><tr><td align=right>$c_pagelist</td></tr></table>\n";
    }
?>
<div align='right'>
    <form method = "post" action = "./board.php?bo_table=<?php echo $bo_table ?>&wr_id=<?php echo $wr_id?>">
    표시댓글수<input type = "number" value="<?php echo $c_rows ?>" name = "c_rows" style="width:50px;">
    <input type = "submit" value = "설정">
    </form>
    </div>
</section>
<!-- } 댓글 끝 -->

<?php if ($is_comment_write) {
    if($w == '')
        $w = 'c';
?>


에러, 버그 등이 있거나 간단한 사양 변경이 있다면 직접 수정하시고 수정본은 댓글 좀 남겨주세요.
추천
2

댓글 4개

감사합니다.

덕분에 좋은 팁으로 해결되였습니다.


lib/common.lib.php 동일하게 적용했습니다.

view_comment.skin.php 같은 경우 <?php echo $link_buttons ?>와 동일하게 복사/이동/삭제/목록이 위&아래 같이 구현할것은 다음과 같이 변경하였습니다.


<?php // 코멘트 번호 계산식 및 페이징 표시
    $c_total_count = count($list); // 전체 코멘트 수 할당  // 보여줄 개수
    if ($c_total_count != 0){
        $c_total_page  = ceil($c_total_count / $c_rows);  // 전체 페이지 계산
    if (!$c_page) $c_page = 1; // 페이지가 없으면 첫 페이지 (1 페이지)
    $c_from_record = ($c_page - 1) * $c_rows; // 시작 코멘트 구하기
    $c_last_record = $c_from_record + $c_rows; // 끝 코멘트 구하기
    if($c_last_record > $c_total_count){ // 마지막 코멘트가 전체 코멘트 보다 크면 전체 코멘트로 할당
        $c_last_record = $c_total_count;
    }
    }
    // 페이징 처리 함수 및 표시
    $c_pagelist = get_comment_paging($c_rows, $c_page, $c_total_page, "./board.php?bo_table=$bo_table&c_rows=$c_rows&wr_id=$wr_id&c_page=");
  // if ($c_pagelist) {
  // echo "<table width=100% cellpadding=3 cellspacing=1><tr><td align=right>$c_pagelist</td></tr></table>\n";
    }
?>


if ($c_pagelist) {
echo "<table width=100% cellpadding=3 cellspacing=1><tr><td align=right>$c_pagelist</td></tr></table>\n";

이 부분을 주석 처리하거나 삭제했습니다.

또한 사용자가 댓글 갯수를 설정하지 못하도록

<div align='right'>
    <form method = "post" action = "./board.php?bo_table=<?php echo $bo_table ?>&wr_id=<?php echo $wr_id?>">
    표시댓글수<input type = "number" value="<?php echo $c_rows ?>" name = "c_rows" style="width:50px;">
    <input type = "submit" value = "설정">
    </form>
</div>
부분은 코드 삽입하지 않았습니다.

<?php if(!$c_rows) $c_rows = 5; ?>

중간에 코드 중에서
 $cmt_depth = strlen($list[$i]['wr_comment_reply']) * 5;


이렇게 수정하였습니다.


테스트 게시판 입니다.



http://makenplay.net/bbs/board.php?bo_table=test_0402&c_rows=5&wr_id=4&c_page=1
그누 5에서 짧은 주소를 쓸떄를 대비해서
  $c_pagelist = get_comment_paging($c_rows, $c_page, $c_total_page, "./board.php?bo_table=$bo_table&c_rows=$c_rows&wr_id=$wr_id&c_page=");


$c_pagelist = get_comment_paging($c_rows, $c_page, $c_total_page, "$G5_URL?c_rows=$c_rows&c_page=");
로 하면 좋을 것 같습니다!
전체 2,435 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT