[테마제작기(23記)] 게시글 부가(?) 페이지 개발 > 개발자팁

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

[테마제작기(23記)] 게시글 부가(?) 페이지 개발 정보

기타 [테마제작기(23記)] 게시글 부가(?) 페이지 개발

본문

원문(출처) : 그누보드 테마 제작 23 - 게시글 부가 페이지 개발

 

부가 페이지란, 아래 영역을 말하는겁니다.

2949618301_1594551666.8071.png

 

저 영역을 남겨두긴 했는데,
저기에 뭘 넣어야 할지 답을 못정하고 있다.
걍 없애버릴까도 잠깐 생각이....

sir.kr에서 찾아봐야겠습니다.

2949618301_1594551703.6134.png

 

아.. 기본테마에서도 찾아봐야겠어요.
별거 없네요...

 

SIR에서 가져온 본 게시판의 최신글과 인기글을 배치하고
그 아래로 최신 댓글을 위치시켜보겠습니다.

 

이번에도 작업 순서를 정해서 진행해볼게요.

1. 보기 페이지의 Side 영역을 위한 파일을 생성합니다.
2. Metronic Admin 템플릿을 이용하여 UI 만들기
3. 각 게시판의 최신글과 인기글을 돌려줄 쿼리 제작
4. 각 게시판의 최신 댓글과 인기 댓글을 돌려줄 함수 제작
5. /bbs/view_side.php 개발
6. view_side.skin.php 개발

이렇게 진행합니다.

 

1. 보기 페이지의 Side 영역을 위한 파일을 생성합니다.

/bbs/view_side.php : 보기 사이드 영역의 리스트를 개발합니다.
/theme/mt703/skin/board/basic/view_side.skin.php : 보기 사이드 영역의 UI를 개발합니다.

 

view_side.php에 보기 사이드 영역의 HTML을 이동시킵니다.
view_side.php에서 view_side.skin.php를 Include하도록 합니다.
view.skin.php에서 /bbs/view_side.php를 Include 합니다.

 

이제 준비 작업은 끝났습니다.

 

2. Metronic Admin 템플릿을 이용하여 UI 만들기

2949618301_1594551989.5923.png

 

HTML을 옮겨보고 상단 TAB의 수를 수정 후 화면을 살펴보겠습니다.

2949618301_1594552013.1872.png

 

 

3. 각 게시판의 최신글과 인기글을 돌려줄 쿼리 제작

mt703.lib.php에 get_board_list() 함수를 만듭니다.
파라메터는 게시판 ID, 최신/인기 선택자, 리스트개수 정도면 될 듯 합니다.
이제 쿼리 작업을 진행합니다.
(인기순... 잘못 정해서 일만 늘렸네요. 흠냐. 인기의 척도가 뭔지 정해야 하는 상황이 ㅡㅡ;;)


-- 최신순은 쉽네...
select * from g5_write_notice where wr_is_comment = 0 order by wr_datetime desc, wr_num desc;
-- 인기순... 아뇌... 추천순으로 할걸... 괜히 복잡해짐...
-- 추천(wr_good)은 10점, 비추(wr_nogood)은 -10점, 스크랩(wr_scrap)은 5점, 댓글(wr_comment)은 3점, 조회수(wr_hit)는 1점
-- 날짜 개념이 들어가야 할 것 같은데... 오래 된건 차감이 되어야 한다...
-- 지난 날짜 수당 -10점. 추천만큼 차감하면 되지 않을까...
select
    wr_id, wr_subject, wr_good, wr_nogood, wr_comment,
    (select count(ms_id) FROM g5_scrap AS s WHERE s.bo_table = 'notice' AND s.wr_id = b.wr_id) AS scrap_cnt
from g5_write_notice AS b where wr_is_comment = 0;
-- 아래 쿼리가 인기순 쿼리로 사용될 것.
SELECT
    ms.*,
    (ms.wr_good*10 + ms.wr_nogood*(-10) + ms.past_day*(-10) + ms.wr_comment*3 + wr_hit) AS hot_score
FROM (
    select
        b.*, TIMESTAMPDIFF(DAY, wr_datetime, curdate()) AS past_day,
        (select count(ms_id) FROM g5_scrap AS s WHERE s.bo_table = 'notice' AND s.wr_id = b.wr_id) AS scrap_cnt
from g5_write_notice AS b
where wr_is_comment = 0
) AS ms
ORDER BY hot_score DESC;

이렇게 쿼리작업이 완료되었습니다.

 

4. 각 게시판의 최신 댓글과 인기 댓글을 돌려줄 함수 제작

함수는 latest() 함수를 복사하여 만들 생각입니다.
중간에 return을 retrun이라고 오타를 내고는 원인을 못찾아서 시간 좀 허비했네요 ㅠㅠ


