세진님의 팁을 받으셨던 XE만세님의 팁으로부터 응용을 해봤습니다.

참고 링크: https://xe1.xpressengine.com/tip/22459465

 

원본 팁에선 페이지 새로고침이 있었는데, 여기선 #cmtPosition 요소만 새로고침을 적용해봤습니다.

아약스보드 안 쓰시는 분들한테는 도움이 될 수 있을 듯해요ㅋ

 

사용팁에 안 올리고 자유게시판에 올리는 건 아직 확신이 없어서요;;;

여건 되시는 분들, 시험 삼아 테스트해보시고 의견 주시면 감사하겠습니다

 

 

1. _comment.html에서 댓글에 댓글달기 링크(class="cmt_delete")에 다음의 onclick 속성을 추가

onclick="delComment('{$lang->confirm_delete}',{$comment->comment_srl});return false;"

 

2. board.js에 다음을 추가. 또는 _comment.html 파일 하단에 스크립트 태그로 추가

function delComment(msg, cmt_srl){
    var message = confirm(msg);
    if(message) {
        var params = new Array();
        params['comment_srl'] = cmt_srl;
        exec_xml('board','procBoardDeleteComment', params, function() {
            jQuery('#cmtPosition').load(location.href+' #cmtPosition');
            jQuery(document).scrollTop(jQuery('.fdb_lst_wrp').offset().top);
        })
    } else {
    }
};

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • ?

    댓글 페이지가 50개 단위로 나뉠 경우
    맨 마지막 51번째 댓글 삭제할때 cpage조정 따로 설정하셔야 할거에요

     

    그리고 비회원...

  • ? profile
    헐, 그러네요. 이런 cpage...ㅋㅋㅋ
    비회원은 외부에선 사이트가 잠금 상태여서 이따 집에 들어가서 다시 확인해봐야겠네요.
    감사합니다~!
  • profile ?
    댓글 페이징까지 다시 계산해야한다면 굉장히 머리아픕니다.

    그런 경우에는 그냥 페이지 번호로 나누는 것보다, "더보기" 버튼으로 넘겨보는 방식이 사용자 입장에서도 편할 거에요.
  • ? profile

    아, 더보기가 있었죠~
    가뜩이나 식견도 좁은데, 좁은 창만 보고 있다보니ㅎㅎ
    감사합니다. 일단 이번 습작을 해내면 적용해봐야겠어요. 페이징은 더보기로!

  • ? profile

    $cpage가 $oDocument->comment_page_navigation->last_page와 같고,
    목록상에서 count($oDocument->getComments())가 1일 때를 조심하면 되는 거겠죠?

    이 경우에 한해서 리로드되는 주소값의 cpage를 $cpage-1로 해주면 될 것 같은데...


    혹시 그 외에도 고려사항이 더 있을까요?

  • profile ?
    새 댓글 갱신속도가 많이 빠른 편이 아니라면
    var cpage = jQuery("#cmtPosition .bd_pg .this").text();
    if(cpage=="") cpage='1';

    var recomment_count = jQuery(".fdb_itm .re").length;
    var comment_count = jQuery(".fdb_itm").length-recomment_count; // Parent comment count

    if(cpage !=1 && ((jQuery(".fdb_itm").length == 1) || (comment_count == 1 && jQuery("#comment_"+comment_srl).attr("class").indexOf("re") ==-1) || (comment_count == 0 && jQuery(".fdb_itm").filter(':first').attr("id") == "comment_"+comment_srl))) cpage--;

    이런식으로 처리해도 별 문제없을겁니다
  • ? profile

    으흑흑흑, 감격입니다ㅠㅠ

    대댓글 경우는 물론이고, 특히 cpage를 페이지네이션의 this 클래스에서 가져오는 건 진짜 감동 감동이에요ㅠㅠ

    도움 덕분에 아래와 같이 짜서 문제가 되는 부분이 해결됐습니다.

    (주소창에 cpage가 그대로 남는 경우에 대비해 pushState도 넣어봤어요ㅋ)

     

    function delComment(msg, cmt_srl){
        var message = confirm(msg);
        var cpage = jQuery('#cmtPosition .bd_pg .this').text();
        if(cpage=='') cpage='1';
        var recomment_count = jQuery('.fdb_itm .re').length;
        var comment_count = jQuery('.fdb_itm').length-recomment_count; // Parent comment count
        if(cpage != 1 && ((jQuery('.fdb_itm').length == 1) || (comment_count == 1 && jQuery('#comment_'+cmt_srl).attr('class').indexOf('re') ==-1) || (comment_count == 0 && jQuery('.fdb_itm').filter(':first').attr('id') == 'comment_'+comment_srl))) cpage--;
        if(message) {
            var params = new Array();
            params['comment_srl'] = cmt_srl;
            var url = current_url.setQuery('cpage',cpage);
            exec_xml('board','procBoardDeleteComment', params, function() {
                jQuery('#cmtPosition').load(url+' #cmtPosition');
                jQuery(document).scrollTop(jQuery('.fdb_lst_wrp').offset().top);
            })
            if(current_url.indexOf('cpage')!=-1) history.pushState('','',url);
        } else {
        }
    };

     

    이제 집에 가서 비회원의 경우 어떤 문제가 있는지 확인해보겠어요 ^^/

    (아마도 비밀번호 확인?)

  • ? profile

    비회원의 경우, 비밀번호 입력창으로 안 넘어가고 권한이 없다는 경고창만 뜨고 마네요;;
    그래서 getCommentGrant 함수를 추가하셨던 거였는데...

    에잇!!

  • ? profile

    일단은 $comment->isGranted()가 없으면 ajax로 원래의 href를 가져오는 다른 함수를 만들고,
    권한이 있으면 위의 delComment를 실행시키는 것으로 문제를 봉합(?)했습니다.

    이 때 $document_srl가 없는 경우(제가 블로그 형태로 꾸미고 있어서 문서번호가 주소창에 없는 경우가 있거든요) 비밀번호 입력창에서 문서번호가 누락되는 경우가 있는데,
    이 문제는 input_password_form.html에서 $comment_srl로 문서번호 불러오는 쿼리를 활용해서 땜빵ㅋ했구요.
    {@
    if(!$document_srl):
    $oCommentModel = getModel('comment');
    $comment = $oCommentModel->getComment($comment_srl);
    $document_srl = $comment->document_srl;
    endif;
    }

    이로써 비밀번호 입력시에 전체 새로고침이 안되게끔 하는 것만 남은 거 같은데,
    어째, 문제가 점점 산으로 가는 느낌입니다ㅠㅠ

  • profile ?

    아마도 결국은 코어수정까지 갈거라 예상됩니다
    저거 말고도 댓글 페이지가 50개로 나뉠때 51번째 댓글을 작성할 경우 또 따로 해당 작성 댓글이 위치한 comment page값을 가져와야 하는데 이 때 모듈이나 애드온의 힘이 필요합니다 ㅠㅠ

  • ? profile
    역시 그렇군요.....
    슬픕니다.
  • ?
    감사합니다
  • ? profile

    새로고침 없는 댓글과 대댓글의 쓰기, 수정, 삭제, 비번입력, 페이지네이션,
    새로고침 없는 추천, 비추천, 신고(비회원 포함),
    새로고침 없는 본문 내 목록 이동, 태그 검색, 게시판 검색 등등은 로망이지요ㅋㅋ

    대강 성공을 한 거 같긴 한데, 시간이 허락되어(?) 몇몇 버그까지 잡게 되면 이 역시 팁을 공유하거나 소스 전체를 공개하든가 해보겠습니다~

    (근데 시간이 하도 많이 지나서 가물가물하긴 합니다ㅠ)

  • profile ?
    네 ㅎㅎ 기대해보겠습니다!
  • profile
    계속 윤삼님 흔적 쫓기 중이네요-_-);;
  • profile profile
    화이팅입니다ㅡㅜ 응원 말고는 드릴 게 없네요ㅠ