XE(Rhymix)/변수 응용

글보기에서 바로 비밀글 변경하는 방법

TheStorybook 2025. 2. 3. 04: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>