exec_json을 튕겨내는 이유가 궁금합니다
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.4 |
문제 페이지 주소 | 비공개 (작성 후 5일 경과) |
새로고침 없는 댓글 삭제를 시도 중입니다.
예전에는 잘 했었는데ㅜㅜ
이번에는 exec_json을 실행시키면 '잘못된 요청입니다'라는 경고문구가 뜨고 스크립트 명령을 튕겨냅니다.
function delComment(comment_srl) {
var message = confirm('댓글을 정말로 삭제하시겠습니까?');
if ( message ) {
exec_json('board.procBoardDeleteComment', {comment_srl: comment_srl}, function(r) {
console.log(r);
location.reload();
});
} else {
var li = $('#comment_' + comment_srl);
toggleCommentForm(li, 'delete');
return false;
}
}
var message = confirm('댓글을 정말로 삭제하시겠습니까?');
if ( message ) {
exec_json('board.procBoardDeleteComment', {comment_srl: comment_srl}, function(r) {
console.log(r);
location.reload();
});
} else {
var li = $('#comment_' + comment_srl);
toggleCommentForm(li, 'delete');
return false;
}
}
현재 위와 같이 되어 있는데요.
콘솔로 찍어봐도 r값이 찍히질 않아요.
이 함수를 실행시켜주는 건 아래의 클릭 이벤트인데요.
// Modify and Delete Comment Directly
$(document).on('click', '.fdb_nav a[href*="dispBoardModifyComment"], .fdb_nav a[href*="edit"], .fdb_nav a[href*="dispBoardDeleteComment"], .fdb_nav a[href*="delete"]', function() {
var li = $(this).closest('li');
var type = $(this).attr('href').indexOf('elete') === -1 ? 'edit' : 'delete';
if ( !li.find('form[rel='+ type +']').length ) {
$.get($(this).attr('href')).done(function(response) {
var content = $(response).find('form')[0].outerHTML;
$(content).attr('rel', type).css({'border-top':'none'}).hide().appendTo(li);
toggleCommentForm(li, type);
if ( type === 'delete' ) {
var target_srl = li.find('[name="comment_srl"]').val();
li.find('form[rel='+ type +']').attr('onsubmit', 'return delComment('+ target_srl +');');
}
li.find('form[rel='+ type +']').find('[onclick^="history.back()"]')
.attr('onclick', 'toggleCommentForm(jQuery(this).closest(\'li\'), \''+ type +'\'); return false;');
});
} else {
toggleCommentForm(li, type);
}
return false;
});
$(document).on('click', '.fdb_nav a[href*="dispBoardModifyComment"], .fdb_nav a[href*="edit"], .fdb_nav a[href*="dispBoardDeleteComment"], .fdb_nav a[href*="delete"]', function() {
var li = $(this).closest('li');
var type = $(this).attr('href').indexOf('elete') === -1 ? 'edit' : 'delete';
if ( !li.find('form[rel='+ type +']').length ) {
$.get($(this).attr('href')).done(function(response) {
var content = $(response).find('form')[0].outerHTML;
$(content).attr('rel', type).css({'border-top':'none'}).hide().appendTo(li);
toggleCommentForm(li, type);
if ( type === 'delete' ) {
var target_srl = li.find('[name="comment_srl"]').val();
li.find('form[rel='+ type +']').attr('onsubmit', 'return delComment('+ target_srl +');');
}
li.find('form[rel='+ type +']').find('[onclick^="history.back()"]')
.attr('onclick', 'toggleCommentForm(jQuery(this).closest(\'li\'), \''+ type +'\'); return false;');
});
} else {
toggleCommentForm(li, type);
}
return false;
});
댓글 목록에서 삭제 링크를 클릭하면 -> 해당 페이지를 $.get으로 갖고 와서 -> 삭제 명령일 경우 -> form 부분의 onsubmit 속성을 return delComment('+ target_srl +') 으로 해주고 있습니다.
그렇게 해서 스킨 템플릿 수정 없이 스크립트만으로 댓글 삭제를 하려고 하는 거죠.
문제 해결을 위해 다음과 같은 시도를 해봤습니다.
- 댓글번호에 해당하는 target_srl에 따옴표도 해주고 다해봤는데 결과는 계속 동일해요.
- 혹시 몰라 board 모듈의 module.xml을 봤는데 procBoardDeleteComment가 누락되지 않고 존재하고 있고,
- procBoardDeleteComment 함수에 들어가서 디버그를 찍어봤는데도 오류 메시지가 검출되지 않는 건 exec_json 차원에서 실행이 안된다는 뜻 같은데요.
제가 어느 부분을 놓치고 있는 것일까요?
https://dev.aporia.blog/board_zjsF61/44317
여기에서 댓글 생성하고 직접 삭제 시도를 해보시고 조언 주시면 감사하겠습니다.

