질문/조언질답게시판

문서 작성시 환영댓글이나 안내 댓글을 애드온으로 자동을 달게 해 주려고 하고 있습니다.

 

마지막 하나 해결이 되지 않은게 글 작성자가 파일을 첨부했을 경우에는 해당 문서에 댓글이 연결이 되지 않습니다.

 

                   $comObj->member_srl = $addon_info->who_you;
                    $comObj->email_address = $comObj->homepage = $comObj->user_id = '';
                    $comObj->user_name = 'Pangpang!';
                    $comObj->nick_name = $msg_title;

                    $comObj->module_srl = $this->module_srl;
                    
                    $comObj->document_srl = $this->variables['document_srl'];
                    
                    $comObj->content = $msg_pang;

                    $ccComment = &getController('comment');

                    $bk_avoidlog = $_SESSION['avoid_log'];
                    $_SESSION['avoid_log'] = true;
                    $tmpout = $ccComment->insertComment($comObj, true);
                    $_SESSION['avoid_log'] = $bk_avoidlog;
                    unset($_SESSION['own_comment'][$tmpout->get('comment_srl')]);

 

 

위 와 같은 코드로 댓글을 db에 넣게 되는데요.

 

 

관리자페이지에 가면 댓글은 등록되어 있습니다.

db에서 등록된 댓글을 확인해 보면 문서번호도 제대로 가지고 있는데 작성한 문서에 보면 댓글이 없고 달린 댓글이 없다고 나옵니다.

 

이것만 해결하면 가입인사글 혹은 문의글에 자동으로 미리 정해진 댓글을 달아 줄 수 있는데

