first commit 2

This commit is contained in:
hmw1001
2026-06-11 18:47:38 +09:00
parent c768729ce6
commit 6f534e33a6
11095 changed files with 1595758 additions and 0 deletions
@@ -0,0 +1,50 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 리스트 루프 내에서 include 되어야 함 ($list[$i] 사용)
$is_reserved = isset($list[$i]['wr_is_reserved']) && $list[$i]['wr_is_reserved'] == 1;
$status_html = '';
if ($is_reserved) {
$today = G5_TIME_YMDHIS;
$start_date = $list[$i]['wr_reserved_start'];
$end_date = $list[$i]['wr_reserved_end'];
if ($today < $start_date) {
$status_class = 'reserved-waiting';
$status_text = '예약대기';
$status_desc = '시작: '.substr($start_date, 5, 11);
} elseif ($today >= $start_date && $today <= $end_date) {
$status_class = 'reserved-active';
$status_text = '예약진행';
$status_desc = '종료: '.substr($end_date, 5, 11);
} else {
$status_class = 'reserved-expired';
$status_text = '예약종료';
$status_desc = '종료됨';
}
$status_html = '<span class="reservation-badge '.$status_class.'" title="'.$status_desc.'">'.$status_text.'</span>';
} else {
// 즉시 노출 상태
$status_html = '<span class="reservation-badge immediate">즉시노출</span>';
}
echo $status_html;
?>
<style>
.reservation-badge {
display: inline-block;
padding: 2px 6px;
font-size: 11px;
border-radius: 3px;
color: #fff;
line-height: 1.2;
vertical-align: middle;
}
.reservation-badge.immediate { background-color: #555; } /* 즉시노출: 회색 */
.reservation-badge.reserved-waiting { background-color: #f0ad4e; } /* 예약대기: 주황색 */
.reservation-badge.reserved-active { background-color: #5cb85c; } /* 예약진행: 초록색 */
.reservation-badge.reserved-expired { background-color: #d9534f; } /* 예약종료: 빨간색 */
</style>
@@ -0,0 +1,56 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 예약 노출 설정 처리
$wr_is_reserved = isset($_POST['wr_is_reserved']) ? (int)$_POST['wr_is_reserved'] : 0;
$wr_reserved_start = isset($_POST['wr_reserved_start']) ? trim($_POST['wr_reserved_start']) : '';
$wr_reserved_end = isset($_POST['wr_reserved_end']) ? trim($_POST['wr_reserved_end']) : '';
if ($wr_is_reserved == 1) {
if (!$wr_reserved_start || !$wr_reserved_end) {
alert('예약 노출 시작일시와 종료일시를 모두 입력해주세요.');
}
if ($wr_reserved_start > $wr_reserved_end) {
alert('예약 종료일시는 시작일시보다 이후여야 합니다.');
}
// 💡 [핵심 수정] 게시판 설정에 따른 중복 검사
if (isset($board['bo_use_reservation_overlap']) && $board['bo_use_reservation_overlap']) {
$overlap_limit = isset($board['bo_reservation_overlap_count']) ? (int)$board['bo_reservation_overlap_count'] : 0;
// 💡 [변경] 0보다 클 때만 개수 제한 체크 (0이면 무제한 허용)
if ($overlap_limit > 0) {
// 겹치는 게시물 수 조회
$sql = " SELECT count(*) as cnt FROM {$write_table}
WHERE wr_is_comment = 0
AND wr_is_reserved = 1
AND wr_id != '{$wr_id}'
AND (
'{$wr_reserved_start}' <= wr_reserved_end AND '{$wr_reserved_end}' >= wr_reserved_start
) ";
$row = sql_fetch($sql);
// 허용 개수보다 많으면 차단 (현재 등록하려는 글 포함이므로 >= 사용하거나, 이미 등록된 글 수와 비교)
// 이미 등록된 글 수($row['cnt'])가 제한 개수($overlap_limit) 이상이면, 더 이상 등록 불가
if ($row['cnt'] >= $overlap_limit) {
$msg = "선택하신 기간에 예약 가능한 게시물 수({$overlap_limit}개)를 초과했습니다.";
$msg .= "\\n(현재 {$row['cnt']}개 예약됨)";
alert($msg);
}
}
}
} else {
// 예약 미사용 시 날짜 초기화
$wr_reserved_start = '0000-00-00 00:00:00';
$wr_reserved_end = '0000-00-00 00:00:00';
}
// DB 업데이트
$sql = " UPDATE {$write_table}
SET wr_is_reserved = '{$wr_is_reserved}',
wr_reserved_start = '{$wr_reserved_start}',
wr_reserved_end = '{$wr_reserved_end}'
WHERE wr_id = '{$wr_id}' ";
sql_query($sql);
?>
@@ -0,0 +1,21 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
if ($view['wr_is_reserved'] == 1) {
$today = G5_TIME_YMDHIS;
$status_text = '예약 대기';
$status_class = 'reserved';
if ($today >= $view['wr_reserved_start'] && $today <= $view['wr_reserved_end']) {
$status_text = '노출 중';
$status_class = 'active';
} elseif ($today > $view['wr_reserved_end']) {
$status_text = '노출 종료';
$status_class = 'expired';
}
?>
<div class="view_reservation_info">
<span class="status_badge <?php echo $status_class; ?>"><?php echo $status_text; ?></span>
<span class="period"><?php echo $view['wr_reserved_start']; ?> ~ <?php echo $view['wr_reserved_end']; ?></span>
</div>
<?php } ?>
@@ -0,0 +1,60 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// jQuery UI Datepicker 로드 (이미 로드되어 있을 수 있음)
add_stylesheet('<link rel="stylesheet" href="//code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">', 0);
add_javascript('<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>', 0);
?>
<div class="write_div">
<label class="frm_label">노출 방식</label>
<div class="option_group">
<label>
<input type="radio" name="wr_is_reserved" value="0" <?php echo ($write['wr_is_reserved'] != 1) ? 'checked' : ''; ?>>
<span class="custom-radio"></span> 즉시 노출
</label>
<label>
<input type="radio" name="wr_is_reserved" value="1" <?php echo ($write['wr_is_reserved'] == 1) ? 'checked' : ''; ?>>
<span class="custom-radio"></span> 예약 노출
</label>
</div>
</div>
<div id="reservation_fields" class="write_div" style="display: <?php echo ($write['wr_is_reserved'] == 1) ? 'block' : 'none'; ?>;">
<div class="date_picker_group">
<div class="date_item">
<label for="wr_reserved_start" class="frm_label">시작일시</label>
<input type="text" name="wr_reserved_start" value="<?php echo $write['wr_reserved_start']; ?>" id="wr_reserved_start" class="frm_input datepicker" maxlength="19" placeholder="YYYY-MM-DD HH:mm:ss">
</div>
<span class="date_divider">~</span>
<div class="date_item">
<label for="wr_reserved_end" class="frm_label">종료일시</label>
<input type="text" name="wr_reserved_end" value="<?php echo $write['wr_reserved_end']; ?>" id="wr_reserved_end" class="frm_input datepicker" maxlength="19" placeholder="YYYY-MM-DD HH:mm:ss">
</div>
</div>
</div>
<script>
$(function(){
// 라디오 버튼 변경 시 입력 필드 토글
$('input[name="wr_is_reserved"]').change(function(){
if($(this).val() == '1') {
$('#reservation_fields').show();
} else {
$('#reservation_fields').hide();
}
});
// Datepicker 설정 (시간 선택이 필요하다면 datetimepicker 라이브러리 필요, 여기서는 기본 datepicker 사용 후 시간은 수동 입력 가정)
// 실제로는 datetimepicker 플러그인을 사용하는 것이 좋습니다.
$(".datepicker").datepicker({
dateFormat: "yy-mm-dd",
onSelect: function(dateText) {
// 시간까지 입력하도록 유도하거나 기본값 설정
if(this.value.length <= 10) {
this.value = dateText + " 00:00:00";
}
}
});
});
</script>