물어보기XpressEngine

게시글 삭제 애드온을 설치만하고 사실 사용은 하고 있지 않은데요. 

 

임시로 제공하는 게시판에 임시로 작성된 게시글을 기간이 지나면 자동으로 삭제하는 것을 찾다가 공홈에서 발견하고 설치까지만 해 놓은 애드온입니다.

 

제가 직접 관리해서 삭제할 정도의 여력이 되어서 사실 애드온을 사용하고 있진 않습니다.

(사실 멀정한 다른게시판 게시글도 다 지워지면 어쩌나 하는 염려증... ㅋ)

 

그런데 추후 사용하게 될 때를 고려해서 살펴보다가 공지글은 지워지면 안될 것 같아 질문을 드립니다.

 

현재 게시글 불러오는 쿼리입니다.

 

<query id="autoDelGetList" action="select">
    <tables>
        <table name="documents" />
    </tables>
    <columns>
        <column name="*" />
    </columns>
    <conditions>
        <condition operation="equal" column="module_srl" var="module_srl" filter="number" />
    </conditions>
</query>

 

 

 

아래 처럼 한줄 추가하면 공지글이 제외가 될까요???

<query id="autoDelGetList" action="select">
    <tables>
        <table name="documents" />
    </tables>
    <columns>
        <column name="*" />
    </columns>
    <conditions>
        <condition operation="equal" column="module_srl" var="module_srl" filter="number" />
        <condition operation="equal" column="is_notice" var="N" pipe="and" />
    </conditions>
</query>

 

 

 

그리고 궁금한 점 .2

이 자료에서 댓글 수는 왜 불러오는지 봐도 잘 모르겠네요.

 

<?php
   
    if(!defined("__XE__")) exit();
    
    if($called_position!='before_module_proc') return;
    if($this->module != 'board' && $this->module != 'beluxe') return;
    
    $act = Context::get('act');
    if(($this->module == 'board' || $this->module == 'beluxe') && $act) return;
    
    $inputNum = preg_match('/[^0-9]/', $addon_info->inputNum)?'':$addon_info->inputNum;
    $h_or_d = $addon_info->h_or_d;
    $regOrLast = $addon_info->regOrLast;
    if(!$inputNum) return;

    $args->module_srl = $this->module_srl;
    $output = executeQuery('addons.autoDel.autoDelGetList', $args);
    $oDocumentController = &getController('document');
    
    if($h_or_d == 'listCount')
    {
        if(count($output->data)>$inputNum)
        {
            $delCount = count($output->data) - $inputNum;
            foreach($output->data as $key=>$val)
            {
                if($regOrLast=="regdate"&&$val->regdate<=date("YmdHis", strtotime("-".$inputNum.$unit))) $temp[] = $val->regdate."/".$val->document_srl;
                else if($regOrLast=="lastUpdate"&&$val->last_update<=date("YmdHis", strtotime("-".$inputNum.$unit))) $temp[] = $val->last_update."/".$val->document_srl;
            }
            sort($temp);
            foreach($temp as $key=>$val)
            {
                $breakCount++;
                $val = explode("/", $val);
                $args->document_srl = $val[1];
                $chk_cnt = NULL;
                $chk_cnt = executeQuery('addons.autoDel.getCommentCount', $args);
                foreach($chk_cnt as $k=>$cnt){}
                $chk_c = count($cnt);
                if($chk_c==NULL) $oDocumentController->deleteDocument($val[1], true);
                if($breakCount==$delCount) break;
            }
        }
    }
    else
    {
        if($h_or_d=='hour') $unit = 'hour';
        else $unit = 'day';
        foreach($output->data as $key=>$val)
        {
            if($regOrLast=="regdate"&&$val->regdate<=date("YmdHis", strtotime("-".$inputNum.$unit))) $temp[] = $val->regdate."/".$val->document_srl;
            else if($regOrLast=="lastUpdate"&&$val->last_update<=date("YmdHis", strtotime("-".$inputNum.$unit))) $temp[] = $val->last_update."/".$val->document_srl;
        }
        sort($temp);
        foreach($temp as $key=>$val)
        {
            $val = explode("/", $val);
            $chk_cnt = NULL;
            $chk_cnt = executeQuery('addons.autoDel.getCommentCount', $args);
            foreach($chk_cnt as $k=>$cnt){}
            $chk_c = count($cnt);
            if($chk_c==NULL) $oDocumentController->deleteDocument($val[1], true);
        }
    }
