- 글보기에서 바로 비밀글 변경하는 방법2025년 02월 03일
- TheStorybook
- 작성자
- 2025.02.03.:18
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>
'XE(Rhymix) > 변수 응용' 카테고리의 다른 글
라이믹스 특정 게시판 글 가져오기 (0) 2025.02.03 라이믹스 모든 글 최신글 가져오기 코드 (0) 2025.02.03 새로고침 없는 좋아요 버튼 (0) 2025.02.03 글추천 버튼 (새로고침 됨) (0) 2025.02.03 스크랩(threads) v1 (0) 2025.02.03 다음글이전글이전 글이 없습니다.댓글