제목 : 스크랩 삭제 잘못된 요청 문의
질문 :
이미 스크랩된 게시글의 스크랩 버튼을 스크랩 삭제로 제공해주려고 하는데 잘못된 요청이 반환이 됩니다.
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