Q&A

CMS/프레임워크 XE 1.x
개발 언어 PHP 7.0

새글 작성시 트위터로 전송하는 애드온사용 시 글 수정시 중복 발행되는 것 때문에 꽤 오랜시간 씨름을 하고 있네요.

 

기존에 글 수정 시 세션을 만들어서 insert  단계에서 활용하는 방법을 구현했는데

이게 사용하다 보니 세션을 지워주는 것이 정확히 구현되지 않아 랜덤하게 세션이 있는 상태에서 글을 작성하게 되는 작성자가 생겨나더군요.

 

그래서 인서트 전에 지금 검출된 문서번호(첨부할 경우 문서번호가 즉시 확인됩니다.) 로 쿼리를 해보면 

인서트시 이 문서번호로 이미 db 에서 조회가 되는 바람에 첨부된경우 새글이 아닌 것을 함께 취급 받게 됩니다.

 

그래서 혹시 이 단계에서 해당문서번호로 조회했을때 이미 작성된 문서와 이제 인서트가시작된 문서와 다른 정보가 있을까요??

 

 

이러다가 그냥 수정시 중복발행을 감수해야 하는건 아닌지 하는 생각이 드네요.

왜 글 신규작성과 수정작성의 구분 act가 없었을까요... ㅜㅜ

댓글 11

  • 2018.12.15 09:54 #1128358

    첨부를 하게되면 문서번호가 미리 할당되기 때문이긴 할텐데 db에 쿼리를 했을때 조회가 된다면 저장이 되었다고 볼 수 있을 것 같기도 한데 이게 맞는지 모르겠습니다.

    그렇다면 regdate와 lastupdate 시간이 다른 것으로 판별하면 될 것 같다는 생각도 들었습니다.
    이 것을 이용하는 방법을 한번 시도해봐야 겠네요.

  • 2018.12.15 10:03 #1128367

    생각하시는게 맞을듯 한데요. 그거 말고 수정된 문서와 기존 문서가 다른게 있나 싶기도 하네요
    if( $regdate !== $lastupdate ) return ;

  • 2018.12.15 10:18 #1128380
    문서번호가 이미 할당된 글은 insertDocument가 아니라 updateDocument로 넘어갑니다.

    또한 아직 작성이 완료되지 않았다면 status가 TEMP로 나옵니다. 이게 가장 확실한 기준입니다.
    작성이 완료된 글은 status가 PUBLIC(공개글)이나 SECRET(비밀글)으로 나옵니다.
  • 2018.12.15 10:20 #1128388

    temp 문제는 아니구요. 첨부파일이 있는 게시글 때문에 어려움이 있습니다.

    제가 지금까지 해본 바로는요. 첨부파일을 첨부하면 아직 등록한 글이 아닌데도 문서번호가 즉시 부여됩니다.

     

    그래서 문서번호를 가지고 있느냐로 새글,수정글 판단이 어렵습니다.

     

    그래서 지금 lastupdate이 작성시간과 다르다는 것을 이용하려 했더니 첫번째 수정시 조회할때는 두 시간이 같아서 무용지물이네요.

  • 2018.12.15 10:26 #1128394

    인서트 에 DB에서 해당 문서번호를 조회해 보면 status가 TEMP로 나오지 않던가요?

     

    첨부파일이 없는 글 최초 작성: 문서번호 없음

    첨부파일이 있는 글 최초 작성: 문서번호 있음, 인서트 전 status는 TEMP, 인서트 후 status는 PUBLIC or SECRET

    글 수정: 문서번호 있음, 인서트 전후 status는 PUBLIC or SECRET

     

    last update는 댓글 작성시간에 따라서도 달라지기 때문에, 나중에 수정한 글을 파악하는 데는 무용지물입니다.

  • 2018.12.15 10:28 #1128401
    네. 그런데 막상 실제 해보면 안되는게
    $called_position == "after_module_proc"

    before 로 바꿔 볼까요 ??
  • 2018.12.15 10:30 #1128405

    네, 인서트에 조회하려면 before_module_proc으로 하셔야지요.
    물론 그 시점에는 체크만 하고, 실제 애드온의 주 기능은 글 작성이 완료된 후에 실행해야 합니다.

  • 2018.12.15 10:31 #1128410
    아.... 이 중요한 사실을 정말 오래도록 ..
    시도해보겠습니다.
  • 2018.12.15 10:40 #1128418

    감사합니다. 정말 오랜 골치꺼리를 해결했습니다. 이 간단한 것을 이리 오래 끌었다니..
    세션을 이용해보고 별짓을 다했네요.

    사실 이전에 동일한 내용으로 알려주셨는데 애드온에서 기준으로 잡은 실행시점을 생각지 못한 실수로 오랜 시간 안된다고 생각하고 다른 방법을 찾고 있었네요.


    함수 전체는 before_module_proc 으로 바꾸고 함수 안에서 전송작업 전에 아래로 조건을 걸었습니다.
    if($oDocument->isExists() && $oDocument->get('status') !== 'TEMP') return;


    게시글 등록은 100% 등록이 성공한다고 가정을 해도 무방하니 이렇게 써야 겠습니다.

    그동안 불완전한 세션기능으로 중간 중간 전송이 안되는 것을 파악하지 못했는데 이렇게 쉽게 고치게 되었네요.

    오래 고민하다보면 결국 실수하는 것이 발견되기는 합니다. 도움 매번 감사합니다.

  • 2018.12.15 11:01 #1128428

    체크시점 과 주기능 분리도 조언해 주신대로 해봐야겠습니다. 감사합니다.

    인서트 전 시점에서 

    알려주신 조건에 부합하면 $send='stop' 을 담은 후 

    인서트 후 시점에서 $send 값의 조건으로 트위터로 전송하는 코드로 유지 시켰습니다.

  • 2018.12.15 10:41 #1128422

    간단하게 해결될 문제였는데 오랫동안 발견하지 못해 해결을 못하던 문제였네요.
    배포되고 있는 To_sns 의 수정글 안보내게 패치한 부분도 오류가 있는게 이 콜포지션 문제이네요.