별빵주기 > 그누보드5 팁자료실

그누보드5 팁자료실

별빵주기 정보

별빵주기

본문

데이터베이스


 
CREATE TABLE `g5_rating_log` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `bo_table` VARCHAR(191) NOT NULL,
  `wr_id` INT NOT NULL,
  `mb_id` VARCHAR(191) NOT NULL,
  `rating` INT NOT NULL,
  `regdate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unq_rating` (`bo_table`, `wr_id`, `mb_id`)
);
 

 

view.skin.php 페이지 원하는위치에 


<?php
// 평균, 총 평가 수, 본인 평가 여부
$sql = "SELECT AVG(rating) AS avg_rating, COUNT(*) AS total FROM g5_rating_log WHERE bo_table = '$bo_table' AND wr_id = '{$view['wr_id']}'";
$row = sql_fetch($sql);
$avg = round($row['avg_rating'], 1);
$total = $row['total'];
$my_rating = 0;
if ($is_member) {
    $mb_id = $member['mb_id'];
    $res2 = sql_fetch("SELECT rating FROM g5_rating_log WHERE bo_table = '$bo_table' AND wr_id = '{$view['wr_id']}' AND mb_id = '$mb_id'");
    $my_rating = isset($res2['rating']) ? (int)$res2['rating'] : 0;
}
?>
<!-- 별점 UI -->
<select class="star_rate" id="star_rating">
    <option value="">선택</option>
    <?php for ($i = 1; $i <= 5; $i++) { ?>
        <option value="<?= $i ?>"><?= $i ?></option>
    <?php } ?>
</select>
<div style="margin-top: 5px;">
    평균 별점: <span id="star_point"><?= $avg ?></span>점 /
    참여자: <span id="star_cnt"><?= $total ?></span>명
</div>
<!-- Bar Rating 플러그인 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-bar-rating@1.2.2/dist/themes/fontawesome-stars-o.css">
<script src="https://cdn.jsdelivr.net/npm/jquery-bar-rating@1.2.2/dist/jquery.barrating.min.js"></script>
<!-- SendAjax 클래스 -->
<script>
function SendAjax() {
    this.url = '';
    this.send = function(params, callback) {
        $.ajax({
            url: this.url,
            type: 'POST',
            data: params.sendData,
            dataType: 'json',
            success: callback,
            error: function() {
                alert("서버 통신 실패");
            }
        });
    }
}
</script>
<!-- Rate 클래스 -->
<script>
var Rate = function(){};
Rate.prototype = {
    insertRate : function(menu_id, content_type, content_base, content_id, point){
        var _this = this;
        var ajax = new SendAjax();
        ajax.url = '/bbs/insertrate.php';
        var input = {
            loading: false,
            sendData: {
                menu_id: menu_id,
                content_type: content_type,
                content_base: content_base,
                content_id: content_id,
                rt_point: point
            }
        };
        ajax.send(input, function(data){
            if (data.response == 'success') {
                _this.showRate(menu_id, content_type, content_base, content_id, data.data['point'], data.data['cnt'], true, true);
            } else {
                alert(data.msg || "에러 발생");
            }
        });
    },
    showRate : function(menu_id, content_type, content_base, id, point, cnt, is_member, already_rated) {
        var _this = this;
        $('.star_rate').barrating('destroy');
        $('.star_rate').barrating({
            theme: 'fontawesome-stars-o',
            initialRating: point,
            readonly: !is_member || already_rated,
            onSelect: function(value, text, event) {
                if (!is_member) {
                    alert("로그인 후 별점을 등록할 수 있습니다.");
                    return false;
                }
                if (already_rated) {
                    alert("이미 평가하셨습니다.");
                    return false;
                }
                if (typeof(event) !== 'undefined') {
                    _this.insertRate(menu_id, content_type, content_base, id, value);
                }
            }
        });
        $("#star_point").text(point);
        $("#star_cnt").text(cnt);
        if (!is_member) {
            $('<div class="star_notice">로그인 후 별점을 등록할 수 있습니다.</div>').insertAfter('.star_rate');
        } else if (already_rated) {
            $('<div class="star_notice">이미 평가하셨습니다.</div>').insertAfter('.star_rate');
        }
    }
};
$(function() {
    var rate = new Rate();
    rate.showRate(
        '<?= $bo_table ?>',
        'board',
        '<?= $bo_table ?>',
        '<?= $view['wr_id'] ?>',
        '<?= $avg ?>',
        '<?= $total ?>',
        <?= $is_member ? 'true' : 'false' ?>,
        <?= $my_rating > 0 ? 'true' : 'false' ?>
    );
});
</script>


bbs 폴더에 아래 파일 생성

insertrate.php


<?php
include_once('../common.php');
header('Content-Type: application/json');
// 로그인 확인
if (!$is_member) {
    echo json_encode(['response' => 'fail', 'msg' => '로그인 후 별점을 등록할 수 있습니다.']);
    exit;
}
$menu_id = $_POST['menu_id'];
$content_id = (int)$_POST['content_id'];
$point = (int)$_POST['rt_point'];
$bo_table = $menu_id;
$mb_id = $member['mb_id'];
// 이미 평가했는지 확인
$row = sql_fetch("SELECT COUNT(*) AS cnt FROM g5_rating_log WHERE bo_table = '$bo_table' AND wr_id = '$content_id' AND mb_id = '$mb_id'");
if ($row['cnt'] > 0) {
    echo json_encode(['response' => 'fail', 'msg' => '이미 평가하셨습니다.']);
    exit;
}
// 저장
sql_query("INSERT INTO g5_rating_log (bo_table, wr_id, mb_id, rating, regdate) VALUES ('$bo_table', '$content_id', '$mb_id', '$point', NOW())");
// 평균 재계산
$row = sql_fetch("SELECT AVG(rating) AS avg, COUNT(*) AS cnt FROM g5_rating_log WHERE bo_table = '$bo_table' AND wr_id = '$content_id'");
$avg = round($row['avg'], 1);
$total = $row['cnt'];
echo json_encode(['response' => 'success', 'data' => ['point' => $avg, 'cnt' => $total]]);
?>
 
추천
3

댓글 4개

전체 2,629 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

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