스레드
이온디

제목 : 스크랩 삭제 잘못된 요청 문의

질문 :

이미 스크랩된 게시글의 스크랩 버튼을 스크랩 삭제로 제공해주려고 하는데 잘못된 요청이 반환이 됩니다.

javascript:doCallModuleAction('member','procMemberDeleteScrap',{$document_srl})

위와 같이 스크랩 할때와 비슷하지만 act만 procMemberDeleteScrap 으로 했는데 이건 모듈에서 허용을 하지 않나요?

스크랩은 허용을 하고 삭제를 안한건지 ..... 아니면 제가 잘못사용하거나 부족한 인수가 있는건지..

모듈에는 이렇게 등록되어 있어 사용 가능해 보이긴 합니다.


답변 :

https://github.com/rhymix/rhymix/blob/98bbe021548304d7e86994a5c34e0d481ac92801/common/js/common.js#L722-L732
doCallModuleAction은 기본적으로 대상이 되는 srl을 target_srl로 넘겨줍니다.

https://github.com/rhymix/rhymix/blob/a6ace52c9e25047f966eb83253526215936029b1/modules/member/skins/default/js/member.js#L131-L135
하지만 스크랩 취소 액션은 document_srl 값으로 srl이 넘기도록 되어 있으므로 동작하지 않습니다. 위 코드는 멤버 스킨의 스크랩 취소 액션이니 참고하셔서 추가하시면 될것 같습니다.

p.s.) doCallModuleAction이라고 되어 있으니 모든 act에 사용 가능해 보이지만 실제로는 exec_xml을 특정 형태로 하는 것에 불과합니다. 라이믹스는 이마저 내부적으로는 json으로 하므로 왠만한 동작은 exec_json을 직접 사용하시는게 나으실겁니다.



1. 스크랩하기

저장{$scrapped_count}

2. 스크랩 취소하기

1번에서와 같이 하면 안됨.

1) 잘못된 스크랩 취소하기의 예

저장취소

2) 올바르게 동작되는 스크랩 취소하기의 예

    function doDeleteScrap(document_srl) {
       var params = new Array();
       params['document_srl'] = document_srl;
       exec_json('member.procMemberDeleteScrap', params, function() { location.reload(); });
    }

저장취소 json

3. 예전에 사용한 스크랩/취소하기 코드 (새로고침을 해야 적용된 것을 확인 가능하다)

저장취소
저장
@if($is_logged)

    function scrap(document_srl){
       var params = new Array();
       params['document_srl'] = document_srl;
       exec_json('member.procMemberScrapDocument', params);
       $.ajax({
          success : function(data) {
             var icon = $('i.folder-line');
             icon.attr("class","folder-full");
             var btn = $(".btn-scrap");
             btn.attr("onclick","unscrap({$document_srl})");
          }
       });
    }
    function unscrap(document_srl){
       var params = new Array();
       params['document_srl'] = document_srl;
       exec_json('member.procMemberDeleteScrap', params);
       $.ajax({
          success : function(){
             var icon = $("i.folder-full");
             icon.attr("class","folder-line");
             var btn = $(".btn-scrap");
             btn.attr("onclick","scrap({$document_srl})");
          }
       })
    }

@endif

4. 2번을 정리

function doDeleteScrap(document_srl) {
    var params = new Array();
    params['document_srl'] = document_srl;
    exec_json('member.procMemberDeleteScrap', params, function() { location.reload(); });
}
function doScrap(document_srl)
{
    var params = [];
    params.document_srl = document_srl;
    exec_json('member.procMemberScrapDocument', params, function() { location.reload(); });
}


@php
$oDB = DB::getInstance();

// 스크랩 카운트를 가져오는 쿼리 실행 => $scrap_count
$query = 'SELECT count(*) AS count FROM member_scrap WHERE document_srl = ?';
$stmt = $oDB->query($query, $document->document_srl);
$result = $stmt->fetchAll();
$scrapped_count = $result[0]->count;

// 스크랩 회원 리스트를 가져오는 쿼리 실행 => $scrap_member_list
$member_columns = preg_filter('/^/', 'member.', ['member_srl', 'user_id', 'email_address', 'phone_number', 'user_name', 'nick_name', 'extra_vars']);
$query = 'SELECT '. implode(',', $member_columns) .' FROM member_scrap LEFT JOIN member ON member_scrap.member_srl = member.member_srl WHERE member_scrap.document_srl = ?';
$stmt = $oDB->query($query, $document->document_srl);
$result = $stmt->fetchAll();
$scrap_member_list = $result;
@endphp
@if($scrapped_count > 0)
    저장취소
@else
    저장
@endif
0 좋아요 0 답글 250 조회