게시글 삭제 전

 

01.png

 

게시글 삭제 후

 

02.png

 

삭제된 게시글 (비)추천 방지

03.png

 

 

댓글 삭제 똥 남기기

 

04.png

 

 

 

 

유저가 작성한 게시글, 댓글, 대댓글을 삭제할 경우 "삭제된 게시글입니다" 와 같이 전환하는 모듈입니다.

일부 애니 사이트에서 사용중인 방식이길래 급하게 미러링했습니다.

유저가 아닌 (게시판)관리자가 삭제할 경우 정상적으로 삭제됩니다.

따로 설정페이지 같은건 없습니다

 

그냥 부처님 같은 마음으로 뿌려봅니다 ㅋㅋ;

 

+ 댓글에 대댓글이 달려 있을 경우 수정방지 기능이 포함되어 있습니다.

 

게시판 스킨단 삭제된 게시글 판별 예제 (스케치북 _read_nav.html)

{@

...

    $is_deleted = !($logged_info && $logged_info->is_admin == "Y") && preg_match('/<span.*?style=".*color:\s?#888888.*">/i', $oDocument->getTitle($mi->subject_cut_size)) ? TRUE : FALSE;

}

 

    <a cond="$is_logged" class="document_{$oDocument->document_srl} action bubble m_no" href="#popup_menu_area" onclick="return false;" title="{$lang->cmd_document_do}"><i class="fa fa-ellipsis-h"></i><b class="tx">{$lang->cmd_document_do}</b></a>
    <block cond="$oDocument->isEditable() && !$is_deleted">
    <a class="edit" href="{getUrl('act','dispBoardWrite','document_srl',$oDocument->document_srl,'comment_srl','')}"><i class="ico_16px write"></i>{$lang->cmd_modify}</a>
    <a class="edit" href="{getUrl('act','dispBoardDelete','document_srl',$oDocument->document_srl,'comment_srl','')}"><i class="ico_16px delete"></i>{$lang->cmd_delete} </a>
    </block>

 

 

개발환경 XE 1.8.27, php 5.6

 

https://github.com/huhani/xe-gamezot

 

 

 

 

 

+

https://github.com/huhani/xe-gamezot/commit/451ce4a974ef5a7b69d746fb696c58c6a165fa9e

