사이트 활용팁

2025.06.06 12:30

댓글 추천/비추천

01. 새로운 파일 ajax.comment_good_nogood.php 생성

그누보드 bbs 디렉토리 안에 ajax.comment_good_nogood.php 파일을 생성하고 아래 내용을 넣어주세요. 이 파일은 댓글 추천/비추천 요청을 처리하고 데이터베이스를 업데이트하는 역할을 합니다.

<?php
include_once('./_common.php');

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

$comment_id = isset($_POST['comment_id']) ? (int)$_POST['comment_id'] : 0;
$action = isset($_POST['action']) ? clean_xss_tags($_POST['action']) : '';
$bo_table = isset($_POST['bo_table']) ? clean_xss_tags($_POST['bo_table']) : '';
$wr_id = isset($_POST['wr_id']) ? (int)$_POST['wr_id'] : 0; // 게시글 ID

if (!$comment_id || !$action || !$bo_table || !$wr_id) {
    die(json_encode(['error' => '잘못된 요청입니다.']));
}

// 게시판 설정 정보 가져오기 (권한 체크에 필요)
$board = get_board_info($bo_table);
if (!$board) {
    die(json_encode(['error' => '게시판 정보가 없습니다.']));
}

// 본문 추천/비추천 권한과 동일하게 적용
// bo_use_good_nogood은 보통 비회원도 추천/비추천이 가능한지 여부를 설정하는 변수입니다.
if ($board['bo_use_good_nogood'] && !$member['mb_id']) { // 게시판 설정에서 비회원 추천/비추천을 허용하지 않으면 (즉, 회원만 가능하면)
    die(json_encode(['error' => '회원만 추천/비추천이 가능합니다.']));
}

// IP 중복 체크 (게시글 추천/비추천과 동일하게 적용)
// 이 부분은 게시판 설정의 'IP당 추천/비추천수'에 따라 다르게 동작할 수 있습니다.
// 현재는 1회만 가능하도록 세션에 저장합니다.
$ip = $_SERVER['REMOTE_ADDR'];
$ss_name = 'ss_comment_'.$action.'_'.$comment_id;

if (get_session($ss_name) == $ip) {
    die(json_encode(['error' => '이미 ' . ($action == 'good' ? '추천' : '비추천') . '하셨습니다.']));
}

// 댓글 정보 가져오기 (cmt_good, cmt_nogood 칼럼 사용)
$sql_comment = " SELECT cmt_good, cmt_nogood FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$comment_id}' ";
$comment_row = sql_fetch($sql_comment);

if (!$comment_row) {
    die(json_encode(['error' => '댓글을 찾을 수 없습니다.']));
}

$update_field = '';
if ($action === 'good') {
    $update_field = 'cmt_good';
    $current_count = $comment_row['cmt_good'];
} elseif ($action === 'nogood') {
    $update_field = 'cmt_nogood';
    $current_count = $comment_row['cmt_nogood'];
} else {
    die(json_encode(['error' => '유효하지 않은 액션입니다.']));
}

// 데이터 업데이트 (cmt_good, cmt_nogood 칼럼 사용)
$sql_update = " UPDATE {$g5['write_prefix']}{$bo_table} SET {$update_field} = {$update_field} + 1 WHERE wr_id = '{$comment_id}' ";
sql_query($sql_update);

// 세션에 IP 저장 (중복 추천/비추천 방지)
set_session($ss_name, $ip);

// 업데이트된 값 다시 가져오기
$new_comment_row = sql_fetch(" SELECT cmt_good, cmt_nogood FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$comment_id}' ");

echo json_encode([
    'success' => true,
    'cmt_good_count' => $new_comment_row['cmt_good'], // 변경된 칼럼명에 맞게
    'cmt_nogood_count' => $new_comment_row['cmt_nogood'] // 변경된 칼럼명에 맞게
]);
?>

 

02. _common.php 파일 확인 (필요시 추가)

_common.php 파일에 clean_xss_tags 함수가 포함되어 있는지 확인하세요. 일반적으로 그누보드에는 이 함수가 있지만, 혹시 없다면 아래 코드를 추가해야 합니다.

// _common.php 또는 적절한 유틸리티 파일에 추가
if (!function_exists('clean_xss_tags')) {
    function clean_xss_tags($str)
    {
        $str = preg_replace('#</*(?:applet|b(?:ase|gsound)|xss:base|xss:bgsound|b(?:link|ody)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|xml)[^>]*>#is', '', $str);
        $str = preg_replace('#<([^>]*)(onabort|onactivate|onafterprint|onafterupdate|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditfocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror|onerrorupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmouseout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizeend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)([ \r\n\t]*)=([ \r\n\t]*)("|\'|&#x22;|&#x27;)([^\5]*)\5([^>]*?)>#is', '<$1$6>', $str);
        return $str;
    }
}

 

