글보기에서 바로 비밀글 변경하는 방법
document 모듈에 이런 쿼리문이 있더군요.
modules/document/queries/updateDocumentsSecret.xml
<query id="updateDocumentsSecret" action="update"> <tables> <table name="documents" /> </tables> <columns> <column name="is_secret" var="is_secret" notnull="notnull" /> </columns> <conditions> <condition operation="in" column="document_srl" var="document_srl" filter="number" notnull="notnull" /> </conditions> </query>
이런 쿼리문이 있길래, 이걸 게시판 글보기에서 바로 실행할 수 있는 방법 없나요?
글보기 스킨에서 이렇게 하면
<form action="/" method="post" onsubmit="return procFilter(this, window.update)"> <input type="hidden" name="module" value="document" /> <input type="hidden" name="act" value="updateDocumentsSecret" /> <input type="hidden" name="document_srl" value="{$document_srl}" /> <button class="btn" type="submit">비밀글로 업데이트</button> </form>
실행해보면...
잘못된 요청입니다.
ERR_ACT_NOT_FOUND
classes/module/ModuleHandler.class.php:491
이렇게 나오네요.
updateDocumentsSecret 검색해보니 쿼리문만 있고 실제 콘트롤러나 뷰 등에서 사용되는 건 없는거 같군요..
컬럼명도 is_secret인걸 보니 예전 xe, 시절 활용되던 쿼리문 이었군요
view.blade.php
@if($oDocument->isEditable())
<form action="./" method="post" onsubmit="return procFilter(this, window.update)" id="status">
<input type="hidden" name="document_srl" value="{$document_srl}" />
@if(!$oDocument->isSecret())
<input type="hidden" name="status" value="SECRET">
<button type="submit">스레드 잠금 <i class="lock"></i></button>
@else
<input type="hidden" name="status" value="PUBLIC">
<button type="submit">잠금 해제하기 <i class="unlock"></i></button>
@endif
</form>
@php
// 비밀글 전환 처리
if ($_POST['status'] == 'SECRET' && isset($_POST['document_srl'])) {
$obj = new stdClass();
$obj->document_srl = $_POST['document_srl'];
$obj->secret = 'SECRET'; // status를 'SECRET'으로 설정
$query_path = $module_info->module."/skins/".$module_info->skin; // 쿼리 경로
$output = executeQuery($query_path.'.updateDocumentsSecret', $obj); // 쿼리 실행
}
// 공개글 전환 처리
if ($_POST['status'] == 'PUBLIC' && isset($_POST['document_srl'])) {
$obj = new stdClass();
$obj->document_srl = $_POST['document_srl'];
$obj->secret = 'PUBLIC'; // status를 'PUBLIC'으로 설정
$query_path = $module_info->module."/skins/".$module_info->skin; // 쿼리 경로
$output = executeQuery($query_path.'.updateDocumentsSecret', $obj); // 쿼리 실행
// 페이지 리다이렉트 (새로고침 효과)
}
@endphp
<script>
// 폼 제출 후 페이지 새로 고침
document.querySelector('form#status').addEventListener('submit', function(e) {
e.preventDefault(); // 기본 폼 제출 방지
var form = this;
// 폼을 AJAX로 제출 (또는 정상 제출 후 페이지 새로 고침)
fetch(form.action, {
method: 'POST',
body: new FormData(form)
}).then(function(response) {
// 성공적으로 제출되면 페이지 새로 고침
window.location.reload();
}).catch(function(error) {
console.error('Error:', error);
});
});
</script>
@endif
list.blade.php
@if($document->isEditable())
<form action="./" method="post" class="toggle-secret-form" data-documentsrl="{$document->document_srl}">
<input type="hidden" name="document_srl" value="{$document->document_srl}" />
@if(!$document->isSecret())
<input type="hidden" name="status" value="SECRET">
<button type="submit">스레드 잠금 <i class="lock"></i></button>
@else
<input type="hidden" name="status" value="PUBLIC">
<button type="submit">잠금 해제하기 <i class="unlock"></i></button>
@endif
<input type="hidden" name="xe_validator_id" value="/modules/board/skins/eb_threads/1">
</form>
@php
// 비밀글 전환 처리
if ($_POST['status'] == 'SECRET' && isset($_POST['document_srl'])) {
$obj = new stdClass();
$obj->document_srl = $_POST['document_srl'];
$obj->secret = 'SECRET'; // status를 'SECRET'으로 설정
$query_path = $module_info->module."/skins/".$module_info->skin; // 쿼리 경로
$output = executeQuery($query_path.'.updateDocumentsSecret', $obj); // 쿼리 실행
}
// 공개글 전환 처리
if ($_POST['status'] == 'PUBLIC' && isset($_POST['document_srl'])) {
$obj = new stdClass();
$obj->document_srl = $_POST['document_srl'];
$obj->secret = 'PUBLIC'; // status를 'PUBLIC'으로 설정
$query_path = $module_info->module."/skins/".$module_info->skin; // 쿼리 경로
$output = executeQuery($query_path.'.updateDocumentsSecret', $obj); // 쿼리 실행
// 페이지 리다이렉트 (새로고침 효과)
}
@endphp
@endif
script.js
document.querySelectorAll(".toggle-secret-form").forEach(function(form) {
console.log('폼 감지됨'); // ✅ 폼이 감지되었는지 확인
form.addEventListener("submit", function(e) {
console.log('비밀글 처리 이벤트 발생'); // ✅ 이벤트 바인딩 확인
e.preventDefault(); // 기본 폼 제출 방지
let formData = new FormData(this);
let documentSrl = this.dataset.documentsrl;
// CSRF 토큰 추가 (필요하면 설정)
// meta 태그에서 CSRF 토큰을 가져옴
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
// CSRF 토큰이 있을 때만 실행
if (csrfToken) {
// 이후 fetch 요청 시 CSRF 토큰을 포함
formData.append("xe_validator_id", csrfToken);
console.error(csrfToken);
} else {
console.error("CSRF 토큰이 없습니다.");
}
fetch(form.action, {
method: "POST",
body: formData,
credentials: "include" // 인증 쿠키 포함 (중요)
})
.then(function(response) { // ✅ 올바른 문법
window.location.reload(); // 페이지 새로고침
})
.catch(error => console.error("Error:", error));
});
});
xml
<query id="updateDocumentsSecret" action="update">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="status" var="secret" notnull="notnull" /> <!-- status 컬럼을 SECRET으로 설정 -->
</columns>
<conditions>
<condition operation="in" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
</conditions>
</query>