파일이 첨부된 댓글 삭제시 계속 남아있는 현상 수정하였습니다
해당 행을 추가해주세요

  • profile
    부처님의 자비하심이 온누리에 울려퍼지는 크리스마스 되길...
    메리 크리스마스!
  • profile
    와 좋은 자료 너무 감사합니다!
    즐거운 크리스마스 보내세요 ^_^.
  • ?
    와....닉행일치
    게다가 다른 어려운 설정 없이 그냥 바로 동작해버리는 군요!!
  • profile
    글 / 댓글 삭제 시 포인트 반환 동작은 이루어지는지 궁금하네요.
  • profile ?
    포인트 반환이 안되는것 같네요.
  • ? profile
    네. 그럴 것 같아 질문을 드렸는데요. 글 삭제나 댓글 삭제시와 동일한 액션이 아니니 아마 실제 삭제 act 가 실행되지 않으니 포인트차감이 진행되지 않을 것 같네요.

    커뮤니티에서 포인트부분 악용사례 또는 삭제에 대한 부담이 오히려 더 없어지는 부작용이 생길 우려도 있다는 것은 사전에 파악을 한 상태에서 사이트에 적용을 해야 할 요소 인 듯 합니다.
  • profile ?
    $oPointController = getController('point');
    $oPointController->setPoint($logged_info->member_srl, $깎을포인트값, 'minus');

    위 문장을 각각
    _triggerBeforeDeleteComment, _triggerBeforeDeleteDocument 함수에서

    $oFileController = getController('file');
    $output = $oFileController->deleteFiles($comment_srl);

    아래에다 추가해보세요
  • ? profile
    코어에서 동작되는 실제 동작이 아니라면 적용이 어려울 듯 하니다. 각 게시판 마다 글 작성이나 댓글 작성시 부여했던 포인트가 모두 다르구요. 그 포인트 만큼만 차감해야 하는 동작이니 실제 코어 동작과정을 생략하면 문제가 생깁니다.

    또, 저희는 같은 글에 동일한 댓글은 첫회만 포인트를 지급하고 이후 포인트는 회수하는 애드온을 사용해서 더욱이 모든 댓글에 포인트를 회수하면 문제도 생기구요.

    좋은 자료 공개 감사합니다. 사소한 것일 수 있지만 나름 커뮤니티에서는 분쟁의 소지가 있어 언급해 드렷어요.
  • profile ?
    게시판마다 글 작성 포인트 다른건 따로 해당 게시판 설정 값에서 포인트 값을 가져오면 문제 없지만 짜기가 귀찮아서 ㅋㅋ;

    애드온 같은 경우 저라면 모듈에다 쓰까버리지 않을까 싶네요 =.=;;
  • ? profile
    네. 개인적으로 사용목적으로 만드신 모듈이니 이해됩니다. 그럼에도 공개해주셔서 감사해요.
  • ? profile

    모듈 설정값으로 차감은 어렵더라도 요거 댓글에만 그냥 일괄 포인트로 정해서 적용하려니 사이트 에러가 나는데요. 혹시 잘못된 곳이 있을까요?

     

    $oPointController->setPoint(Context::get('logged_info')->member_srl, 50, 'minus');

    이렇게 고치니 차감이 되네요.

     

  • profile
    혹시 댓글 기능만 이용하려고 한다면
    https://github.com/huhani/xe-gamezot/blob/master/gamezot.controller.php#L15-L137

    이부분을 삭제나 주석처리만 하면 될까요???
  • profile ?

    저 부분 주석처리와
    triggerBeforeModuleProc함수에서 문서 관련 리턴 지우고
    class파일에 document관련 트리거 지우시면 될거에요
  • ? profile

    한가지만 여쭙겠습니다. 말씀 하신 부분 주석처리하고 설치해서 적용했는데요.
    댓글 삭제 후 게시판 목록으로 빠져 나가던데요. 이게 의도 하신건가요?? 기존에 글삭제 댓글 삭제시 해당 문서 새로고침과 다르니 약간 어색하고 해서요.

     

    기존처럼 해당문서에서 새로고침만 되게 바꿀 수 있을까요 ?

  • profile ?
    사실 개인적으로 댓글 삭제 후 게시판쪽에서 AJAX처리를 해놔서 해당부분은 잘 모르겠네요.
    https://github.com/huhani/xe-gamezot/blob/master/gamezot.controller.php#L224
    일단 혹시나 싶어서 저 행은 수정했습니다.
  • ? profile
    네. 감사합니다. 저도 문서번호를 추가해 볼까해서 고민중이었는데 답변해주셨네요. 감사합니다. 이렇게 하면 문서에서 코멘트의 페이지로 새로고침이 잘 될 것 같습니다.
  • profile

    자료 완전 감사합니다.

    혹시 대댓글이 있어도 댓글을 수정 할 수 있게 가능할까요?
    너무 억악하는것 같아서요 ~

  • profile profile
    제가 언뜻 살펴본 바로는...
    https://github.com/huhani/xe-gamezot/blob/master/gamezot.controller.php#L159-L161

    이부분이 해당 대댓글이 있을 경우 메시지를 띄우고 리턴 시키는 코드로 보입니다. 이부분 주석처리해 보시고 테스트 해보세요.

    하지만 개인적으로는 오타나 이런 것을 수정하지 못하는 불편이 이를 제한해서 악의적이거나 혹은 나쁜 행동을 일삼는 의도를 가진 사람이 행동을 하지 못하게해서 얻는 공익적 효과가 더 크다고 봅니다. 운영자 마다 생각이 다른 것 이겠지만요.
    사실 여기 XE타운에도 묻고답하기에 댓글 달리고 대댓글 달리면 잠기는 기능이 생긴게 고약한 사람이 못된 짓 하고 난 후 생긴 기능이죠.

    전 이 모듈에서 채택한 대댓글 있을 시 수정은 못하고(조작금지) 차리리 삭제를 지원해 준 것이 굉장히 맘에 듭니다.
    누군가와 논쟁의 댓글을 시작했는데 글을 조작하지 못하니 차선으로 삭제를 선택했다는 것은 어느정도 싸움을 멈추게 해주는 것과 동시에 스스로 논리에서 졌다는 의미도 되기도 합니다. 하지만 수정을 가능하게 하고 삭제는 불가능한 현 구조에서는 결국 글을 수정하거나 또는 의미없는 쩜쩜쩜으로 만들어버리거나 하는 것을 하겟죠....

    물론 저도 급하게 작성하다 놓치거나 오타가 나거나 하는 등의 수정이 힘들어지는 부분에서는 불편할 것이라고는 생각하지만 그정도는 굉장히 빈도가 많지도 않고 그런 경우 다시 댓글로 첨언을 하거나 먼저 댓글에서 뭐가 잘못 적었다라고 설명하는 과정이 오히려 전.후 맥락을 쉽게 이해 할 수 있다고 봅니다.

    대댓글로 인해 원 댓글이 수정되는 경우 다시 대댓글 작성자가 이를 반영하지 않으면 오히려 대댓글 작성자가 이상해 질 경우도 많으니까요...
  • profile
    혹시 컨텐츠 위젯의 스킨쪽에 삭제글 판별 할 수 잇는 변수를 사용할 방법이 있을까요 ?
  • profile

     그리고 게시글 열람 페이지에서 확인하는

    {@
    $is_deleted = !($logged_info && $logged_info->is_admin == "Y") && preg_match('/<span.*?style=".*color:\s?#888888.*">/i', $oDocument->getTitle($mi->subject_cut_size)) ? TRUE : FALSE;
    }

    이 코드가 동작하지 않아요.

    사용자정의 부분도 삭재글에서 가려야 하는데 위 코드가 동작하지 않아 못가리고 있네요.

  • profile ?

    위젯에서 제목 색상값을 따로 처리하는가봅니다 ㅠㅠ

    위젯쪽에서 제목 색상값도 가져와서 888888이면 삭제한 게시글로 해야할 것 같네요.

    아니면 문서 content 앞에서 21바이트 만큼은 <!--DeletedDocument--> 이면 삭제한 게시글로 해도 되요

  • ? profile
    저 코드 넣으면 그리고 닫기가 이상해져요. 위젯에 넣은거 아니고 스케치북 스킨이에요.
  • profile ?
    {$is_deleted = !($logged_info && $logged_info->is_admin == "Y") && preg_match('/<span.*?style=".*color:\s?#888888.*">/i', $oDocument->getTitle()) ? TRUE : FALSE}
    이렇게 했는데도 에러가 나나요?
  • ? profile
    {@
    $is_deleted = !($logged_info && $logged_info->is_admin == "Y") && preg_match('/<span.*?style=".*color:\s?#888888.*">/i', $oDocument->getTitle($mi->subject_cut_size)) ? TRUE : FALSE;
    }
    이렇게 넣었구요. 에러가 난다기 보다는 삭제글로 확인이 안되고..
    에디터에서 보면 문서 하단까지 닫힘이 연결되어버립니다.
  • profile ?

    제목 없음.png

     

    아 맞다
    저거 _read.html 위에다 추가하였습니다

  • ? profile
    네. 거기에 추가했지요.
  • profile
    그럼 저도 보여주신 것 처럼

    기존에 있는 곳에
    $is_deleted = !($logged_info && $logged_info->is_admin == "Y") && preg_match('/<span.*?style=".*color:\s?#888888.*">/i', $oDocument->getTitle($mi->subject_cut_size)) ? TRUE : FALSE;

    이것만 삽입해볼게요.
  • ? profile
    근데 이상합니다. 이 코드만 삽입하면 문서 끝까지 닫힘이 연결되는게 에디터에서 보여져요...
  • profile ?
    저 부분은 문법적으론 변수에다 TRUE FALSE만 반환하는거라 스킨이 이상하게 된다는건 다른곳에 문제가 아닌감 예상이 되는데
    음..
    php버전 때문인가

    $is_deleted = !($logged_info && $logged_info->is_admin == 'Y') && strpos($oDocument->getContent(100), '<!--DeletedDocument-->') ? TRUE : FALSE;

    이걸로 수정해보세요
  • profile ?

    설마 따움표랑 쌍따움표 문제일려나

    증상이 딱 문법에러인 것 같은데

  • ? profile

    IMG_20161231_0037322.jpg

     

  • ? profile
    #888888.* 뒤에 쌍따옴표까지 지우면 문서 끝까지 닫힘은 연결은 사라집니다.
  • profile ?
    $is_deleted = !($logged_info && $logged_info->is_admin == 'Y') && strpos($oDocument->getContent(100), '<!--DeletedDocument-->') ? TRUE : FALSE;

    이걸로 바꿔보세요
    기능상으론 똑같습니다
  • ? profile
    스킨이 이상한게 아니고 지금 노트패드++ 에서 코드 넣으면 아래 사진 처럼 되어서요. 이거로 해볼게요.
  • ? profile
    네. 이건 현재 편집기에서 닫힘이 이상없으니 이거로 추가해서 업로드해서 테스트 해보고 결과 알려드릴게요.
  • profile ?
  • ? profile
    잘 됩니다. 이제 변수 활용이 가능해졋네요.

    그런데 컨텐츠위젯에서도 똑같이 사용할 수 있는 방법이 잇을까요?
    여차하면 메인페이지에서 삭제글 안보여줄 수도 있어서요. 늦은밤 감사합니다.
  • profile ?
    위젯에서 $oDocument->getContent() 불러오기 가능하다면 똑같이 먹히지 않을까 생각이 드네요
  • ? profile

    위젯에서는 목록하고 같은 개념일텐데요.. 지금 알려주신 코드는 글읽기 화면이구요...

    참조해야 하는 곳도 해당 글의 제목이구요.

  • profile ?
    위젯에서 글색상 코드가 888888이고 제목이 "삭제된 게시글입니다" 로 판별하면 되지 않을까요
  • profile
    글 삭제시 추천받은 포인트 환수 추가 어렵겠죠?
  • profile ?

    가능이야 하지만 개인적으로 그 정도까진 안 써서 ㅠㅠ

  • ? profile
    질문을 통해 받은 답변을 토대로

    $voted_count = $oDocument->get('voted_count');
    $member_srl = $oDocument->get('member_srl');
    if($member_srl){
    $module_srl = $oDocument->get('module_srl');
    $oModuleModel = getModel('module');
    $config = $oModuleModel->getModuleConfig('point');
    $module_config = $oModuleModel->getModulePartConfig('point', $module_srl);
    $point = $module_config['insert_document'] ? $module_config['insert_document'] : 0;
    if($point){
    $oPointController = getController('point');
    $oPointController->setPoint($member_srl, $point, 'minus');
    }
    $board_vote = $module_config['voted'] ? $module_config['voted'] : 0;
    $voted_point = ($voted_count * $board_vote);
    if($voted_count){
    $oPointController = getController('point');
    $oPointController->setPoint($member_srl, $voted_point, 'minus');
    }
    }


    이렇게 처리했어요.
  • profile ?
    잘 작동한다면 문제없을듯 합니다 ㅎㅎ
  • ? profile
    @웹지기님 @후하니님 저거 깃허브 반영 가능할까요?
  • profile ?
    개인적으로 그렇게까지 깐깐하게 할 필요는 없는 것 같아서 음..
    애초에 어그로 방지차원에서 만든 모듈이라..
    많은 사람들이 필요로 하는 기능이라면 넣어야겠지만요 ㅋㅋ;
  • ?
    아직 적용한 건 아닌데, 라이믹스의 삭제시 휴지통 사용 기능이나 CONORY님의 휴지통 애드온(https://xetown.com/xepoint/67964 )과는 당연히 호환이 안 되겠죠?

    이런 기능들은 삭제를 넣는게 아니라 휴지통으로 이동하는 동작을 넣는거 같던데..

    이거랑 호환시키려면 휴지통으로 보낸 글도 삭제된 게시글이라고 표시해야 하고, 휴지통에서 복원시키면 다시 원래 내용으로 복구시켜야 하는데 어려울거 같네요
  • ? ?
    호환은 되지 않습니다.
    아마 휴지통 애드온을 켠다면 모듈 동작은 하지 않고 휴지통으로 이동될겁니다.
    사실 삭제하기전 따로 DB에 백업기능을 넣을려고 했으나 너무 정보 저장에 집착하게 되는 것 같아서 넣진 않았습니다.
  • ?
    혹시 반대로 관리자가 삭제를 했을때만 동작하도록 할 수는 없을까요?

    관리자에 의해 삭제된 글입니다. 이렇게 출력하고 싶은데..
  • ? ?
    _triggerBeforeDeleteDocument 함수
    if($isBoardAdmin){

    if(!$isBoardAdmin){
    로 바꿔보세요
  • ? ?
    감사합니다.

    게시글도 댓글도 잘 적용되네요~
  • profile

    한가지 추가하고 싶은 것이 있습니다.

    게시글 삭제시 tag 테이블에 들어갔던 이 삭제게시물의 문서번호로 들어간 태그를 삭제해 주고 싶은데요.
    -> 이유는 저희는 tag를 활용해서 문서에 해시태그 형태로 태그를 보여주고 있습니다. 그런데 다른 곳에서 태그를 눌러 조회하면 목록에 이 삭제된게시물입니다. 라는 게시물이 함께 조회가 되어서요. 게시물이 완전 삭제될 때는 태그관련 db가 모두 삭제가 되기 때문에...


    tag 모듈에 코드를 보니

    function triggerDeleteTag(&$obj)
    {
    $document_srl = $obj->document_srl;
    if(!$document_srl) return new Object();

    $args = new stdClass();
    $args->document_srl = $document_srl;
    return executeQuery('tag.deleteTag', $args);
    }




    <query id="deleteTag" action="delete">
    <tables>
    <table name="tags" />
    </tables>
    <conditions>
    <condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
    </conditions>
    </query>


    tags 테이블에서 이렇게 해당문서번호의 태그는 모두 지워주고 있습니다.



    -----------------------------------------------------------------------------------
    function triggerDeleteTag(&$obj)
    {
    $document_srl = $obj->document_srl;
    if(!$document_srl) return new Object();

    $args = new stdClass();
    $args->document_srl = $document_srl;
    return executeQuery('tag.deleteTag', $args);
    }


    이부분을 똥남기는모듈의 어떤 부분에 어떻게 고쳐 넣어야 할지 알 수 있을까요 ??

  • profile ?
    $args = new stdClass();
    $args->document_srl = $document_srl;
    executeQuery('tag.deleteTag', $args);

    https://github.com/huhani/xe-gamezot/blob/master/gamezot.controller.php#L121
    같은 곳에 적당히 구겨넣으면 될 것 같습니다.
  • ? profile
    감사합니다!
  • ?
    왜 폴더를 modules 폴더에 올려놨는데 설치된 모듈리스트에 없을까요
  • profile

    XE 최신코어에서 관리자페이지 혹은 게시글 관리에서 삭제된게시글 삭제가 실패가 발생합니다.

    댓글은 이미삭제된 댓글이라고 뜨고 삭제되지 않습니다.

    어디를 고쳐야 할까요?

  • ?
    xe 최신 버전에서는 작동하지 않나요? 써보고 싶은데 모듈에 넣어봐도 나오질 않네요 ㅠㅠ
  • ? profile
    잘 동작합니다. 다만 사용하시는 php 버전이 7.2 라면 Object 함수 중복 문제로 수정해줘야 하는 부분이 있습니다 7.1 이하는 상관없습니다.
  • profile ?
    성급해서 모듈이 진행되기전에 적용이 안되는걸로 착오가있었나봅니다 ㅠ.ㅠ 적용 잘됩니다 :D