03. CSS 추가 (style.css 또는 적절한 CSS 파일)

추천/비추천 버튼의 스타일을 위해 style.css 파일 (보통 board_skin_url에 있는)에 아래 CSS를 추가해주세요.

/* 댓글 추천/비추천 버튼 */
.cmt_good_btn,
.cmt_nogood_btn {
    display: inline-flex;
    align-items: center;
    cursor: pointer;
    margin-left: 10px;
    font-size: 13px; /* 폰트 크기 조절 */
    color: #666;
    transition: color 0.2s ease;
}

.cmt_good_btn:hover,
.cmt_nogood_btn:hover {
    color: #007bff; /* 호버 시 색상 변경 */
}

.cmt_good_btn svg,
.cmt_nogood_btn svg {
    margin-right: 3px;
    vertical-align: middle;
}

.cmt_good_btn .good_count,
.cmt_nogood_btn .nogood_count {
    font-weight: bold;
}

.cmt_good_btn.disabled,
.cmt_nogood_btn.disabled {
    cursor: not-allowed;
    opacity: 0.6;
}

 

04. view_comment.skin.php 파일 수정

① 파일 상단에 SQL 칼럼 추가 로직 삽입

사용자님의 view_comment.skin.php 파일에 아래 내용을 추가 및 수정합니다. view_comment.skin.php 파일의 가장 상단에 있는 <?php 태그 바로 아래에 다음 코드를 추가합니다.

<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

// --- [시작] 댓글 추천/비추천 칼럼 존재 여부 확인 및 추가 ---
if (isset($bo_table) && $bo_table) {
    $write_table = $g5['write_prefix'] . $bo_table; // 게시판 테이블명 (댓글 테이블도 동일하게 사용)

    // cmt_good 칼럼 확인 및 추가
    $sql_check_cmt_good = "SHOW COLUMNS FROM `{$write_table}` LIKE 'cmt_good'";
    $row_cmt_good = sql_fetch($sql_check_cmt_good);
    if (!$row_cmt_good) {
        // 기존 wr_good 칼럼 뒤에 추가하는 것이 자연스러움. 만약 wr_good이 없다면 wr_hit 뒤에.
        // 여기서는 wr_hit 뒤에 추가하는 것으로 가정합니다.
        $sql_add_cmt_good = "ALTER TABLE `{$write_table}` ADD `cmt_good` INT(11) NOT NULL DEFAULT '0' AFTER `wr_hit`";
        sql_query($sql_add_cmt_good, false);
    }

    // cmt_nogood 칼럼 확인 및 추가
    $sql_check_cmt_nogood = "SHOW COLUMNS FROM `{$write_table}` LIKE 'cmt_nogood'";
    $row_cmt_nogood = sql_fetch($sql_check_cmt_nogood);
    if (!$row_nogood) { // $row_nogood 대신 $row_cmt_nogood를 확인해야 합니다.
        // cmt_good 칼럼 뒤에 추가
        $sql_add_cmt_nogood = "ALTER TABLE `{$write_table}` ADD `cmt_nogood` INT(11) NOT NULL DEFAULT '0' AFTER `cmt_good`";
        sql_query($sql_add_cmt_nogood, false);
    }
}
// --- [끝] 댓글 추천/비추천 칼럼 존재 여부 확인 및 추가 ---

?>

 

② 댓글 작성일자 옆에 추천/비추천 버튼 삽입

view_comment.skin.php 파일에서 div class="gall_date" 부분을 찾습니다. 이 부분은 대략 40~50번째 줄에 있을 것입니다.

<p class="p_times" style="margin-bottom:10px;"><span><?php echo date('Y-m-d H:i', strtotime($list[$i]['datetime'])) ?></span></p>

