Q&A

RSS 게시판은, 대부분의 Addon이나 Module이 적용되지 않습니다.

2019.10.27 12:03
372
0
CMS/프레임워크 Rhymix 1.9
개발 언어 PHP 7.2

안녕하세요.

RSS 게시판 관련해서 궁금한 사항이 있어 글을 남깁니다.

 

RSS 게시판을 통해 가져온 게시글은  대부분의 Addon 이나 Module이 해당 게시판에 적용이 되지 않습니다.

(썸네일 Addon, 링크파싱 Module, 링크파싱 addon,  텔레그램알람, 이메일 알람 등)

테스트 한 것 중에 딱 하나 되더라구요. (미디어 플레이어 애드온 : 플레이어는 동작하지만 썸네일은 안됨)

 

물론, 게시판을 통해 가져온 글을 수정버튼을 누르고 다시 저장을 누르면 addon 이나 Module이 모두 적용이 됩니다.

 

처음에는 addon 이나 module 문제로 봤었는데요. 왜냐하면 미디어 플레이어애드온의 플레이어는 동작을 해서...

그런데 곰곰히 생각해보니,

단순히 RSS Board가 DB에 글을 뿌려준다면 애드온이나 모듈이 당연히 동작을 안할거라는 생각이 들었습니다.

글을 작성하거나 수정을 한게 아니라 단순히 DB에 저장된 정보를 가지고 온거라..

 

혹시 제가 생각한게 맞을까요?

아래 코드에서 뭔가를 수정하면 모든 애드온과 모듈이 동작할것 같은데 혹시 고수님들 알수 있을까요?

 

 

아래는 RSS Board의 rssboard.admin.controller 파일입니다.

RSS module은  https://xe1.xpressengine.com/index.php?mid=download&package_srl=19519188  를 이용했습니다.

 

<?php
    /**
     * @file    rssboard.controller.php
     * @class     rssboardController
     * @author    ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief     rssboard Controller
     **/

require_once('./modules/rssboard/simplepie.inc');


class rssboardController extends rssboard {
    
    
    /**
     * @brief 초기화 / 게시글 작성을 위한 관리자 정보를 저장
    **/    
    function init() {
        $oMemberModel = &getModel('member');
        $this->admin_info = $oMemberModel->getMemberInfoByUserID('supiabot');        
    }
    
    /**
     * @brief rss 업데이트 대상 목록을 가져와서 각각 업데이트
     **/
    function doCrawl() {

        $output = executeQueryArray('rssboard.getRssboardAll');    
    
        // 실패시 처리
        if(!$output->toBool()) return $output;
        
        foreach ($output->data as $val) {
            $this->doUpdateRss($val);
        }
        
        return new BaseObject(0,'success');
        }
        
        /**
         * @brief 각 개별 RSS 를 업데이트
         **/
        function doUpdateRss($rssboard)
        {
        if( !isset($rssboard) || !isset($rssboard->rssurl) )
            return ;
    
        // 최종 업데이트 기준일 가져오기
        $last_updatedate = 0;
        if( $rssboard->updatedate!=0 )
        {
            $last_updatedate = $this->getRegdateTime($rssboard->updatedate);
            
            // 최종 업데이트 시간이 10분 이내면 무시
            if( time() < ($last_updatedate + 600) )
                return ;
        }
        
        // document module의 controller 객체 생성
        $oDocumentController = &getController('document');    
        
        // 현재 시간을 업데이트 시간으로 설정
        $updatetime = date('YmdHis');
                    
        // SimplePie Library 를 이용해 RSS 가져오기        
        $feed = new SimplePie();
        $feed->force_feed();
        $feed->set_feed_url($rssboard->rssurl);
        $feed->enable_cache(false);
        $feed->init();
        $items = $feed->get_items();
        
        $link = $rssboard->rssurl;
            
        // 최종 업데이트 일 이후에 작성된 글을 대상 게시판에 추가
        foreach(array_reverse($items,true) as $item)
        {
            if ($last_updatedate > $item->get_date('U') )
            continue;
            $obj = null;
            $obj->title = htmlspecialchars_decode($item->get_title());
            
            // item link 를 가져오지 못할 경우 불가피하게 RSS 주소 사용
            if($item->get_link())
            $link = $item->get_link();
            
            $obj->content =  $item->get_description() . "<br/><br/><br/> 원문출처 : <a href='" . $item->get_link() . "' target='_blank'>" . $item->get_link() . "</a>";
            $obj->module_srl = $rssboard->module_srl;
            $obj->member_srl = $this->admin_info->member_srl;
            $obj->user_id =  $this->admin_info->user_id;
            $obj->user_name =  $this->admin_info->user_name;
            $obj->nick_name =  $this->admin_info->nick_name;
            $obj->email_address =  $this->admin_info->email_address;
            $obj->regdate = $item->get_date('YmdHis');
            $obj->category_srl = $rssboard->category_srl;
            $obj->allow_comment = 'Y';
    
            $output=$oDocumentController->insertDocument($obj,true);
        }
        
        // 최종 업데이트 시간 저장
        $args = null;
        $args->updatetime = $updatetime;
        $args->rssboard_srl = $rssboard->rssboard_srl;
        $output = executeQuery('rssboard.updateRssboardDate',$args);
    }
    