파일첨부를 한 글에는 댓글이 달리지 않는 문제가 있어 해결이 필요하네요.

 

 

  • profile

    파일을 첨부하려면 첨부 대상이 필요하기 때문에 임시글이 생깁니다. 글을 실제로 등록하는 시점에는 "추가"가 아니라 "수정"이 이루어지지요. 애드온이 어떤 시점에 어떤 조건으로 실행되는지는 모르겠습니다만, 아마 이 차이 때문에 생기는 문제일 것입니다. 댓글 작성에 들어가는 $comObj와 댓글 등록 후 반환되는 $tmpout의 값을 찍어보셔야겠네요.

  • profile profile
    if($addon_info->start == 'Y' && $this->act=='procBoardInsertDocument'){

    이런 간단한 조건안에 본문에 적어드린 코드가 들어갑니다.
    실제 db에 댓글이 잘 들어가 있는데 해당 문서와 연결이 안되는 그런 현상입니다.
  • profile profile

    댓글이 잘 들어간 후에도 DB에서 해당 글의 comment_count는 0인가요?
    이걸 수동으로 1로 바꿔주면 댓글이 잘 나오나요?

    comment_count가 0이면 실제로 댓글이 달려 있는지 확인조차 하지 않는 경우가 많거든요.

  • profile profile
    네. db의 문서에는 댓글수가 0으로 되어 있습니다. 그래서 해당 문서를 읽는 곳에는 댓글이 달리지 않았다고 나오고 댓글이 증발해 있는 상황입니다.

    말씀하신대로 db에서 댓글수를 1로 수동으로 고쳐주면 댓글이 잘 나옵니다.
  • profile profile

    말씀하신 db에서 댓글수를 1로 조정하지 않고 새로운 댓글이 달리면 이때 댓글수가 다시 정상적으로 맞춰지면서 안보였던 댓글도 보이네요.

  • profile profile
    이경우 댓글수를 처음부터 제대로 맞춰줄 방법이 어떤게 있을까요??
  • profile profile

    어디서 본 적이 있는 문제인데... 싶어서 검색해 보니 예전에 라이믹스에서 이런 패치를 한 적이 있네요.
    https://github.com/rhymix/rhymix/pull/250

    댓글 저장은 master 커넥션으로 하고 댓글수 집계는 slave 커넥션으로 하는 바람에
    트랜잭션을 지원하는 InnoDB에서는 방금 저장한 댓글이 카운트되지 않는 문제였습니다.

    작년에 라이믹스에서 DB 커넥션을 관리하는 방식을 개선하려다가 발생한 문제를 고친 것이라
    XE에서도 똑같은 문제가 발생하지는 않을 것 같습니다만,
    혹시 이게 의심된다면 패치내역 중 1002줄만 적용해 보세요.

  • profile profile
    해당 문제는 아닌것 같습니다. 말씀 하신부분 고쳐봤는데 동일하네요.

    애드온에서 파일첨부시에만 댓글수를 강제로 조정하는 것이 제일 좋은 방법일까요?

    이게 최선이라면 적용할 수 있는 방법좀 알수 있으면 좋겠습니다.
  • profile profile

    일단 댓글을 저장하고 나면 트랜잭션이 종료되어 안전한 상태로 돌아올 테니, 애드온에 아래와 같은 코드를 더 넣어 보세요.

     

    // 최신 댓글수를 가져옴
    $oCommentModel = getModel('comment');
    $comment_count = $oCommentModel->getCommentCount($comObj->document_srl);

    // 문서의 댓글수 업데이트
    $oDocumentController = getController('document');
    $oDocumentController->updateCommentCount($comObj->document_srl, $comment_count, $comObj->nick_name);

  • profile profile
    애드온에 넣어봤는데 동일하게 안되네요. 댓글수가 그대로 0으로 유지되네요.
  • profile profile

    윗부분 제거하고 $comment_count를 강제로 1로 설정해보세요.

  • profile profile
    $comment_count =1;
    $oDocumentController = getController('document');
    $oDocumentController->updateCommentCount($comObj->document_srl, $comment_count, $comObj->nick_name);

    이걸 말하신거면 이렇게 하면 댓글이 바로 노출잘 됩니다.
  • profile profile

    아, 그럼 위에서 제가 말씀드린 코드를 다시 넣으시고, 댓글수 가져오는 코드 아래에

    $comment_count = max(1, $comment_count);

    이렇게 한 줄만 추가해서 사용하세요. 1보다 작은 경우에만 1로 강제하고, 이미 1이거나 1보다 크면 그대로 두는 코드입니다.

     

    나중에 댓글을 자동으로 등록하는 다른 애드온을 더 쓰시거나, 이미 댓글이 여러 개 달린 글을 수정하는 과정에서 잘못 걸린 경우 댓글수가 무조건 1이 되어 버리는 버그를 예방하기 위해서입니다.

  • profile profile

    오.. 잘 됩니다. 정말 감사합니다.
    이제 문제가 되는 부분 다 해결 되어 사용 가능하게됬네요.

    애드온이 글 수정에서는 동작하지 않도록 위쪽에서 리턴을 해 두어서 처음에 댓글수 1로 강제로 해도 상관은 없을 것 같습니다.
    그런데 이렇게 1보다 작은 경우 이미 1이 있는 경우 까지 대비하니 더 안전한 듯 하네요.

    글 수정시 똑같은 자동 댓글이 안달리게 한건 댓글 조회해서 댓글봇이 작성한 댓글이 이미 있으면 리턴 시키는 것으로 했습니다.

    (문서번호가 있다면 이라는 조건이 파일첨부때 문제가 될 듯 해서요...)

    도움 감사했습니다.

  • profile ?
    아... 이것때문에 고민했는데, ㅠㅠ;;
    전 초보라 무슨 말씀인지 댓글을 봐도 모르겠네요.

    위 수정된 것들을 애드온 어느 문서 어느 지점에 넣어야 할지 설명 좀 부탁드려도 될런지요. ㅠㅠ;;

    가능하면 가르쳐 주시면 감사하겠습니다.
  • ? profile

    사용하시는 애드온이 제가 사용하는 것이랑 구조가 좀 다르고 해서 다른 문제가 발생하거나 혹은 해결이 될지 잘 모르겠지만요.

    그리고 안되는 것을 되게 만든 것이라 이런 문제가 처음부터 발생하지 않도록 애드온이 만들어져야 합니다. 이점은 알고 수정해서 사용하셔야 할 것입니다. 혹 다른 문제가 발생하는지 모니터링 잘 해보세요.

     

    $comObj->email_address = $comObj->homepage = ''; //댓글 작성자의 email_address, homepage, user_id ''로 초기화
    $comObj->module_srl = $this->module_srl;
    $comObj->document_srl = $this->variables['document_srl'];
    $comObj->content = $com_ment;
    
    $ccComment = &getController('comment');
    
    $bk_avoidlog = $_SESSION['avoid_log'];
    $_SESSION['avoid_log'] = true;
    $tmpout = $ccComment->insertComment($comObj, true);
    $_SESSION['avoid_log'] = $bk_avoidlog;
    unset($_SESSION['own_comment'][$tmpout->get('comment_srl')]);
    // 최신 댓글수를 가져옴
    $oCommentModel = getModel('comment');
    $comment_count = $oCommentModel->getCommentCount($comObj->document_srl);
    $comment_count = max(1, $comment_count);
    
    // 문서의 댓글수 업데이트
    $oDocumentController = getController('document');
    $oDocumentController->updateCommentCount($comObj->document_srl, $comment_count, $comObj->nick_name);

     

    13~20번줄 을 추가해보세요.

  • profile ?
    앗... 웹지기님 감사합니다. 제가 외부라 있다가 초저녁에나 들어가 시험해 봐야 할 듯 합니다. 진심 감사드려요 웹지기님^^

서버에 요청 중입니다. 잠시만 기다려 주십시오...