윤삼
Lv. 19
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
댓글 11
AJAX 없이 댓글 삭제 폼을 제출할 때와 exec_json으로 제출할 때 실제로 어떤 데이터가 오고가는지 개발자도구 네트워크 탭에서 찍어보세요. 꼭 필요한 변수가 누락되었을 가능성이 높습니다. 예를 들면 mid라든지... mid가 필요할 수도 있고, mid가 빠졌는지도 모르죠... ㅎㅎ
procBoardDeleteComment 액션에 mid값은 필요가 없는 것으로 알고 있는데요;;;
물론 ajax없는 댓글 삭제 폼에는 mid랑 document_srl이 다 있지만요.
그래도 일단 한번 그에 준해서 데이터 확인해보고 동작시켜보라는 말씀이시죠?
serialize해서 한번 넣어봐야겠네요.
{ comment_srl: comment_srl, mid: current_mid }
그런 차이가 있다면 뭔가 납득이 되기도 하네요.
저녁 때 mid값 넣고 확인해보겠습니다!
다행히 삭제 동작이 원활하게 되었습니다!
이제 비회원 비밀번호 처리가 남았네요ㅎㅎ
예전에는 mid값 없이 그냥 됐었는데 안 되길래 어제 하루 종일 한참 헤맸네요.
말씀하신 것처럼 어디서도 에러메시지를 보여주질 않으니 살짝 힘들었습니다;;;
웬만한 오류는 디버그 기능을 켜면 다 나옵니다.
페이지 로딩 후에 실행한 AJAX 요청도 대부분 디버그 패널에 나옵니다.
성능면에서도 xdebug 같은 복잡한 확장기능보다 라이믹스 디버그가 더 가볍습니다.
관리자나 개발자라면 디버그를 상시 켜놓고 운영하셔도 됩니다.
"보안정책상 허용되지 않습니다", "잘못된 요청입니다" 이거 2개가 항상 문제인데요,
체크하는 곳이 한두 군데가 아닌데다, 어느 체크에 걸렸는지 표시하는 것이 해킹에 도움이 될 수도 있어서...
만약 이 2개의 메시지와 관련된 위치를 표시한다면 관리자가 디버그를 켜놓았을 때,
또는 서버의 에러 로그에만 남기는 방향으로 가야 할 것 같습니다.
어쨌거나 관리자나 개발자라면 디버그 + 에러 로그 확인이 필수라는 얘기죠. ㅎㅎ
라이믹스 디버그 패널 완전 좋습니다.
proc~ 같은 액션이야 어차피 에러 로그를 봐야 하지만, 그 외에는 아주 편리하게 이용하고 있어요.
어지간하면 바로바로 확인 가능하니 손맛이랄까요ㅎㅎ 개발하는 맛을 잊기가 힘듭니다ㅋㅋㅋ
덧. 비밀번호 폼도 완료입니다ㅋ
AJAX 디버그 기록이 나오는 건 알고 있었는데 메인 페이지 접히는 건 몰랐었네요ㅎㅎㅎ 잘 참고해보겠습니다 😀