// 테이블명, 게새글/댓글 구분, 정렬구분 등을 전달 받아 게시글의 리스트를 돌려줌.
// latest() 함수를 참고하여 만들었고, 스킨과 캐싱부분만 제외시켰음. by tank. at 200704.
function get_board_list( $bo_table, $br_gubun, $ord_gubun, $rows=5, $subject_len=40 ) {
    global $g5;
    $list = array();
    $tmp_write_table = $g5['write_prefix'] . $bo_table; // 게시판 테이블 전체이름
    if ( $ord_gubun == "NEW" ) {
        $sql = "SELECT * FROM {$tmp_write_table} WHERE wr_is_comment = {$br_gubun} AND wr_option != 'secret' ORDER BY wr_datetime desc, wr_num desc LIMIT 0, {$rows}";
    } else if ( $ord_gubun == "HOT" ) {
        $sql = "SELECT
                    ms.*, (ms.wr_good*10 + ms.wr_nogood*(-10) + ms.past_day*(-10) + ms.wr_comment*3 + wr_hit) AS hot_score
                FROM (
                    select
                        b.*, TIMESTAMPDIFF(DAY, wr_datetime, curdate()) AS past_day,
                        (select count(ms_id) FROM g5_scrap AS s WHERE s.bo_table = 'notice' AND s.wr_id = b.wr_id) AS scrap_cnt
                from {$tmp_write_table} AS b
                where wr_is_comment = {$br_gubun} AND wr_option != 'secret'
                ) AS ms
                ORDER BY hot_score DESC
                LIMIT 0, {$rows}";
    }
    $result = sql_query($sql);                                  //tLog($sql, $result);
    for ($i=0; $row = sql_fetch_array($result); $i++) {         //tLog("row", $row);
        try {
            unset($row['wr_password']);     //패스워드 저장 안함( 아예 삭제 )
        } catch (Exception $e) {
        }
        $row['wr_email'] = '';              //이메일 저장 안함
        if (strstr($row['wr_option'], 'secret')){           // 비밀글일 경우 내용, 링크, 파일 저장 안함
            $row['wr_content'] = $row['wr_link1'] = $row['wr_link2'] = '';
            $row['file'] = array('count'=>0);
        }
        $list[$i] = $row;
        $list[$i]['bo_table'] = $bo_table;
    }
    return $list;
}

 

 

5. /bbs/view_side.php 개발

이 파일의 역할은 단지 함수를 호출하고 특정 변수에 결과를 저장하는 역할입니다.
이후 view_side.skin.php 파일을 호출하면 그만이죠.


<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
$new_list = get_board_list($bo_table, 0, "NEW");       //tLog("new_list", $new_list); //새글 리스트
$hot_list = get_board_list($bo_table, 0, "HOT");       //tLog("hot_list", $hot_list); //인기글 리스트
$new_rep_list = get_board_list($bo_table, 1, "NEW");   //tLog("new_rep_list", $new_rep_list); //새 댓글 리스트
$hot_rep_list = get_board_list($bo_table, 1, "HOT");   //tLog("hot_rep_list", $hot_rep_list); //인기 댓글 리스트
include_once($board_skin_path.'/view_side.skin.php');
?>

 

 

6. view_side.skin.php 개발

받아온 각 배열변수를 각 영역에 맞게 입력시켜주기만 하면 되겠네요.

소스는 원문에서 확인하실 수 있습니다.

이렇게 게시글 보기 페이지의 사이드 영역 작업이 완료되었습니다.

2949618301_1594552285.4769.png

 

 

빨리 끝낼 수 도 있었을텐데...
작은 오타 실수로 인하여 시간을 많이 허비했네요.
위에서 말했던 return을 retrun으로...
좀 전에는 for(i=0; i<count... 구문을 for(i==0; i<count... 으로...
잘 나오던 리스트들이 갑자기 안나와서 굉장히 당황했었네요.

 

이렇게 게시판에 대한 모든 작업이 완료되었습니다.

 

다음 작업은 지금까지 한 일반 게시판 작업을 바탕으로 
갤러리 게시판 작업을 진행하도록 하겠습니다.

 

우측 영역을 따라다니도록 추가로 작업했어요.
그런데... 특정 영역에서 멈추지가 않네요 ㅠㅠ

소스는 원문에서 확인하실 수 있습니다.

2949618301_1594552364.2818.png

 

드디어 게시판의 모든 과정이 완료가 되었습니다.

 

원문(출처) : 그누보드 테마 제작 23 - 게시글 부가 페이지 개발

추천
2

댓글 6개

우측은 애드센스에 양보하세요 ^^
저는 이렇게 했어요
저도 사이트 6개다 테마를 커스텀해서 쓰고있어서 ㅎㅎ
전체 1,261
개발자팁 내용 검색 기타에서

회원로그인

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