그누보드 다중 게시판 최신글
Lpla
·2021. 10. 23. 21:36
1. 그누보드 최신글
그누보드는 하나의 게시판을 최신글로 불러올 수 있다.
<?php echo latest('스킨이름', '테이블이름', '게시글 개수', '제목 길이'); ?>
하지만 이 방식으로는 두 개 이상의 게시판을 불러올 수 없다.
가령 공지사항 게시판, 소식 게시판을 하나의 최신글로 불러오고 싶다면 어떻게 해야 할까?
2. 그누위즈 다중 게시판 최신글
그누위즈에서 여러 게시판을 하나의 최신글로 불러오는 기능을 만든 것이 있다.
먼저 /lib/latest.lib.php 파일 하단에 다음 코드를 추가한다.
function latest_all($skin_dir = '', $bo_tables, $rows = 10, $subject_len = 40, $cache_time = 1, $options = '')
{
global $g5;
if (!$skin_dir) $skin_dir = 'basic';
if (preg_match('#^theme/(.+)$#', $skin_dir, $match)) {
if (G5_IS_MOBILE) {
$latest_skin_path = G5_THEME_MOBILE_PATH . '/' . G5_SKIN_DIR . '/latest/' . $match[1];
if (!is_dir($latest_skin_path))
$latest_skin_path = G5_THEME_PATH . '/' . G5_SKIN_DIR . '/latest/' . $match[1];
$latest_skin_url = str_replace(G5_PATH, G5_URL, $latest_skin_path);
} else {
$latest_skin_path = G5_THEME_PATH . '/' . G5_SKIN_DIR . '/latest/' . $match[1];
$latest_skin_url = str_replace(G5_PATH, G5_URL, $latest_skin_path);
}
$skin_dir = $match[1];
} else {
if (G5_IS_MOBILE) {
$latest_skin_path = G5_MOBILE_PATH . '/' . G5_SKIN_DIR . '/latest/' . $skin_dir;
$latest_skin_url = G5_MOBILE_URL . '/' . G5_SKIN_DIR . '/latest/' . $skin_dir;
} else {
$latest_skin_path = G5_SKIN_PATH . '/latest/' . $skin_dir;
$latest_skin_url = G5_SKIN_URL . '/latest/' . $skin_dir;
}
}
$list = array();
$sql_common = " from {$g5['board_new_table']} a where find_in_set(a.bo_table, '{$bo_tables}')";
$sql_common .= " and a.wr_id = a.wr_parent ";
$sql_order = " order by a.bn_id desc ";
$sql = " select a.* {$sql_common} {$sql_order} limit 0, {$rows}";
$result = sql_query($sql);
for ($i = 0; $row = sql_fetch_array($result); $i++) {
$sql = " select * from {$g5['board_table']} where bo_table = '{$row['bo_table']}' ";
$board = sql_fetch($sql);
$tmp_write_table = $g5['write_prefix'] . $row['bo_table'];
$row2 = sql_fetch(" select * from {$tmp_write_table} where wr_id = '{$row['wr_id']}' ");
$list[$i] = $row2;
$list[$i] = get_list($row2, $board, $latest_skin_url, $subject_len);
$list[$i]['bo_subject'] = $row['bo_subject'];
$list[$i]['bo_table'] = $row['bo_table'];
}
ob_start();
include $latest_skin_path . '/latest.skin.php';
$content = ob_get_contents();
ob_endclean();
return $content;
}
이제 최신글을 사용하고자 하는 페이지에서 latest 대신 latest_all 함수를 사용하면 여러 게시판의 글을 불러올 수 있다.
주의해야할 점은 콤마 사이에 띄어쓰기를 사용하면 적용되지 않기 때문에 띄어쓰기 없이 붙여 써야 한다.
<?php echo latest_all('스킨이름', '테이블이름1,테이블이름2', '게시글 개수', '제목 길이'); ?>
공지사항 게시판과 자유게시판 2개의 게시글을 무사히 불러왔다.
3. 보완 사항
3-1. 게시판 이름 표시
이제 여러 게시판의 게시글을 불러올 수 있지만 해당 게시글이 어떤 게시판인지 카테고리를 알 수 있으면 더 좋을 것이다.
그러기 위해서는 처음에 추가한 latest.lib.php 내용을 수정할 필요가 있다.
// $list[$i]['bo_subject'] = $row['bo_subject'];
$list[$i]['bo_subject'] = $board['bo_subject'];
latest_all 함수 내부에 $list[$i]['bo_subject'] = $row['bo_subject']; 를 $list[$i]['bo_subject'] = $board['bo_subject']; 로 수정한 후 저장한다.
그리고 게시판 스킨 폴더의 latest.skin.php에서 적당한 위치에 아래 코드를 추가한다.
반복문 바깥에 넣게 되면 에러가 뜨기 때문에 반복문(for 문) 안에 추가해야 한다.
echo "<span class=\"latest_cate\">" . $list[$i]["bo_subject"] . "</span>
다시 페이지를 확인해보면 게시판 이름이 표시된다.
3-2. 링크 문제
스킨에 따라 게시글의 링크가 제대로 연결되지 않는 문제가 있다.
보다시피 게시글의 아이디만 달랑 있고 게시판 이름이 없다.
이 문제는 이때는 스킨 폴더 latest.skin.php에서 $bo_table를 $list[$i]['bo_table']로 바꿔주면 해결된다.