    /**
    * @brief DB에 저장된 시간을 unixtimestamp 로 변환 /n
    * document.item.php 에서 차용
    */
    function getRegdateTime($regdate) {
        $year = substr($regdate,0,4);
        $month = substr($regdate,4,2);
        $day = substr($regdate,6,2);
        $hour = substr($regdate,8,2);
        $min = substr($regdate,10,2);
        $sec = substr($regdate,12,2);
        return mktime($hour,$min,$sec,$month,$day,$year);
    }
}
?>
 

끝까지 읽어주셔서 정말 감사합니다.

복받으실겁니다.

수피안 Lv. 3

댓글 7

  • 2019.10.27 12:23 #1283676

    안되는게 대부분 입니다. 애드온 등 이 작동 시점이 write act 시점인 경우 작동을 안합니다. rss게시판 모듈로 글이 입력될 경우 insert act 로 글이 입력되기 때문이고 모듈의 경우 트리거를 이용해 동작이 되지만 사용하시려는 모듈에서 적용(수정) 되어야 하는 부분입니다.

    파싱 모듈,애드온은 그것과 상관 없이 퍼온 글의 링크가 p태그로 김싸져 있어야 동작합니다.

  • 2019.10.27 12:34 #1283685

    답변 정말 감사 드립니다. 공부는 조금씩 하고 있지만 방법을 모르겠네요. ㅠㅠ 수정을 하려면 RSS Module을 수정해야 한다는 말씀이 맞는거죠?

     

     

                $obj->content =  $item->get_description() . "<br/><br/><br/> 원문출처 : <a href='" . $item->get_link() . "' target='_blank'>" . $item->get_link() . "</a>";

    get_link()   이걸 <P> 태그로 감싼다면 가능할것 같은 느낌이. ^^;;

  • 2019.10.27 12:54 #1283694
    링크파싱모듈,링크파싱애드온의 경우 본문에 링크가 p태그 안에 있으면 동작합니다. 이 두 자료는 글이 어떻게 작성되었던 p태그 안에 링크가 있다면 동작합니다.
  • 2019.10.27 12:57 #1283698

    RSS 게시판 모듈 입장에서는 DB에 내용을 직접 쑤셔넣은 것이 아니라 XE에서 글쓰기 표준으로 제공하는 $oDocumentController->insertDocument() 함수를 정상적으로 사용했으니 할 일을 다 한 셈입니다.

     

    위에서 언급된 것처럼 <p> 태그로 내용을 감싸주는 정도는 추가로 할 수 있겠지만, 그것과 무관하게 동작하지 않는 애드온이 있다면 그건 RSS 게시판의 문제가 아니라 애드온의 문제입니다.

     

    새 글이 등록될 때 X를 해라, 가 아니라 유저가 글쓰기 폼을 제출하면 X를 해라, 라는 방식으로 구현되어 있기 때문에 글쓰기 폼을 수동으로 제출하지 않으면 동작하지 않는 애드온이 태반입니다.

  • 2019.10.27 13:13 #1283718
    네. 답변 정말 감사합니다. 문법을 제대로 모르다 보니 제가 잘못 생각했군요. 좋은 글 정말 감사합니다. 조금씩 공부하면서 연구해야겠네요.
  • 2019.10.27 14:00 #1283744
    그냥 앞뒤로 <p></p> 넣으니 해결했습니다. 알람이나 썸네일은 안되는데 이건 연구해 볼께요. 윗 두분 감사합니다.
  • 2019.10.27 14:04 #1283749
    다른 모듈이나 애드온은 위에 설명한대로 조금 고쳐서 될게 아닙니다.