CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.0 |
문제 페이지 주소 | 비공개 (작성 후 5일 경과) |
RSS 게시판 업데이터( https://xe1.xpressengine.com/index.php?mid=download&package_srl=19519188 )에 관한 질문입니다.
일단, 라이믹스 1.9.8.1 버전 쓰고 있는데 안됩니다.
이거 사용할려면 수정할께 많다고 해서 약 3시간동안 구글링하면서 필요한 부분을 다 찾아냈습니다.
다만 문제는 이게 라이믹스에서도 동작할지는..;
XE 공홈에서 찾은 결과로는( https://xe1.xpressengine.com/tip/21738550 ),
"rssboard.cron.php를 열어서 define('__ZBXE__', true); 윗 부분에 define('__XE__', true); 를 추가" 하라고 하길래 추가했습니다.
그래서 rssboard.cron.php의 전체 소스는 (참고로 rssboard.cron.php 이건 rx설치되어있는 최상단에 위치해 있습니다)
/**
* @file rssboard.cron.php
* @author ChoiHeeChul, KimJinHwan, ParkSunYoung
* @brief RSS 게시판 업데이터 모듈을 주기적으로 실행시키기 위한 cron 용 스크립트 \n
* 참고사이트 http://www.moonseller.net/247
*/
define('__XE__', true);
define('__ZBXE__', true);
/**
* @brief 필요한 설정 파일들을 include
**/
require('./config/config.inc.php');
//require('./config/config.user.inc.php');
/**
* @brief Context 객체를 생성하여 초기화
* 모든 Request Argument/ 환경변수등을 세팅
**/
$oContext = &Context::getInstance();
$oContext->init();
include './modules/rssboard/rssboard.class.php';
include './modules/rssboard/rssboard.controller.php';
require_once './modules/document/document.class.php';
require_once './modules/document/document.model.php';
require_once './modules/document/document.controller.php';
// RSS 게시판 업데이터의 doCrawl 실행
$rssboard = new rssboardController();
$rssboard->init();
$ret = $rssboard->doCrawl();
print "{$ret->message}\n"; // webcron 서비스를 위해서 output 생성
$oContext->close();
?>
이렇게 됩니다.
이렇게 수정하면 되는줄 알았더니 뭐..역시 불러오지를 않는군요.
그래서 크론의 설정문제인가? 생각하고 웹크론 스샷을 찍어봤죠.
그래서 수동으로 크론작업을 해봤습니다. https://ungabi.ga/rssboard.cron.php 그냥 이주소 들어가봤죠.
그럼 'success' 라는 문구가 뜨더군요. 그런데 게시판 가보면 전혀 정상적으로 작동하지를 않네요.
또 검색질을 하던중 공홈에서
' 다만 설치된 php 버젼에 따라 rssboard.cron.php를 돌릴때 user-agent값이 null로 들어가는 경우가 있기 때문에 rssboard.controller.php 내용중 65라인 주변을 다음과 같이 수정해주셔야 합니다.(user-agent값 추가) '
$feed = new SimplePie();
$feed->force_feed();
$feed->set_feed_url($rssboard->rssurl);
$feed->enable_cache(false);
$feed->set_useragent("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)");
$feed->init();
이런식으로 수정을 해도 달라지는게 없습니다 ㅠㅠ
게시판 모듈 설정문제인가 또 생각이 들어 스샷을 찍어봤습니다.
rss를 수집할 url은 http://www.seoulwire.com/rss/allArticle.xml 입니다.
뭐가 문제인지 전혀 갈피가 안잡히네요.
밑에는 rss게시판 업데이터 모듈의 총 소스입니다
rssboard.admin.controller.php
/**
* @file rssboard.admin.controller.php
* @class rssboardAdminController
* @author ChoiHeeChul, KimJinHwan, ParkSunYoung
* @brief rssboard Admin Controller
**/
class rssboardAdminController extends rssboard {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 관리자 페이지에서 추가한 RSS 주소와 대상 게시판을 추가/업데이트
**/
function procRssboardAdminUpdate() {
// 기본 인자를 가져옴
$args = Context::getRequestVars();
$args->module_srl = $args->target_module;
// Database 적용
if (isset($args->rssboard_srl) )
{
$output = executeQuery('rssboard.updateRssboard',$args);
}
else
{
$args->rssboard_srl = getNextSequence();
$output = executeQuery('rssboard.insertRssboard',$args);
}
$this->setMessage('success_registed');
}
/**
* @brief 관리자 페이지에서 삭제한 업데이트 대상 RSS 를 삭제
**/
function procRssboardAdminDelete() {
// 대상 rss 게시판 번호를 가져와서 삭제.
$args->rssboard_srl = Context::get('rssboard_srl');
$output = executeQuery('rssboard.deleteRssboard',$args);
$this->setMessage('success_deleted');
}
}
?>
rssboard.admin.view.php
/**
* @file rssboard.admin.view.php
* @class rssboardAdminView
* @author ChoiHeeChul, KimJinHwan, ParkSunYoung
* @brief rssboard Admin View
**/
class rssboardAdminView extends rssboard {
/**
* @brief 초기화
**/
function init() {
// 템플릿 경로 지정 (board의 경우 tpl에 관리자용 템플릿 모아놓음)
$template_path = sprintf("%stpl/",$this->module_path);
$this->setTemplatePath($template_path);
}
/**
* @brief RSS 게시판 목록을 보여줌.
**/
function dispRssboardAdminContent() {
// RSS 게시판 목록을 페이징으로 보여줌
// board 모듈을 참고하였음
$args->sort_index = "rssboard_srl";
$args->page = Context::get('page');
$args->list_count = 20;
$args->page_count = 10;
$output = executeQueryArray('rssboard.getRssboardList', $args);
// 템플릿에 사용할 값들을 설정
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('rssboard_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 템플릿 파일 지정
$this->setTemplateFile('index');
}
/**
* @brief RSS 게시판 세부정보/수정 (게시판 입력과 동일)
**/
function dispRssboardAdminInfo() {
$this->dispRssboardAdminInsert() ;
}
/**
* @brief RSS 게시판 수정/입력
**/
function dispRssboardAdminInsert() {
// rssboard_srl 이 있을 경우 수정
$rssboard_srl = Context::get('rssboard_srl');
if (isset($rssboard_srl))
{
// DB 에서 이름,URL,카테고리 가져오기
$args->rssboard_srl = $rssboard_srl;
$output = executeQuery('rssboard.getRssboard', $args);
Context::set('rssname',$output->data->rssname);
Context::set('rssurl',$output->data->rssurl);
Context::set('category_srl',$output->data->category_srl);
// 대상 모듈 정보 가져오기
$oModuleModel = &getModel('module');
$target_module = $oModuleModel->getModuleInfoByModuleSrl($output->data->module_srl);
Context::set('target_module',$target_module);
// 대상 모듈의 카테고리 정보 가져오기
$oDocumentModel = &getModel('document');
$category_list = $oDocumentModel->getCategoryList($output->data->module_srl);
Context::set('category_list',$category_list);
}
$this->setTemplateFile('rss_insert');
}
}
?>
rssboard.class.php
/**
* @file rssboard.class.php
* @class rssboard
* @author ChoiHeeChul, KimJinHwan, ParkSunYoung
* @brief rssboard module의 최상위 클래스
*
* @mainpage RSS board updater Module
* @section intro 소개
* RSS 게시판 업데이터 모듈은 RSS로 공개되어 있는 외부 컨텐츠를 지속적으로 특정 게시판에 수집하는 모듈입니다. \n
* 기능
* - crontab 에 등록하여 주기적으로 업데이트 된 글을 등록
* - 출처에 따라 다른 분류로 등록
**/
class rssboard extends ModuleObject {
/**
* @brief 설치시 추가 작업이 필요할시 구현
**/
function moduleInstall() {
return new Object();
}
/**
* @brief 설치가 이상이 없는지 체크하는 method
**/
function checkUpdate() {
return false;
}
/**
* @brief 업데이트 실행
**/
function moduleUpdate() {
return new Object();
}
/**
* @brief 캐시 파일 재생성
**/
function recompileCache() {
}
}
?>
rssboard.controller.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('ungabi');
}
/**
* @brief rss 업데이트 대상 목록을 가져와서 각각 업데이트
**/
function doCrawl() {
$output = executeQueryArray('rssboard.getRssboardAll');
// 실패시 처리
if(!$output->toBool()) return $output;
foreach ($output->data as $val) {
$this->doUpdateRss($val);
}
return new Object(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);
}
}
?>
rssboard.view.php
/**
* @file rssboard.view.php
* @class rssboardView
* @author ChoiHeeChul, KimJinHwan, ParkSunYoung
* @brief rssview Controller
**/
class rssboardView extends rssboard {
/**
* @brief 초기화 / 게시글 작성을 위한 관리자 정보를 저장
**/
function init() {
}
/**
* @brief 특정 모듈의 카테고리 정보를 읽어온 후 JSON 으로 반환
**/
function dispRssboardCategoryList() {
// 대상 module_srl
$module_srl = Context::Get("module_srl");
$oDocumentModel = &getModel('document');
$category_list = $oDocumentModel->getCategoryList($module_srl);
// JSON 형식으로 변환
$i = 0;
$result = '{"categories":[';
foreach($category_list as $v)
{
if ($i!=0) $result .= ", ";
$i ++ ;
$result .= '{"category_srl":' . $v->category_srl . ',';
$result .= '"title":"' . $v->title . '"}';
}
$result .= ']}';
// 별도 헤더와 내용 출력 후 추가 처리를 방지하기 위해 종료
header ("Content-type: application/json; charset=UTF-8");
header ("Pragma: no-cache");
echo $result;
exit;
}
}
?>
아무리 생각해도 뭐가 문제인지 모르겠네요.
아예 처음부터 다시 다 뜯어고쳐야 하나요?
댓글 2