확정버튼 클릭시 시간을 여분필드에 저장하고 싶습니다.
본문
뷰화면에서 예를들면 확정버튼 클릭시 여분필드에 버튼클릭 시간을 저장하고 싶습니다.
그리고 리스트화면에서 확정버튼을 클릭하기전에는 검토중이라는 글자가 표시되고 확정버튼을 클릭했으면
확정이라는 글자를 표시하고 싶습니다.
뷰화면에서 확정버튼은 비회원이 클릭한후 수정이 안되어야 하고 관리자는 확정을 취소할 수 있게 할 수 있는 방법 알려주세요.
의뢰게시판에 올렸는데 리빌더로 스킨을 수정중이라 어렵겠다네요.
답변 3
뷰와 리스트 화면에서 데이터베이스 여분 필드로 버튼 클릭 시간을 저장하고,
상태에 따라 텍스트를 표시하며, 권한에 따라 비회원은 수정 불가,
관리자는 확정 취소가 가능하도록 AJAX와 PHP API 기반으로 구현하시기 바랍니다.
구현 방안 - - -
1. 데이터베이스 설계
g5_write_table에 두 개의 필드를 추가하여 상태와 시간을 관리합니다.
wr_1: 확정 시간 (DATETIME 형식)
wr_2: 상태 관리 (ENUM('pending', 'confirmed'))
ALTER TABLE g5_write_table
ADD COLUMN wr_1 DATETIME DEFAULT NULL,
ADD COLUMN wr_2 ENUM('pending', 'confirmed') DEFAULT 'pending';
2. AJAX API 파일 생성
/bbs/confirm.php 파일을 생성하여, 클라이언트에서 서버로 요청을 처리합니다.
confirm.php
<?php
include_once('./_common.php');
// 입력 데이터 처리
$input = json_decode(file_get_contents('php://input'), true);
$id = $input['id'];
$action = $input['action'];
if (!$id || !$action) {
echo json_encode(['success' => false, 'error' => 'Invalid input']);
exit;
}
// 확정 처리
if ($action === 'confirm') {
if ($is_guest) { // 비회원만 확정 가능
$time = date('Y-m-d H:i:s');
$sql = "UPDATE g5_write_table SET wr_1 = '$time', wr_2 = 'confirmed' WHERE wr_id = '$id'";
if (sql_query($sql)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'error' => 'Database update failed']);
}
} else {
echo json_encode(['success' => false, 'error' => 'Unauthorized']);
}
}
// 확정 취소 처리
elseif ($action === 'cancel') {
if ($is_admin) { // 관리자만 취소 가능
$sql = "UPDATE g5_write_table SET wr_1 = NULL, wr_2 = 'pending' WHERE wr_id = '$id'";
if (sql_query($sql)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'error' => 'Database update failed']);
}
} else {
echo json_encode(['success' => false, 'error' => 'Unauthorized']);
}
}
?>
3. 프론트엔드 (JavaScript)
뷰 화면에서 버튼 클릭 시 AJAX 요청으로 데이터를 서버로 전송하고, 성공 시 페이지를 갱신합니다.
document.addEventListener('click', async (e) => {
if (e.target.classList.contains('confirmButton') || e.target.classList.contains('cancelButton')) {
const action = e.target.classList.contains('confirmButton') ? 'confirm' : 'cancel';
const postId = e.target.dataset.id;
const response = await fetch('/bbs/confirm.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: postId, action }),
});
const result = await response.json();
if (result.success) {
alert(action === 'confirm' ? '확정되었습니다.' : '확정이 취소되었습니다.');
location.reload();
} else {
alert('오류: ' + result.error);
}
}
});
4. UI 최소 수정
뷰 화면 (view.skin.php)
리빌더 스킨을 직접 수정하지 않고도 다음과 같이 상태에 따른 버튼을 조건부로 렌더링.
<?php if ($view['wr_2'] === 'confirmed') { ?>
<button disabled>확정 완료</button>
<?php if ($is_admin) { ?>
<button class="cancelButton" data-id="<?= $view['wr_id'] ?>">확정 취소</button>
<?php } ?>
<?php } else { ?>
<?php if ($is_guest) { ?>
<button class="confirmButton" data-id="<?= $view['wr_id'] ?>">확정</button>
<?php } ?>
<?php } ?>
리스트 화면 (list.skin.php)
리스트 상태를 동적으로 표시합니다.
<?php foreach ($list as $row) { ?>
<span><?= $row['wr_2'] === 'confirmed' ? '확정' : '검토 중' ?></span>
<?php } ?>
5. 리빌더 환경 고려
리빌더의 스킨 수정이 어렵다면, /bbs/confirm.php와 JavaScript 파일만 추가하여
기존 스킨 구조를 유지하면서 요구사항을 충족할 수 있음.
UI 변경을 최소화, 서버 로직과 클라이언트 로직을 분리하여 리빌더와의 충돌 가능성을 줄임.
6. 보안 강화
*CSRF 방어: 서버에서 CSRF 토큰을 확인하여 요청의 무결성을 보장.
프론트엔드에서 <meta> 태그로 CSRF 토큰을 포함.
*권한 검증: 비회원만 확정 가능, 관리자는 취소 가능.
*SQL 인젝션 방지: 모든 입력값을 검증하고 필터링.
ajax 로 여분필드에 현재시간과 해당 글의 데이터를 변경 할 수 있습니다.
리빌더라고 안될수가 없는데 이상하네요.. 별도 파일하나 만들면되는데...
10만원 미만으로 작업가능합니다.
관심있으시면 제 아이디 클릭하셔서 자기소개에 전화번호 있으니 해당 번호로 연락주세요.
말씀하신 기능에 대해서는 리빌더라고 해서 안될 부분은 없을거로 보여집니다.
위 부분에 대해 대응이 필요하시다면 쪽지로 문의 주시면 체크후 대응이 가능하리라 보입니다.