Q&A

댓글 14

  • 2025.01.22 00:39 #1855922
    로그인 여부 체크해서 넘길수 있도록
    자체 함수를 만들어서 달 수 밖에 없을려나요
  • 2025.01.22 01:02 #1855927
    procDocumentVoteUp 을 ajax 로 호출한경우 response 를 받을때 처리해주면 되고, 기본 게시판인 경우 doCallModuleAction 을 자체 로그인여부 판단하는 메서드로 감싸서 실행하면 될것 같습니다.

    checkLoginBefore {
    if 로그인 안했다면
    로그인이 필요합니다 -> 로그인화면으로 이동합니다.

    doCallModuleAction 을 실행...
    }
  • 2025.01.22 01:16 #1855932

    1. 현재 사용한 코드입니다.

    1) php
    @if($document->getMyVote())
    <a href="javascript:;" onclick="do_doc_VoteSubmit('document','procDocumentVoteUpCancel','{$document->document_srl}'); return false;">좋아요취소 <span class="cnt">{$document->get('voted_count') ? $document->get('voted_count') : ''}</span></a>
    @else
    <a href="javascript:;" onclick="do_doc_VoteSubmit('document','procDocumentVoteUp','{$document->document_srl}'); return false;">좋아요 <span class="cnt">{$document->get('voted_count') ? $document->get('voted_count') : ''}</span></a>
    @endif

    2) js
    function do_doc_VoteSubmit(module, action, target_srl) {
    saveScrollPosition(); // 스크롤 위치 저장
    shouldRestoreScroll = true; // 스크롤 복원을 활성화
    var params = { 'target_srl': target_srl, 'cur_mid': current_mid };
    exec_json(module + '.' + action, params, function () {
    location.reload();
    });
    }

    2. 조언해주신대로 js를 이렇게 수정해봤습니다.
    function do_doc_VoteSubmit(module, action, target_srl) {
    saveScrollPosition(); // 스크롤 위치 저장
    shouldRestoreScroll = true; // 스크롤 복원을 활성화

    const params = { target_srl: target_srl, cur_mid: current_mid };

    // Ajax 요청
    exec_json(module + '.' + action, params, function (response) {
    if (response.status === 'error') {
    // 로그인이 필요한 경우 처리
    alert(response.message);
    if (response.redirect_url) {
    window.location.href = response.redirect_url; // 로그인 페이지로 이동
    }
    } else if (response.status === 'success') {
    // 성공 처리
    alert(response.message);
    location.reload(); // 페이지 리로드
    }
    });
    }

    이렇게 해도 response 답이 없고 그대로 '로그인이 필요합니다' 라는 메세지만 뜨고 말아버리네요.
    혹시 어디를 찾아봐야할까요.

     

    아마 위 코드는 document.controller.php에서

    function procDocumentVoteUp() 이 함수를 먼저 타서 그런거 같은데요.

  • 2025.01.22 01:23 #1855935
    if (response.status === 'error') {
    alert(response.message); //
    window.location.href = '/login'; //이동할 주소
    }
    테스트 해본건 아닌데 이렇게 해보시면 될듯합니다.

    if (response.redirect_url) {
    window.location.href = response.redirect_url; // 로그인 페이지로 이동
    } 이런부분은 필요없을듯 합니다.
  • 2025.01.22 01:26 #1855939
    response에 대한 응답 자체가 없이 바로 '로그인이 필요합니다'만 계속 뜨더군요.
    아마도 procDocumentVoteUp() 이 함수에 로그인 체크 부분이 먼저 걸러져서 그럴거 같아요. ㅠ
  • 2025.01.22 01:31 #1855942
    테스트 해보고 답변드리겠습니다.
  • 2025.01.22 01:44 #1855963
    exec_json의 3번째 파라미터는 success 콜백 함수입니다.
    서버에서 에러메시지를 반환하는 상황은 4번째 파라미터인 error 콜백함수로 처리해야 합니다.
    error 콜백함수를 지정하지 않으면 그냥 alert하는 것이 기본값입니다.
    이 때 success 콜백함수는 호출되지 않으므로, 그 함수 안에서 뭔 짓을 해도 소용없어요.
  • 2025.01.22 01:59 #1855975
    감사합니다. 코드를 좀 깔끔하게 적어야 하는데 대충 가져와서 하다보니 실수했네요.

    function do_doc_VoteSubmit(module, action, target_srl) {
    saveScrollPosition(); // 스크롤 위치 저장
    shouldRestoreScroll = true; // 스크롤 복원을 활성화

    const params = { target_srl: target_srl, cur_mid: current_mid };

    // Ajax 요청
    exec_json(
    module + '.' + action,
    params,
    function () {
    location.reload(); // 페이지 리로드
    },
    function (response) {
    // console.log(response)
    window.location.href = '/login';
    }
    );
    }

    네번째 인자에 이렇게 적어줬는데 '로그인이 필요합니다' alert창은 항상 뜨는데 안뜨게 하는 방법은 없을까요?
    로그인이 필요합니다 라는 경고창이 뜬 후에 이동이 됩니다.
  • 2025.01.22 02:02 #1855978

    네번째 인자로 넘기신 함수에서 리다이렉트 후 return false; 해보세요.

    브라우저에서 실행 순서를 멋대로 최적화하는 건지,

    리다이렉트 명령을 내린 후에도 코드가 계속 실행되더라구요;;;

  • 2025.01.22 02:11 #1855989
    const mid = window.location.pathname;
    window.location.href = mid + '/login';
    return false; // 기본 alert 방지

    잘됩니다~~~~
  • 2025.01.22 01:40 #1855954
    exec_json 은 아니지만 예전에 작업한 ajax 로 procDocumentVote 를 호출한 부분을 수정하여 테스트한 결과
    if (response.error) {
    window.location.href = '/login';
    return;
    }
    이 부분이 작동됩니다.
  • 2025.01.22 01:40 #1855950

    로그인 여부에 따라 스킨 소스에서 미리 거르는 방법도 있을 것 같습니다.

    @auth
      @if($document->getMyVote())
        좋아요취소
      @else
        좋아요
      @endif
    @endauth


    @guest
      <a href="로그인화면">좋아요</a>
    @endguest

  • 2025.01.22 01:43 #1855959
    이런 기진꼼수? 더 깔끔하네요 ㅎㅎ
  • 2025.01.22 01:45 #1855967
    단, 페이지 로딩 후 추천을 클릭하기 전 다른 창에서 로그인이 풀렸다면? ㅎㅎ