위 코드 바로 아래에 다음 HTML 코드를 추가합니다.

                <?php if ($list[$i]['mb_id'] != $member['mb_id'] || $member['mb_id'] == '') { // 본인 댓글이 아니거나 비회원일 경우에만 표시 (권한에 따라 조절) ?>
                <span class="cmt_good_btn" data-comment-id="<?php echo $comment_id; ?>" data-action="good">
                    <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-thumbs-up"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg>
                    <span class="good_count"><?php echo $list[$i]['cmt_good']; // 변경된 칼럼명 ?></span>
                </span>
                <span class="cmt_nogood_btn" data-comment-id="<?php echo $comment_id; ?>" data-action="nogood">
                    <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-thumbs-down"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zM17 2h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"></path></svg>
                    <span class="nogood_count"><?php echo $list[$i]['cmt_nogood']; // 변경된 칼럼명 ?></span>
                </span>
                <?php } ?>

                <script>
                // --- [추가 시작] 댓글 추천/비추천 기능 ---
                $(document).on('click', '.cmt_good_btn, .cmt_nogood_btn', function() {
                    const btn = $(this);
                    const commentId = btn.data('comment-id');
                    const action = btn.data('action'); // 'good' 또는 'nogood'
                    
                    // 중복 클릭 방지
                    if (btn.hasClass('disabled')) {
                        return false;
                    }
                    btn.addClass('disabled'); // 버튼 비활성화

                    $.ajax({
                        url: g5_bbs_url + '/ajax.comment_good_nogood.php', // 이 파일을 새로 생성해야 합니다.
                        type: 'POST',
                        data: {
                            comment_id: commentId,
                            action: action,
                            bo_table: '<?php echo $bo_table; ?>', // 게시판 테이블명
                            wr_id: '<?php echo $wr_id; ?>' // 게시글 ID
                        },
                        dataType: 'json',
                        success: function(data) {
                            if (data.error) {
                                alert(data.error);
                            } else {
                                if (action === 'good') {
                                    btn.find('.good_count').text(data.cmt_good_count);
                                } else if (action === 'nogood') {
                                    btn.find('.nogood_count').text(data.cmt_nogood_count);
                                }
                            }
                        },
                        error: function(xhr, status, error) {
                            console.error("AJAX Error:", status, error);
                            alert('요청 처리 중 오류가 발생했습니다.');
                        },
                        complete: function() {
                            btn.removeClass('disabled'); // 버튼 다시 활성화
                        }
                    });
                });
                // --- [추가 끝] 댓글 추천/비추천 기능 ---
                </script>

 

 

 

 

    0 0
    공유 더보기
    페이스북으로 공유 트위터로 공유 카카오톡으로 공유 공유링크 공유
소개 공유하고, 소통하다

빌런은 디스코드, 인스타그램, 페이스북, 카카오톡, 텔레그램 등 다양한 메신저에서 발생하는 범죄, 사기, 보이스피싱, 스캠과 함께 중고 거래, 데이트 폭력, 학교 폭력, 술집 진상, 게임 사기꾼, 나쁜 회사 상사, 일상 속 매너 없는 사람들에 대한 정보를 공유하는 플랫폼입니다. ... 자세히보기


또한, 한국 아이돌, 배우, 해외 유명인, 스포츠 스타, 인플루언서에 대한 팬클럽 게시판도 운영하여, 좋아하는 스타와 소통할 수 있는 공간을 제공합니다. 안전한 커뮤니티에서 우리의 경험을 나누고, 더 나은 사회를 만들어 갑시다. ... 접기

저작권 저작권 저작권 주의사항.

본 사이트의 모든 게시물과 그에 포함된 텍스트, 이미지, 동영상 등 모든 콘텐츠는 본 사이트에서 독자적으로 편집 및 표현 방식을 수정하여 완성된 창작물입니다. 저작권법 및 관련 법령에 따라 보호를 받습니다. 따라서, 본 정보는 사이트 운영자의 명시적인 서면 동의 없이 무단으로 전재, 복사, 배포, 재가공, 또는 어떠한 형태로든 상업적/비상업적으로 활용될 수 없습니다. ... 자세히보기


또한, 게재된 정보는 개인적인 열람 및 참고 이외의 어떠한 용도로도 사용할 수 없습니다. 이를 위반할 경우 관련 법률에 의거하여 민·형사상의 책임을 질 수 있습니다.


본 사이트는 등록자가 게재한 자료의 내용에 대한 정확성, 완전성, 신뢰성을 보증하지 않으며, 해당 정보의 오류나 누락에 대해 어떠한 책임도 지지 않습니다. 또한, 사용자가 본 정보를 신뢰하여 취한 직간접적인 모든 조치나 결과에 대해서도 책임을 부담하지 않습니다. 정보 사용에 따른 모든 위험은 사용자 본인에게 있습니다. ... 접기

    댓글목록

    profile_image
    관리자미니홈 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물  20시간 전 2025-06-06 12:31

    현재 댓글 생성 서비스를 이용할 수 없습니다.

    0 0

    여기에 답글