그누보드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';
?>
에러, 버그 등이 있거나 간단한 사양 변경이 있다면 직접 수정하시고 수정본은 댓글 좀 남겨주세요.
우선
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
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
덕분에 좋은 팁으로 해결되였습니다.
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=");
로 하면 좋을 것 같습니다!
$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=");
로 하면 좋을 것 같습니다!