?>

 

 

 

  • profile
    람보 2017.09.17 14:58:54

    <condition operation="equal" column="is_notice" var="N" pipe="and" /> var가 아니라
    default 입니다.

    일반적으로 xml 쿼리에서 var로 쓰이는건 해당 $args 같은것으로 넘어오는 쿼리에 이름을 사용합니다

    ex)

    $args = new stdclass();
    $args->module_srl = '123';
    $output = executeQuery('~~~~.~~~',$args);

    <condition operation="equal" column="module_srl" var="module_srl" />

  • profile
    웹지기 2017.09.17 15:04:20
    아...그런 차이가 있군요. default ! 감사합니다.
  • profile
    람보 2017.09.17 15:01:12

    $chk_cnt = executeQuery('addons.autoDel.getCommentCount', $args);

    여기에서 댓글갯수 가져오는것 같은데요.

  • profile
    웹지기 2017.09.17 15:04:41
    댓글수가 왜 필요한지 궁금해서요 ㅋ
  • profile
    람보 2017.09.17 15:18:12
    댓글 있나 보고 해당 댓글이 없을때 정상적으로 삭제 하기 위함인듯하네요.
  • profile
    웹지기 2017.09.17 15:21:59
    댓글이 있으면 삭제가 안된다는 그런 언급은 없던데 그럼 댓글이 있으면 삭제가 안되는 자료인가 보네요??
  • ?
    GLANCEYES 2017.09.17 15:23:38
    댓글이 남아있는 게시물을 삭제하면 게시물만 삭제되고 그 게시물에 딸린 댓글까지는 삭제되지 않아서 그런 것 같습니다.
  • profile
    웹지기 2017.09.17 15:24:11

    정확히 알고 싶은데요. 댓글이 달린 게시글은 삭제가 안되는 자료인가요?

  • profile
    람보 2017.09.17 15:30:41
    어떻게 작돝하길 원하는지 이애드온위 저코드만으로는 알기 어렵고요. 삭제 하는 글의 쿼리를 거져와서 반복돌려서 뭔가 하면서 삭제하는거보니.. 설정값하고 삭제액션들에 좀더 봐야 파악이 가능할것 같네요.
  • profile
    웹지기 2017.09.17 15:35:13

    애드온 코드는 저게 전부에요. 댓글수 쿼리는 각각의 문서의 댓글 수만 가져옵니다. 설정에는 댓글관련 설정은 아예 없습니다.

     

     

    <extra_vars>
            <var name="h_or_d" type="select">
                <title xml:lang="ko">단위</title>
                <description xml:lang="ko">단위를 선택(시간/일/갯수)</description>
                <options value="hour">
                    <title xml:lang="ko">시간</title>
                </options>
                <options value="day">
                    <title xml:lang="ko">일</title>
                </options>
                <options value="listCount">
                    <title xml:lang="ko">목록갯수</title>
                </options>
            </var>
            <var name="inputNum">
                <title xml:lang="ko">시간/일/갯수 입력</title>
                <description xml:lang="ko">* 입력된 기간(시간/일/갯수)이 지난 게시물은 자동 삭제됩니다.
                * 시간,일,갯수 중에 하나만 선택.
                * 시간 혹은 일을 선택하면 입력한 시간이나 날짜가 지난 게시물은 자동 삭제됩니다.
                * 갯수를 선택하면 입력한 갯수만 남겨두고 새로운 글이 등록될 때마다 가장 오래된 글부터 자동삭제 됩니다.</description>
            </var>
            <var name="regOrLast" type="select">
                <title xml:lang="ko">기준날짜</title>
                <description xml:lang="ko">등록일 혹은 마지막 수정일을 기준으로 할 것인지 선택</description>
                <options value="regdate">
                    <title xml:lang="ko">등록일</title>
                </options>
                <options value="lastUpdate">
                    <title xml:lang="ko">수정일</title>
                </options>
            </var>
        </extra_vars>

  • profile
    람보 2017.09.17 15:55:42
    그러니깐 코드를 봐도 내부적으로 어떻게 도는지 확인이 안되는 경우가 많습니다.

    $chk_cnt = executeQuery('addons.autoDel.getCommentCount', $args);
    서드파티에서 직접 쿼리를 만든 코드인것 같은데 이 코드를 사용하면서

    마지막 사용할때는 $oDocumentController->deleteDocument($val[1], true);
    늘 $val['1'] 이렇게 배열중에 1번에 들어간 데이터만 고집해서 넣는다고 되어있어요.

    그럼 $val['1']에는 항상 Document_srl 이 넘어간다는 소린데 sort($temp); 를 처리하게 되면 해당 $temp 값이 뭐로변하는지 등등을 다 봐야해요 ㅡ.ㅡ;

    그러면 한도 끝도 없이 확인을 해야하는데 대충 프로그래머들이 이 코드를 보고 유추해드릴 수 있는건, 댓글갯수를 비교해서 하나라도 데이터가 있으면 삭제를 하지 않는것으로 보여진다 이렇게 말할 수 밖에 없어요

    왜 그리 만들었는지는 당사자만 알죠 ㅡ.ㅡ;
  • profile
    웹지기 2017.09.17 15:57:24
    코드를 보고 분석이 안되는 케이스가 있다는 것은 코알못인 저로서는 잘 못알아듯겠네요. 일단 알겠습니다. 나중에 사용하게 되면 댓글이 있는 게시물이 삭제가 안되는지 실제로 돌려보고 확인해 볼게요.
  • profile
    람보 2017.09.17 16:00:09
    결론적인 작동은 댓글 카운터가 1이라도 반환된다면 삭제를 하지않도록 짜여진건 맞아요. 그이유는 왜그런지 모를뿐..
  • profile
    웹지기 2017.09.17 16:01:34
    그럼 애드온 설명에는 없지만 댓글이 달린 게시글은 보호하는 것으로 설계를 한 것이겠네요.
  • ?
    GLANCEYES 2017.09.17 15:08:46

    굳이 쿼리를 수정할 필요없이


    $oDocumentModel = &getModel('document');
    $oDocument = $oDocumentModel->getDocument($val->document_srl, false, false);

    추가하고

    if($oDocument->get('is_notice')!='Y'){}
    조건에 따라 저장하느냐 마느냐 해도 되지 않을까요?

  • profile
    람보 2017.09.17 15:14:44
    삭제 하는데 해당 게시글을 다시한번 쿼리해서 조건문 할 필요없습니다..

    조건을 걸어서 하면 하나의 쿼리로 끝나기 때문이지요..
    (물론 캐시에 저장해둔 데이터를 사용해서 오브젝트 캐시 사용하면 똑같지만 궂이 불필요한 액션이기에.. 그냥 원래 있는 것에 쿼리를 추가하는것이 더 빠르답니다..)
  • ?
    GLANCEYES 2017.09.17 15:20:22
    아 그렇군요! 제가 xml 쿼리문에 아직 익숙하지 않아서 애드온에서 설정으로 직접 변경하기 용이해서 위 방법을 자주 이용했는데 람보님께서 알려주신 방법대로도 공부해봐야겠습니다.

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