질문/조언질답게시판
Extra Form
PHP PHP 8.1
CMS Rhymix 2.x

댓글 작성시 jquery를 통해 버튼을 클릭하도록 구현하였는데요

(예: 댓글 버튼 클릭 시 $(".글 본문의 추천버튼").click(); 실행)

jquery click을 통해 추천 버튼을 클릭하도록 구현하였습니다.

 

그런데 이상한점이 

마우스로 클릭했을때는 : 추천 후에 $oDocument->getMyVote() 을 통해서 추천여부를 확인할수있는데

jquery click을 통해 클릭했을때는 : 댓글 작성을 통해 추천할 당시에는 마우스로 클릭한것과 동일한 스킨 효과, 추천 갯수 증가의 결과를 가져오지만 

새로고침 이후에는 $oDocument->getMyVote() 을 통해 추천여부를 확인할수가 없습니다(null값 반환)

 

이부분은 혹시 제가 jquery를 잘못 사용해서 그런걸까요?

 

스킨의 추천버튼 코드는 다음과 같습니다.

 

<button class="app-article-vote__up"|cond="$oDocument->getMyVote() !== 1" class="app-article-vote__up active"|cond="$oDocument->getMyVote() == 1" data-type="up" onclick="appArticleVote(this)">

  • profile
    appArticleVote 가 어떻게 실행되는지 해당 코드를 봐야 알 수 있습니다.

    이 부분은 appArticleVote 를 만드신 제작자분이 더 잘아실거같네요. 해당 자료 유료자룡니 것 같으니 해당 개발자분께 문의드려보시는게 어떨까요?
  • profile profile
    아하 코어의 AJAX 부분이나 제 코드가 문제가 아니라 구현된 함수 자체가 그럴수도 있겠군요
    감사합니다!
  • profile profile
    애초 다른 방식으로 구현되는 항목이 있는 부분에서 같이 수정을 하셔야 하는데 이팁 저팁 아무거나 보고 적용하신게 아닌가 싶네요..ㅠ 그러면 오히려 잘되던 기능도 망가집니다..ㅠㅠ
  • profile profile

    {JS 코드 비공개 처리 by 람보}

     

    추천을 진행하는 AJAX 코드는 다음과 같습니다.

    JQUERY click이 마우스 클릭이랑 다른 점은 도저히 제실력으로는 파악이 어렵네요 ㅠㅠ

    혹시  라이믹스 CSRF 토큰은 사람이 클릭하는것과 스크립트가 클릭하는것을 구분하나요?

  • profile profile

    1. 실제로 어떤 요청이 발생하는지 + 어떤 응답이 돌아오는지 개발자도구로 확인해 보세요.
    2. DB에 추천내역이 기록되는지 확인해 보세요.
    3. XE든 라이믹스든 그냥 exec_json() 하면 되는데 뭐하러 $.ajax를 힘들게 설정해서 쓰고 있는지 모르겠네요. 코드도 지저분하고... 원본 스킨을 제작자분도 js는 그냥 주먹구구식으로 짜신 것 같습니다.

  • profile profile

    캡처.PNG

    votedlog 의 DB값을 확인해보면

    jquery를 통해 click 이벤트를 발생시켜도 DB에는 잘 반영이 되는것을 확인했습니다!(4 = 제 관리자 계정의 srl)

     

    이상하네요... exec_json()등을 사용하지 않아도 어쨋거나 DB에 기록이 되면 $oDocument->getMyVote() 을 통해서 내가 추천했는지 확인할 수 있어야 하는데 $oDocument->getMyVote() 가 null 값을 반환합니다. ㅠㅠ

  • profile profile
    그냥 추천을 클릭하면 getMyVote가 정상 작동하나요? getMyVote 쪽의 버그일 수도 있어서요...
  • profile profile

    네! 사람이 클릭을 하면 정상 작동합니다.
    그런데 jquery를 통해 버튼을 클릭하면, ajax를 통해 추천수는 올라가지만
    나중에 새로고침해보면 추천수는 올라가 있는 반면에 $oDocument->getMyVote() 가 null을 반환하는 상황입니다.

     

    혹시나 몰라서 Difference between .click() and actually clicking a button? (javascript/jQuery) - Stack Overflow 

    을 보고 사람이 클릭하는것처럼 흉내를 내 보아도 동일한 상황이 반복되네요

  • profile profile
    "ajax를 통해 추천수는 올라가지만" 이라는게 그냥 숫자만 올려주고 실제 서버에서 요청을 안했을 수 있습니다.

    그 스킨을 저도 써보고 코드를 봐왓기에 잘 알아요.

    그리고 이렇게 공개적으로 판매가 유지보수 되는 상황에서 코드를 올리는것은 그 분의 저작권 침해 및 라이선스 약관 위반의 위험이 있을 수 있습니다;
  • profile profile
    아아.. 제가 그 부분을 인지를 못했네요 ㅠㅠ
    제 대댓글을 이제라도 수정하고 싶은데 이미 답글이...
  • profile profile
    DB에 추천내역이 기록된다는 것을 보면 서버에 요청은 제대로 한 것 같습니다...
  • profile profile
    근데 이상하네요 $oDocument->getMyVote() 이 함수처리부분을 직접 디버깅 해봐야알것 같네요..
  • profile profile

      print_r($oDocument->getMyVote()); 을 해보니

     

    사람이 직접 클릭한 글에서는 1을 반환하고

     

    캡처1.PNG

    ajax click을 통해 추천한 글에서는 아무런 값을 반환하지 않습니다.

     

    캡처2.PNG

     

    코어에서 document.model.php 의 getMyVote 코드를 보면

     

    function getMyVote()
        {
            if(!$this->isExists())
            {
                return false;
            }

            if(isset($_SESSION['voted_document'][$this->document_srl]))
            {
                return $_SESSION['voted_document'][$this->document_srl];
            }
            
            $logged_info = Context::get('logged_info');
            if(!$logged_info->member_srl)
            {
                $module_info = ModuleModel::getModuleInfoByModuleSrl($this->get('module_srl'));
                if($module_info->non_login_vote !== 'Y')
                {
                    return false;
                }
            }

            $args = new stdClass;
            if($logged_info->member_srl)
            {
                $args->member_srl = $logged_info->member_srl;
            }
            else
            {
                $args->ipaddress = \RX_CLIENT_IP;
            }
            $args->document_srl = $this->document_srl;
            $output = executeQuery('document.getDocumentVotedLog', $args);
            if(isset($output->data) && $output->data->point)
            {
                return $_SESSION['voted_document'][$this->document_srl] = $output->data->point;
            }
            return $_SESSION['voted_document'][$this->document_srl] = false;
        }

     

    인데 ajax를 사용한 경우에는 끝까지 아무런 조건을 만족하지 않아 false를 반환했기 때문일까요?!

     

     

  • profile profile

    https://github.com/rhymix/rhymix/blob/master/modules/document/document.item.php#L496 이 줄의 윗줄에 var_dump('1'); exit();

    https://github.com/rhymix/rhymix/blob/master/modules/document/document.item.php#L522 이 줄의 윗줄에 var_dump('2'); exit();

    https://github.com/rhymix/rhymix/blob/master/modules/document/document.item.php#L524 이 줄의 윗줄에 var_dump('3'); exit();


    으로 햇을때 백지에 숫자가 어떤게 뜨는지 알아봐보세요.

    아 이러면 안되겠다 잠시만요

     

     

     

     

  • profile profile
    사람이 직접 클릭한 글
    ajax click 이 차이가 뭐예요?

    어떻게 구분해야하는건가요?
  • profile profile
    아 넵 사이트에 적용해보니까 그냥 레이아웃만 꺠지는것 같습니다
  • profile profile
    해당 부분에 대해서 확인할수 있는 사이트 주소 및 시나리오를 쪽지로 보내드렸습니다!
  • profile profile
    추천하는 과정에서 세션값을 정상적으로 입력하는지 봐보세요.
  • profile profile
    혹시 해당 세션값을 제가 확인하거나 스킨단에서 호출할수있는 방법이 있을까요?!
  • profile profile

    세션은 서버와 클라이언트간의 백엔드에서 통신하는 장치입니다.

    님이 구현한 기능에서 자동클릭화 시키는 과정에서 브라우저의 세션정보없이 그냥 서버에 호출되엇을지도 모르겠지요. 서버에서 직접 클릭하는 방식으로 했으니까요..

    실제 디비에 들어가서 아이피정보를 보거나 해당 세션값이 어디세션을 통신하는지 그런것들을 면밀히 봐보세요.

     

    그리고 실제 파일이 변경되었을때 이미지서버에 있는 js파일들도 다 수정되는게 맞죠?

  • profile profile

    function 댓글 등록 버튼 클릭시 실행하는 함수 {
        var str = document.getElementById("temp-{$oDocument->document_srl}").value;
        if(str.includes("추천문구"))    {
            $(".추천버튼").click(); 
        } else if(str.includes("비추천문구")){
            $(".비추천버튼").click(); 
        }

     

    아까 오전에 

    https://xetown.com/questions/1591549 에서 프론트 단에서 JS로 구현하시라고 답변을 주셔서

    단순히 댓글 작성 스킨에 위 스크립트만 삽입했었긴 합니다 ㅠ_ㅠ

     

    밤늦게 도와주셔서 감사합니다! 추가적으로 확인해보겠습니다

  • profile
    새로 하나 발견했습니다.

    직접 마우스를 통해 추천 버튼을 클릭했다가 다시 클릭해서 취소한 상태에서, jquery.click 을 통해 버튼을 클릭하면 그때는 정상적으로 $oDocument->getMyVote() 값이 반환됩니다. 아무런 문제가 없네요.

    제 실력으로는 여기까지인걸로... ㅠㅠ