setId($tag); $oSite->setTitle($title); $oSite->setUpdated(date('YmdHis')); // 홈페이지 주소 $link_alternative = sprintf('http://%s', $GLOBALS['syndi_tag_domain']); $oSite->setLinkAlternative($link_alternative); $link_self = sprintf('%s?id=%s&type=%s',$GLOBALS['syndi_echo_url'],$tag,$args->type); $oSite->setLinkSelf($link_self); return $oSite; } /** * @brief Channel(게시판) 목록 **/ function Syndi_getChannelList($args) { global $g4; $where = ''; if($args->target_channel_id) $where .= " and b.bo_table='". mysql_real_escape_string($args->target_channel_id) . "'"; $sql = "select b.bo_table,b.bo_subject from " . $g4['board_table'] . " b, ". $g4['group_table'] . " g where b.bo_read_level=1 and b.bo_list_level=1 and g.gr_use_access=0 and g.gr_id = b.gr_id ". $where; $sql .= " order by b.gr_id,b.bo_table"; if($args->type=='channel') { $sql .= sprintf(" limit %s,%s", ($args->page-1)*$args->max_entry, $args->max_entry); } $result = sql_query($sql); $channel_list = array(); while($row = sql_fetch_array($result)) { $row['bo_subject'] = $row['bo_subject']?$row['bo_subject']:$row['bo_table']; $tag = SyndicationHandler::getTag('channel',$row['bo_table']); $oChannel = new SyndicationChannel; $oChannel->setId($tag); $oChannel->setTitle($row['bo_subject']); $oChannel->setType('web'); $oChannel->setUpdated(date('YmdHis')); $link_self = sprintf('%s?id=%s&type=%s',$GLOBALS['syndi_echo_url'],$tag,$args->type); $oChannel->setLinkSelf($link_self); // 게시판 웹주소 $link_alternative = sprintf('http://%s/bbs/board.php?bo_table=%s', $GLOBALS['syndi_tag_domain'], $row['bo_table']); $oChannel->setLinkAlternative($link_alternative); $channel_list[] = $oChannel; } sql_free_result($result); return $channel_list; } /** * @brief 모든 게시판의 게시물을 가져올때, 다음 게시판을 가져옴 **/ function _Syndi_getNextChannelId($channel_id=null) { global $g4; if(!$channel_id) { $sql = "select b.bo_table from " . $g4['board_table'] . " b, ". $g4['group_table'] . " g where b.bo_read_level=1 and b.bo_list_level=1 and g.gr_use_access=0 and g.gr_id = b.gr_id"; $sql .= " order by b.gr_id,b.bo_table limit 1"; $row = sql_fetch($sql); return $row['bo_table']; } $channel_id = mysql_real_escape_string($channel_id); $sql = "select b.bo_table from " . $g4['board_table'] . " b, ". $g4['group_table'] . " g where b.bo_table>'$channel_id' and b.bo_read_level=1 and b.bo_list_level=1 and g.gr_use_access=0 and g.gr_id = b.gr_id"; $sql .= " order by b.gr_id,b.bo_table limit 1"; $result = sql_query($sql); if(mysql_num_rows($result)==0) return false; $row = sql_fetch_array($result); sql_free_result($result); return $row['bo_table']; } /** * @brief 게시물 목록 **/ function Syndi_getArticleList($args) { global $g4; /* $args->target_content_id //게시물 번호 $args->target_channel_id //게시판 번호 $args->start_time //기간 $args->end_time $args->max_entry //출력 목록당 개수 $args->page //페이지 번호 $args->channel_id //모든 글 출력시 해당 게시판 */ // all channel articles mysql 3.X, 4.0.X 에서는 sub query가 되지 않는다. if(!$args->target_channel_id) { // $args->channel_id 가 없을 경우 첫번째 게시판을 가져온다. if(!$args->channel_id) $args->channel_id = _Syndi_getNextChannelId(); $args->target_channel_id = $args->channel_id; $article_list = Syndi_getArticleList($args); unset($args->target_channel_id); if(count($article_list)>0) return $article_list; return array(); } return _Syndi_getArticleList($args); } /** * @brief 게시물 목록 **/ function _Syndi_getArticleList($args) { global $g4; /* $args->target_content_id //게시물 번호 $args->target_channel_id //게시판 번호 $args->start_time //기간 $args->end_time $args->max_entry //출력 목록당 개수 $args->page //페이지 번호 */ $sql = "select count(*) as cnt from " . $g4['board_table'] . " b, ". $g4['group_table'] . " g where b.bo_table='" . mysql_real_escape_string($args->target_channel_id). "' and b.bo_read_level=1 and b.bo_list_level=1 and g.gr_use_access=0 and g.gr_id = b.gr_id"; $row = sql_fetch_array(sql_query($sql)); if($row['cnt']<1) return array(); $content_table = $t_board.'_'. $args->target_channel_id; $category_table = $t_category.'_'. $args->target_channel_id; // get article list $where = " and wr_is_comment=0 "; if($args->target_content_id) $where .= ' and wr_id='. mysql_real_escape_string($args->target_content_id); if($args->start_time) $where .= ' and wr_datetime >= '. _getTime($args->start_time); if($args->end_time) $where .= ' and wr_datetime <= '. _getTime($args->end_time); $sql = "select wr_id, ca_name, wr_subject, wr_content, mb_id, wr_name, wr_homepage, wr_email, wr_datetime, wr_last from " . $g4['write_prefix'] . $args->target_channel_id . " where 1=1" . $where; $sql .= " order by wr_id desc "; $sql .= sprintf(" limit %s,%s", ($args->page-1)*$args->max_entry, $args->max_entry); $result = sql_query($sql); $article_list = array(); while($row = sql_fetch_array($result)) { $oArticle = new SyndicationArticle; $tag = SyndicationHandler::getTag('article', $args->target_channel_id, $row['wr_id']); $oArticle->setId($tag); $oArticle->setTitle($row['wr_subject']); $oArticle->setContent($row['wr_content']); $oArticle->setType('web'); $oArticle->setCategory($row['ca_name']); $oArticle->setName($row['wr_name']); $oArticle->setEmail($row['wr_email']); $oArticle->setUrl($row['wr_homepage']); $oArticle->setPublished(date('YmdHis',_getTime($row['wr_datetime']))); if($row['wr_last']) $oArticle->setUpdated(date('YmdHis',_getTime($row['wr_last']))); // 게시판 웹주소 $link_channel_alternative = sprintf('http://%s/bbs/board.php?bo_table=%s',$GLOBALS['syndi_tag_domain'],$args->target_channel_id); // 게시물 웹주소 $link_alternative = $link_channel_alternative . '&wr_id=' . $row['wr_id']; $oArticle->setLinkChannel($tag); $oArticle->setLinkAlternative($link_alternative); $oArticle->setLinkChannelAlternative($link_channel_alternative); // add list $article_list[] = $oArticle; } sql_free_result($result); return $article_list; } /** * @brief 삭제 게시물 목록 * 삭제된 게시물에 대해 logging이 필요 **/ function Syndi_getDeletedList($args) { global $g4; $table = $g4['syndi_log_table']; // get delete article list $where = ''; if($args->target_content_id) $where .= " and content_id='" . mysql_real_escape_string($args->target_content_id) . "'"; if($args->target_channel_id) $where .= " and bbs_id='" . mysql_real_escape_string($args->target_channel_id) . "'"; if($args->start_time) $where .= ' and delete_date >= '. $args->start_time; if($args->end_time) $where .= ' and delete_date <= '. $args->end_time; $sql = "select content_id, bbs_id, title, link_alternative, delete_date from $table where 1=1" . $where; $sql .= " order by delete_date desc "; $sql .= sprintf(" limit %s,%s", ($args->page-1)*$args->max_entry, $args->max_entry); $result = sql_query($sql); $deleted_list = array(); while($row = sql_fetch_array($result)) { $oDeleted = new SyndicationDeleted; $tag = SyndicationHandler::getTag('article', $row['bbs_id'], $row['content_id']); $oDeleted->setId($tag); $oDeleted->setTitle($row['title']); $oDeleted->setUpdated($row['delete_date']); $oDeleted->setDeleted($row['delete_date']); if(substr($row['link_alternative'],0,2)=='./') { $row['link_alternative'] = 'http://' . $GLOBALS['syndi_tag_domain'] . substr($row['link_alternative'],1); } $oDeleted->setLinkAlternative($row['link_alternative']); $deleted_list[] = $oDeleted; } sql_free_result($result); return $deleted_list; } /** * @brief Channel 목록 출력시 다음 페이지 번호 * return array('page'=>다음 페이지); **/ function Syndi_getChannelNextPage($args) { global $g4; $where = ''; if($args->target_channel_id) $where .= " and bo_table='". mysql_real_escape_string($args->target_channel_id) . "'"; $count_sql = "select count(*) as cnt from " . $g4['board_table'] . " where bo_read_level=1 and bo_list_level=1 " .$where; $result = sql_query($count_sql); $row = sql_fetch_array($result); sql_free_result($result); $total_count = $row['cnt']; $total_page = ceil($total_count / $args->max_entry); if($args->page >= $total_page) { return false; } else { return array('page'=>$args->page+1); } } /** * @brief 게시물 목록 출력시 다음 페이지 * return array('page'=>다음 페이지, 'channel_id'=>다음 게시판) **/ function Syndi_getArticleNextPage($args) { global $g4; // 사이트 모든 글 if(!$args->target_channel_id) { // channel_id 라는 변수로 게시판id를 받는다 (mysql 3.x,4.0.x을 위해) if(!$args->channel_id) { $args->channel_id = _Syndi_getNextChannelId(); $args->all_channel = true; } $args->target_channel_id = $args->channel_id; $obj = _Syndi_getArticleNextPage($args); unset($args->target_channel_id, $args->all_channel); return $obj; } else { return _Syndi_getArticleNextPage($args); } } function _Syndi_getArticleNextPage($args) { global $g4; $sql = "select count(*) as cnt from " . $g4['board_table'] . " b, ". $g4['group_table'] . " g where b.bo_table='" . mysql_real_escape_string($args->target_channel_id). "' and b.bo_read_level=1 and b.bo_list_level=1 and g.gr_use_access=0 and g.gr_id = b.gr_id"; if($row['cnt']==0) return false; // get article list $where = " and wr_is_comment=0 "; if($args->target_content_id) $where .= ' and wr_id='. mysql_real_escape_string($args->target_content_id); if($args->start_time) $where .= ' and wr_datetime >= '. _getTime($args->start_time); if($args->end_time) $where .= ' and wr_datetime <= '. _getTime($args->end_time); $count_sql = "select count(*) as cnt from " . $g4['write_prefix'] . $args->target_channel_id . " where 1=1 " .$where; $result = sql_query($count_sql); $row = sql_fetch_array($result); sql_free_result($result); $total_count = $row['cnt']; $total_page = ceil($total_count / $args->max_entry); if($args->page >= $total_page) { if($args->all_channel) { $next_channel_id = _Syndi_getNextChannelId($args->target_channel_id); if(!$next_channel_id) return false; return array('page'=>1, 'channel_id'=>$next_channel_id); } else { return false; } } else { return array('page'=>$args->page+1); } } /** * @brief 게시물 삭제 목록 출력시 다음 페이지 번호 **/ function Syndi_getDeletedNextPage($args) { global $g4; $table = $g4['syndi_log_table']; // get delete article list $where = ''; if($args->target_content_id) $where .= " and no='" . mysql_real_escape_string($args->target_content_id) . "'"; if($args->target_channel_id) $where .= " and bbs_id='" . mysql_real_escape_string($args->target_channel_id) . "'"; if($args->start_time) $where .= ' and delete_date >= '. $args->start_time; if($args->end_time) $where .= ' and delete_date <= '. $args->end_time; $count_sql = "select count(*) as cnt from $table where 1=1" .$where; $result = sql_query($count_sql); $row = sql_fetch_array($result); sql_free_result($result); $total_count = $row['cnt']; $total_page = ceil($total_count / $args->max_entry); if($args->page >= $total_page) { return array('page'=>0); } else { return array('page'=>$args->page+1); } } function _getTime($date) { return strtotime($date); } $oSyndicationHandler = &SyndicationHandler::getInstance(); $oSyndicationHandler->registerFunction('site_info','Syndi_getSiteInfo'); $oSyndicationHandler->registerFunction('channel_list','Syndi_getChannelList'); $oSyndicationHandler->registerFunction('channel_next_page','Syndi_getChannelNextPage'); $oSyndicationHandler->registerFunction('article_list','Syndi_getArticleList'); $oSyndicationHandler->registerFunction('article_next_page','Syndi_getArticleNextPage'); $oSyndicationHandler->registerFunction('deleted_list','Syndi_getDeletedList'); $oSyndicationHandler->registerFunction('deleted_next_page','Syndi_getDeletedNextPage'); ?>