Extra Form
PHP PHP 7.0
CMS XpressEngine

if(Context::get("act") == "procBoardInsertDocument" && $called_position == "after_module_proc"){

}

 

이때 동작하게 되어있는 애드온입니다.

 

 

그런데 이 애드온은 지정된 게시판에서 작동하게 되었습니다.

 

 

일반적인 방문자가 작성한다면 당연히 해당 게시글에서 작성이 되기 때문에 위 act 시점에 동작이 됩니다.

 

그런데 만약 봇(모듈)이 글을 작성을 한다면 동작 자체가 불가능 한건가요???

만약 가능하다면 봇이 작성하는 php 코드안에 포함되어야 할 내용이 있는건가요?

 

 

rss 수집을 해서 해당 mid 게시판에 게시글이 자동으로 등록이 됩니다.

 

 

rss 수집을 하기 위해 crontab을 이용해 /mid?cron=1 이라는 주소로 접속을 시도하기 때문에 해당 mid에 접속은 잠시 되는 것 같습니다. 근데 게시글을 작성해서 insert 할때 애드온이 작동하는 mid에 머물고 있는 것으로 인식을 하는건지....

 

 

어찌 되었던 해당 애드온은 저 형태의 게시글 작성시에는 작동을 안하고 있어서 질문하게 되었습니다.

  • profile
    서버 밖에서 들어론 로봇이 글을 쓰려면 일반 방문자처럼 procBoardInsertDocument를 호출해야 합니다. 따라서 그런 종류의 로봇이라면 저 조건에도 걸립니다.

    만약 어떤 모듈이 특정 조건에 따라 자동으로 글을 만들어내는 것을 "봇"이라고 부르시는 거라면 상황이 다릅니다. procBoardInsertDocument는 글을 등록해 달라고 서버에 요청할 때 쓰는 액션명이므로, 서버 내에서 자체적으로 글을 생산해낼 때는 그 액션명이 필요하지 않습니다. DocumentController를 불러와서 insertDocument 함수를 직접 실행하겠지요.

    어떤 경로로 글을 썼든, 글이 작성될 때마다 무조건 끼어들기 위해서는 document.insertDocument (after) 트리거를 사용해야 합니다. 그런데 XE에서 트리거는 모듈의 전유물입니다. (라이믹스에서는 애드온도 트리거를 쓸 수 있습니다.) 따라서 procBoardInsertDocument가 아닌 다른 액션에서 글이 작성될 때도 항상 정확하게 끼어들기 위해서는 애드온이 아니라 모듈을 만들어야 합니다.

    만약 글을 만들어내는 모듈이 아주 특정한 상황에서만 동작한다면 그것과 똑같은 상황을 조건으로 걸어서 애드온이 실행되도록 할 수도 있습니다. 그러나 조건을 100% 동일하게 맞추지 않으면 이상하게 작동할 수도 있으므로 그다지 권장하는 방법은 아닙니다.
  • profile profile
    그럼 트리거를 이용하지 않으면 원래 구현이 힘든 것이었군요. XE모듈에서 생산되는 게시글 입니다.

    유일하게 관련뉴스를 rss로 받아와서 게시글로 작성하는 글만 트위터로 수동으로 전송하고 있어 요것도 애드온이 해줬으면 하는 욕심에 질문하게 되었네요.

    해당 게시글이 작성될때 푸시,구독,인공지능 모든 모듈이 정상동작하는 이유가 바로 트리거사용 이군요.
  • profile profile

    네, 트위터 작성 기능이 애드온으로 구현되어 있다면 푸시, 구독 등 모듈로 구현된 기능과 달리 일반 사용자나 외부 로봇이 직접 글을 작성할 때만 작동할 것입니다.

    해당 모듈과 애드온 모두 수정하실 수 있다면 1) 애드온에서 글을 받아와서 트위터로 보내는 기능을 하나의 함수(예: sendDocumentToTwitter)로 만들어서 정리하고, 2) 모듈에서 글을 작성한 직후 그 함수를 호출하면서 방금 작성한 글을 넘겨주도록 수정하는 것이 가장 쉬울 것 같습니다. 단, 4번씩 실행되는 애드온의 특성상, 이미 선언한 함수를 또 선언하거나 아직 선언하지 않은 함수를 먼저 호출하면 치명적인 오류가 발생합니다. 오류를 방지하려면 before_module_init 시점에 함수만 따로 선언하거나, 애드온명.func.php 파일을 따로 만들어서 include_once하는 것이 좋습니다. 직접 함수를 만들어 쓰는 애드온들은 대부분 이런 구조로 되어 있습니다.

  • profile profile
    저도 답변 받고 조금 생각해 보니 차라리 모듈에서 게시글을 삽입 한 직 후 트위터로 보내는 코드를 모듈에 포함시키는게 제일 좋을 수 있다고 생각해 봤습니다.
    애드온에서 불러오는 php를 모듈에서도 한번씩 불러오게 하고요....
  • profile profile

    추가로 질문 하나 더 드리겠습니다.

    혹시 모듈에서 트위터로 전송하는 것을 추가한다면...
    function insertDocument($list, $condition) {
    .
    .
    .

    $oDocumentController = &getController('document');
    $output = $oDocumentController->insertDocument($obj,true);

    return $output;

    }


    return $output; 이전에 넣어야 하는건가요? 아님 이후에 넣어야 하는건가요?

     

    require_once 로 불러오는 php는 최상단에서 불러와도 상관 없는 거죠?

  • profile profile

    return = 함수 실행 종료를 뜻하므로, 이후에 무엇을 넣어도 실행되지 않습니다 ㅎㅎ

     

    require_once는 함수가 필요한 시점 전에 언제든지 넣어도 되지만, 가능하면 필요한 부분 직전에 넣으셔야 나중에 해당 코드 전체를 다른 데로 복사하거나 할 때 잊어버리지 않아요.

  • profile profile
    감사합니다. 도전 해보겠습니다. 어차피 모듈에서 게시글을 등록하기 위해 만들어내는 data 들이 있어 조금만 가공해서 트위터로 보내면 될 것 같습니다.