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

질문 :

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

 

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

 

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

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

 

 

<action name="procMemberScrapDocument" type="controller" permission="member" />

<action name="procMemberDeleteScrap" type="controller" permission="member" />

 

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


답변 : 

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. 스크랩하기

<a href="#" onclick="doCallModuleAction('member','procMemberScrapDocument','{$document->document_srl}'); return false; "><span>저장</span><span class="cnt">{$scrapped_count}</span></a>

2. 스크랩 취소하기

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

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

<a href="#" onclick="doCallModuleAction('member','procMemberDeleteScrap','{$document->document_srl}'); return false; ">저장취소</a>

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

<script>
    function doDeleteScrap(document_srl) {
       var params = new Array();
       params['document_srl'] = document_srl;
       exec_json('member.procMemberDeleteScrap', params, function() { location.reload(); });
    }
</script>
<a href="#" onclick="doDeleteScrap('{$document->document_srl}'); return false; ">저장취소 json</a>

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

<div class="btn btn-scrap" onclick="unscrap({$document->document_srl});"><i class="folder-full"></i> 저장취소</div>

<div class="btn btn-scrap" onclick="scrap({$document->document_srl});"><i class="folder-line"></i> 저장</div>

@if($is_logged)
<script>
    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})");
          }
       })
    }
</script>
@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)
    <a href="#" onclick="doDeleteScrap('{$document->document_srl}'); return false; ">저장취소</a>
@else
    <a href="#" onclick="doScrap('{$document->document_srl}'); return false; ">저장</a>
@endif
 
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기