페이지네이션 0개부터 보이게 수정
본문
안녕하세요 고수님들
게시판에서 페이지네이션 관련해서 질문드려요
수정하려는 게시판 스킨은 n+1개 이상 시 페이지네이션이 나오도록 설정되어있습니다. (스킨 기본 설정인가요?)
n개 설정은 관리자 페이지에서 가능한 상태입니다.
제가 수정하고 싶은 방향은 0개부터 페이지네이션이 계속 보이면서,
게시물이 n개 이하일 때는 현재 페이지만 표시되도록 수정하고 싶습니다.
검색해보니 bbs/list.php와 lib/common.lib.php에서 수정이 필요한 것 같은데 전혀 감을 못 잡겠어요..ㅠㅠ
bbs/list.php는 필요하시다면 댓글로 올려드리겠습니다!!
1. 게시판 스킨 list.skin.php 의 페이지네이션 부분
<div id="k_pg_con">
<?php echo $write_pages; ?>
</div>
2. lib/common.lib.php 페이지네이션 부분
// 한페이지에 보여줄 행, 현재페이지, 총페이지수, URL
function get_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);
$url .= substr($url, -1) === '?' ? 'page=' : '&page=';
$url = preg_replace('|[^\w\-~+_.?#=!&;,/:%@$\|*\'()\[\]\\x80-\\xff]|i', '', clean_xss_tags($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 "";
}
// 페이징 코드의 <nav><span> 태그 다음에 코드를 삽입
function page_insertbefore($paging_html, $insert_html)
{
if(!$paging_html)
$paging_html = '<nav class="pg_wrap"><span class="pg"></span></nav>';
return preg_replace("/^(<nav[^>]+><span[^>]+>)/", '$1'.$insert_html.PHP_EOL, $paging_html);
}
// 페이징 코드의 </span></nav> 태그 이전에 코드를 삽입
function page_insertafter($paging_html, $insert_html)
{
if(!$paging_html)
$paging_html = '<nav class="pg_wrap"><span class="pg"></span></nav>';
if(preg_match("#".PHP_EOL."</span></nav>#", $paging_html))
$php_eol = '';
else
$php_eol = PHP_EOL;
return preg_replace("#(</span></nav>)$#", $php_eol.$insert_html.'$1', $paging_html);
}
답변 2
다음과 같이 조건문을 추가하면 가능할 것 같습니다.
common.lib.php
function get_paging($write_pages, $cur_page, $total_page, $url, $add="") {
if ($total_page <= 1) {
// 게시물이 한 페이지 이하일 때는 현재 페이지만 표시
return '<nav class="pg_wrap"><span class="pg"><strong class="pg_current">1</strong></span></nav>';
}
//$url = preg_replace('#&page=[0-9]*(&page=)$#', '$1', $url);
$url = preg_replace('#(&)?page=[0-9]*#', '', $url);
$url .= substr($url, -1) === '?' ? 'page=' : '&page=';
$url = preg_replace('|[^\w\-~+_.?#=!&;,/:%@$\|*\'()\[\]\\x80-\\xff]|i', '', clean_xss_tags($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 "";
}
다음을 참고하셔서 원하시는 형식으로 만드시면 가능하지 않을까 합니다.
list.skin.php
<div id="k_pg_con">
<?php
if ($total_page > 1) { // 게시물이 여러 페이지로 나뉘어질 때만 페이지네이션 표시
echo $write_pages;
}
?>
</div>
common.lib.php
function get_paging($write_pages, $cur_page, $total_page, $url, $add="") {
if ($total_page <= 1) {
return ""; // 게시물이 한 페이지 이하일 때는 페이지네이션을 표시하지 않음
}
// 나머지 코드는 그대로 유지
}
function page_insertbefore($paging_html, $insert_html) {
if(!$paging_html)
$paging_html = '<nav class="pg_wrap"><span class="pg"></span></nav>';
return preg_replace("/^(<nav[^>]+><span[^>]+>)/", '$1'.$insert_html.PHP_EOL, $paging_html);
}
function page_insertafter($paging_html, $insert_html) {
if(!$paging_html)
$paging_html = '<nav class="pg_wrap"><span class="pg"></span></nav>';
if(preg_match("#".PHP_EOL."</span></nav>#", $paging_html))
$php_eol = '';
else
$php_eol = PHP_EOL;
return preg_replace("#(</span></nav>)$#", $php_eol.$insert_html.'$1', $paging_html);
}