Extra Form
PHP PHP 7.4
CMS Rhymix 2.0

 

안녕하세요! 다들 안전하게 잘 지내고 계신가요 ㅎㅎ

오랜만에 질문글을 남겨봅니다.

 

현재 사용하고있는 slow 게시판 스킨에서

스크랩 버튼을 클릭해서 스크랩을 했을때 별도의 체크된 마크없이 전/후가 동일한 상태로 나오고있습니다.

스킨단에서 cond에 $is_logged 뿐만아니라 스크랩을 했을때라는 조건을 넣어주면 될거같은데 어떤변수로 넣어봐야할지 질문드립니다. 

 

 

20220404_172103.png

 

{@ // 스크랩 }
  <button class="app-icon-button app-icon-button-gray" cond="$is_logged" onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl})" title="스크랩">
    <ion-icon name="bookmark-outline"></ion-icon>
  </button>

 

읽어주셔서 감사합니다.

  • profile

    직접 해본 건 아니어서 확신까지는 없지만ㅜ

    아래와 같이 해서

     

    {@
        $is_scrapped = 0;
        if ( $is_logged ):
            $args = new stdClass();
            $args->member_srl = $logged_info->member_srl;
            $args->document_srl = $document_srl;
            $is_scrapped = executeQuery('member.getScrapDocument', $args)->data->count;
        endif;
    }

     

    $is_scrapped 또는 $is_scrapped > 0 으로 판별해볼 수 있을 것 같습니다.

  • profile profile
    헉... 이건좀 어렵군요... 어떻게 적용을해봐야할까요..?
  • profile profile
    {@ // 스크랩 안됐을때 }
    <button class="app-icon-button app-icon-button-gray" cond="$is_logged&&is_scrapped>0" onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl})" title="스크랩">
    <ion-icon name="bookmark-outline"></ion-icon>
    </button>
    {@ // 스크랩 됐을때}
    <button class="app-icon-button app-icon-button-gray" cond="$is_logged&&is_scrapped" onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl})" title="스크랩">
    <ion-icon name="bookmark-outline"></ion-icon>
    </button>

    이런식으로 적어도 될까요??
    추가로.. 스크랩취소버튼의경우 onclick도 수정해야될거같은데..어떻게해야할까요 ㅠㅠ
  • profile ?
    _read.html
    상단에
    {@
    $is_scrapped = 0;
    if ( $is_logged ):
    $args = new stdClass();
    $args->member_srl = $logged_info->member_srl;
    $args->document_srl = $document_srl;
    $is_scrapped = executeQuery('member.getScrapDocument', $args)->data->count;
    endif;
    }
    위 코드 넣으시고

    스크랩 부분을
    <!--@if($is_scrapped>0)-->
    스크랩 됐을때
    <!--@else-->
    스크랩 안됐을떄
    <!--@end-->

    이런식으로 넣으시면 될거 같네요
    테스트 해보니 잘 되네요
  • ? profile
    오오 완벽하게 잘됩니다.!
    혹시.. 스크랩이 됐을때 동작하는 onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl}) 에서 스크랩을 취소할때는 어떤 항목을 변경해야하는지도 질문드려도 될까요??
  • profile ?
    밑에
    <script>
    function doDeleteScrap(document_srl) {
    var params = new Array();
    params['document_srl'] = document_srl;
    exec_xml('member', 'procMemberDeleteScrap', params, function() { location.reload(); });
    }
    </script>
    넣으시고
    onclick="doDeleteScrap({$val->document_srl});return false;"
    요골로 바꿔보시겠어요?
  • profile profile
    <!--@if($is_logged)-->
    {@
        $is_scrapped = 0;
        $args = new stdClass();
        $args->member_srl = $logged_info->member_srl;
        $args->document_srl = $document_srl;
        $is_scrapped = executeQuery('member.getScrapDocument', $args)->data->count;
        $scrap_action = ($is_scrapped > 0) ? 'procMemberDeleteScrap' : 'procMemberScrapDocument';
    }
    
    <button class="app-icon-button app-icon-button-gray" onclick="doCallModuleAction('member',$scrap_action,{$document_srl})" title="스크랩">
    <ion-icon name="bookmark-outline"></ion-icon>
    <!--@endif-->

     

    액션을 바꾸는 게 목적이었나보군요.

    그럼 왠지 이런 걸로도 될 것 같은데, 만약 안 된다면 유니짱님 답변처럼 하시면 될 것 같아요.

  • profile profile

    쿼리할 때 $args를 따로 선언할 필요 없이 그냥 배열을 전달해도 됩니다.
    삼항식을 사용하면 결과가 없는 경우 기본값 0으로 처리하는 것까지 한 방에 가능!

    if ($this->user->isMember()):
        $is_scrapped = executeQuery('member.getScrapDocument', [
            'member_srl' => $this->user->member_srl,
            'document_srl' => $document_srl,
        ])->data->count ? 1 : 0;
    endif;

    라이믹스에서 활용할 수 있는 모든 문법을 총동원해 보았습니다.^^

  • ? profile
    아, onclick 안의
    $scrap_action에 중괄호가 있어야 할 것 같네요.

    onclick="doCallModuleAction('member',{$scrap_action},{$document_srl})"
  • profile profile
    @.@
    템플릿 html에서 $this->user로 $logged_info가 호환되는 겁니까?
    배열로 넘기는 방법이 있었다니... 그냥 사실상 한 줄로 끝나버리네요ㄷㄷㄷ
  • profile ?
    앗 그렇군요.
    회원 페이지에 스크랩 삭제 부분 그대로 가져와서 문제가 있었나 보네요ㅜ
  • ? profile
    앗, 모바일에서 쓰다보니 원글님한테 댓글 단다는 게 유니짱님한테 대댓을 달았네요. 정신이 없습니다ㅋㅋㅋㅋ
  • profile ?
    앗ㅋㅋ
    저한테 한말이 아니셨군요ㅋㅋ
  • profile profile
    네, 모든 모듈과 템플릿에서 $this->user를 사용할 수 있습니다. 회원인 경우 $logged_info와 동일한 내용이 들어 있고, 비회원인 경우에도 $logged_info와 달리 isMember(), isAdmin() 등의 메소드를 제공합니다. 이 유저가 회원인가? this user is member? 처럼 무척 직관적인 코드를 작성할 수 있어요.

    https://github.com/rhymix/rhymix/blob/master/common/framework/helpers/sessionhelper.php
  • profile profile
    예전에 만들어진 멋진 클린코드업!입니다.

    깔끔하게 사용할 수 있으니 마구마구 활용하십쇼~
  • profile profile
    좋은 정보 및 가르침 감사드립니다!
  • profile profile
    와, 그 외에도 공부할 게 많네요;;;
    https://github.com/rhymix/rhymix/pull/1332

    일단 부딪치면서 헤매봐야겠습니다ㅡㅜ
  • profile
    이거 애드온으로 만들어진다면 참 좋은 제품이 될것같군요
  • profile

    원하는 기능은 구현되셨나요?

    기록 차원에서 최종 정리하면 이렇게 될 것 같습니다.

     

    <!--@if($this->user->isMember())-->
    {@
        $scrap_action = executeQuery('member.getScrapDocument', [
            'member_srl' => $this->user->member_srl,
            'document_srl' => $document_srl,
        ])->data->count ? 'procMemberDeleteScrap' : 'procMemberScrapDocument';
    }
    
    <button class="app-icon-button app-icon-button-gray" onclick="doCallModuleAction('member',{$scrap_action},{$document_srl})" title="스크랩">
    <ion-icon name="bookmark-outline"></ion-icon>
    <!--@endif-->

     

  • profile profile
    헛 안그래도 시간이 이제나서 지금 도전해보려고했는데 엄청깔끔하게 정리해서 주셨군요 ㅠㅠ
    항상 감사드립니다 바로 시도해보겠습니다!
  • profile profile
    </button> 코드가 빠져 있었네요.
    뭘해도 맨날 이렇게 실수가ㅡㅡ;;;
  • profile profile
    ㅠㅠ 테스트해봤는데 버튼을 눌렀을때 반응이 없네요
  • profile profile
    </button> 이 코드 넣으셨구요?
    스크랩하기가 안 되나요? 스크랩 취소가 안 되나요? 아니면 둘 다 안 되나요?
  • profile profile

    20220405_235033.png

  • profile profile
    엇, 소스에는 onclick 부분이 어떻게 찍혀 있어요?
  • profile profile

    이쪽말씀하시는게 맞으실까요??

    20220405_235452.png

     

    코드는 주신부분에서 button만추가했습니다

     

    20220405_235514.png

  • profile profile
    아, 따옴표가 빠졌었네요ㅜ
    onclick="doCallModuleAction('member','{$scrap_action}',{$document_srl})"
    으로 해보시죠.
  • profile profile
    오오 이제 스크랩등록은 작동이 잘되는데
    등록된 상태에서 스크랩 취소(?) 버튼을 누르게 되면 잘못된 요청입니다가 나오게되네요 ㅠㅠ
  • profile profile
    확인해보니 코어에서 doCallModuleAction을 통한 procMemberDeleteScrap(스크랩 취소)을 지원하지 않고 있었네요.
    https://github.com/rhymix/rhymix/blob/922025ae8ed5de58dd75d1cac20494eb25153f23/modules/member/member.controller.php#L250

    윗 부분에 보이는 ./modules/member/member.controller.php 파일의 250행을 아래와 같이 바꿔줘야 할 것 같습니다.
    $document_srl = (int) (Context::get('document_srl') ?: Context::get('target_srl'));

    코어 살짝 수정해보시고요..
    잘 되는 게 확인되면 이건 깃허브에 이슈로 남겨야겠네요.
  • profile profile
    doCallModuleAction 쓰지 말고 exec_json으로 document_srl 파라미터 넣어서 쓰세요.
    2022년 현재 어떤 자료에서도 doCallModuleAction에 의존할 필요는 없습니다.
  • profile profile

    앗 코어에서의 target_srl 지원은 사전 차단 당한 겁니까ㅜㅜㅜ

    질문글에 답변 달다가 일이 또 커지네요ㅎㅎ

  • profile profile

    네 ㅎㅎ 한 번 봐주면 앞으로 코어에서 제공하는 모든 액션의 모든 변수명이 target_srl로 통일되어 버릴 것 같아서요. 훨씬 강력한 대안을 버려두고 doCallModuleAction을 고집하시면 앞으로는 콘솔에 deprecated 워닝이라도 찍히도록 해야겠네요.

  • profile profile

    저 말고도 서드파티 개발자분들 모두 생각해볼 만한 부분이겠네요.
    "doCallModuleAction보다는 exec_json으로 직접 document_srl이나 comment_srl을 쓰라"
    중요체크!

  • profile

    사용하시는 스킨에서 기존의 문서 스크랩 기능이 새로고침 없이 작동했나요?

    암튼 새로고침이 이뤄진다는 전제에서 여태까지의 논점을 종합하면ㅜ 이렇게 될 것 같습니다.

     

    본문 중 스크랩 부분에

    <!--@if($this->user->isMember())-->
    {@
        $scrap_action = executeQuery('member.getScrapDocument', [
            'member_srl' => $this->user->member_srl,
            'document_srl' => $document_srl,
        ])->data->count ? 'procMemberDeleteScrap' : 'procMemberScrapDocument';
    }
     
    <button class="app-icon-button app-icon-button-gray" onclick="doScrapAction('{$scrap_action}', {$document_srl}); return false;" title="스크랩">
    <ion-icon name="bookmark-outline"></ion-icon>
    </button>
    <!--@endif-->

     

    그리고 본문 말미에

    <!--@if($scrap_action)-->
    <script>
    function doScrapAction(scrap_action, document_srl) {
        var params = {
            document_srl: document_srl
        };
        exec_json('member.' + scrap_action, params, function(ret_obj) {
            if ( ret_obj.message !== 'success' ) {
                alert(ret_obj.message);
            }
            location.reload();
        });
    }
    </script>
    <!--@endif-->

     

  • profile profile
    헐.. 점점 업데이트 되는군요.
    기존에는 스크랩할때는 새로고침하면서 적용됐었습니다!
    말씀해주신 코어수정후에는 스크랩 취소도 잘되는 상황입니다.
    다만, 스크랩취소시 메시지가 나오지않는데 이건 본문말미에 적어주신 스크립트쪽에 alert 메시지로 넣으면 되는걸까요??
  • profile profile

    스크랩 취소는 반환되는 변수가 없나보네요.
    그동안 스크랩 취소 기능이 코어에서 큰 관심을 못 받아서 그런가봐요.

    scrap_action에 담긴 값을 기준으로 구분하면 될 것 같아요.
    if (scrap_action==='procMemberDeleteScrap') {
        alert('스크랩을 취소했습니다');
    } else {
        if ( ret_obj.message !== 'success' ) {
            alert(ret_obj.message);
        }
    }

  • profile profile
    완벽히 잘 작동합니다!!
    바쁘신 와중에도 시간들여서 이것저것 확인해주시고 정말감사드립니다 ㅠㅠ