PageRenderTime 40ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/baser/plugins/feed/models/rss_ex.php

https://github.com/hashing/basercms
PHP | 281 lines | 119 code | 37 blank | 125 comment | 25 complexity | fcbb17653bac4fe8345817315cd74950 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. // TODO 未検証
  3. /* SVN FILE: $Id$ */
  4. /**
  5. * RSS取得モデルであるRssクラスを継承したクラス
  6. *
  7. * PHP versions 5
  8. *
  9. * baserCMS : Based Website Development Project <http://basercms.net>
  10. * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
  11. *
  12. * @copyright Copyright 2008 - 2012, baserCMS Users Community
  13. * @link http://basercms.net baserCMS Project
  14. * @package baser.plugins.feed.models
  15. * @since baserCMS v 0.1.0
  16. * @version $Revision$
  17. * @modifiedby $LastChangedBy$
  18. * @lastmodified $Date$
  19. * @license http://basercms.net/license/index.html
  20. */
  21. /**
  22. * Include files
  23. */
  24. App::import("Model","Feed.Rss",true,array(BASER_PLUGINS));
  25. App::import('Vendor','Feed.simplepie', true, array(BASER_PLUGINS)); // オブジェクトのシリアライズの問題があるのでここから動かさない事
  26. /**
  27. * RSS取得モデルであるRssクラスを継承したクラス
  28. *
  29. * @package baser.plugins.feed.models
  30. */
  31. class RssEx extends Rss {
  32. /**
  33. * キャッシュフォルダー
  34. * @var string
  35. * @access public
  36. */
  37. var $cacheFolder = 'views';
  38. /**
  39. * データを削除する(ログ記録オプション付)
  40. *
  41. * @param string RSSのURL
  42. * @param int 取得する件数
  43. * @param string キャッシュ保持期間
  44. * @param string 抽出するカテゴリ
  45. * @return array RSSデータ
  46. * @access public
  47. */
  48. function findAll($feedUrl, $limit = 10, $cacheExpires = null,$category = null) {
  49. // simplepieでフィードを取得する
  50. $feed = $this->__getSimplePie($feedUrl,$cacheExpires);
  51. // 指定カテゴリで絞り込む
  52. $feed['Items'] = $this->filteringCategory($feed['Items'],$category);
  53. if (isset($feed['Items']) && $limit && count($feed['Items']>$limit)) {
  54. $feed['Items'] = @array_slice($feed['Items'], 0, $limit);
  55. }
  56. return $feed;
  57. }
  58. /**
  59. * カテゴリで抽出する
  60. *
  61. * @param array $items
  62. * @param mixed $filterCategory
  63. * @return array $items
  64. * @access public
  65. */
  66. function filteringCategory($items,$filterCategory = null) {
  67. if(!$items || !$filterCategory) {
  68. return $items;
  69. }
  70. $_items = array();
  71. foreach($items as $item) {
  72. if(empty($item['category']['value'])) continue;
  73. /* 属しているカテゴリを取得 */
  74. $category = '';
  75. switch(gettype($item['category']['value'])) {
  76. case 'object':
  77. if(get_class($item['category']['value']) == 'SimplePie_Category') {
  78. $category = $item['category']['value']->term;
  79. }
  80. break;
  81. case 'string':
  82. $category = $item['category']['value'];
  83. break;
  84. }
  85. // 該当するカテゴリのみを取得
  86. if(is_array($filterCategory)) {
  87. if(in_array($category,$filterCategory)) {
  88. $_items[] = $item;
  89. }
  90. }else {
  91. if($category == $filterCategory) {
  92. $_items[] = $item;
  93. }
  94. }
  95. }
  96. return $_items;
  97. }
  98. /**
  99. * SimplePieでRSSを取得する
  100. *
  101. * @param string RSSのURL
  102. * @param string キャッシュ保持期間
  103. * @return array RSSデータ
  104. * @access private
  105. */
  106. function __getSimplePie($url,$cacheExpires = null) {
  107. if(!$url) {
  108. return false;
  109. }
  110. if(Configure::read('Cache.check') == false || Configure::read('debug') > 0) {
  111. // キャッシュをクリア
  112. clearCache($this->__createCacheHash('', $url),'views','.rss');
  113. }
  114. // キャッシュを取得
  115. $cachePath = $this->cacheFolder.$this->__createCacheHash('.rss', $url);
  116. $rssData = cache($cachePath, null, $cacheExpires);
  117. if (empty($rssData)) {
  118. $feed = new SimplePie();
  119. $feed->feed_url = $url;
  120. $feed->enable_cache(false);
  121. // 一旦デバッグモードをオフに
  122. $debug = Configure::read('debug');
  123. Configure::write('debug',0);
  124. $ret = $feed->init();
  125. Configure::write('debug',$debug);
  126. if(!$ret) {
  127. return false;
  128. }
  129. $rssData = $this->__convertSimplePie($feed->get_items());
  130. // ログインしてなければキャッシュを作成
  131. if(!isset($_SESSION['Auth']['User'])) {
  132. cache($cachePath, serialize($rssData));
  133. chmod(CACHE.$cachePath,0666);
  134. }
  135. if ($rssData) {
  136. return $rssData;
  137. }
  138. else {
  139. return false;
  140. }
  141. }else {
  142. return unserialize($rssData);
  143. }
  144. }
  145. /**
  146. * SimplePieで取得したデータを表示用に整形する
  147. * 2009/09/09 ryuring
  148. * 古いバージョンのSimplePieでは、WordPress2.8.4が出力するRSSを解析できない事が判明。
  149. * SimplePie1.2に載せ換えて対応した。
  150. * TODO このままでは、itemがない場合、RSS自体の情報が取得できないので修正が必要
  151. *
  152. * @param string SimplePieで取得したデータ
  153. * @return array RSSデータ
  154. * @access private
  155. */
  156. function __convertSimplePie($datas) {
  157. if(!$datas) {
  158. return null;
  159. }
  160. $simplePie = $datas[0]->get_feed();
  161. $feed['Channel']['title']['value'] = $simplePie->get_title();
  162. $feed['Channel']['link']['value'] = $simplePie->get_link();
  163. $feed['Channel']['description']['value'] = $simplePie->get_description();
  164. $feed['Channel']['pubDate']['value'] = '';
  165. $feed['Channel']['language']['value'] = $simplePie->get_language();
  166. $feed['Channel']['generator']['value'] = 'baserCMS';
  167. $feed['Items'] = array();
  168. foreach($datas as $data) {
  169. $tmp = array();
  170. $tmp['title']['value'] = $data->get_title();
  171. $tmp['link']['value'] = $data->get_link();
  172. $tmp['pubDate']['value'] = date("r",strtotime($data->get_date('Y-m-d H:i:s')));
  173. $tmp['dc:creator']['value'] = $data->get_author();
  174. $cat = $data->get_category();
  175. if($cat) {
  176. $tmp['category']['value'] = $cat->get_term();
  177. } else {
  178. $tmp['category']['value'] = '';
  179. }
  180. $tmp['guid']['value'] = $data->get_id();
  181. $tmp['guid']['attributes']['isPermaLink'] = $data->get_permalink();
  182. $tmp['description']['value'] = $data->get_description();
  183. $tmp['wfw:commentRss']['value'] = $data->get_title();
  184. $tmp['encoded']['value'] = $data->get_content();
  185. if(preg_match("/(<img.*?src=\"(.*?)\".*?\/>)/s", $tmp['encoded']['value'], $matches)) {
  186. $tmp['img']['tag'] = $matches[1];
  187. $tmp['img']['url'] = $matches[2];
  188. }else {
  189. $tmp['img']['tag'] = '';
  190. }
  191. $feed['Items'][] = $tmp;
  192. }
  193. //$feed['Channel']['title']['value'] = $datas['info']['title'];
  194. //$feed['Channel']['link']['value'] = $datas['info']['link']['alternate'][0];
  195. /*if(!empty($datas['info']['description']))
  196. $feed['Channel']['description']['value'] = $datas['info']['description'];
  197. if(!empty($datas['last-modified'])){
  198. $feed['Channel']['pubDate']['value'] = $datas['last-modified'];
  199. }*/
  200. //$feed['Channel']['generator']['value'] = 'baserCMS';
  201. /*if(!empty($datas['info']['language']))
  202. $feed['Channel']['language']['value'] = $datas['info']['language'];*/
  203. /*if(!empty($datas['items'])){
  204. foreach($datas['items'] as $data){
  205. $tmp = array();
  206. $tmp['title']['value'] = $data->data['title'];
  207. $tmp['link']['value'] = $data->data['link']['alternate'][0];
  208. //$tmp['comments']['value'] = '';
  209. if(!empty($data->data['pubdate'])){
  210. $tmp['pubDate']['value'] = date("r",$data->data['pubdate']);
  211. }elseif(!empty($data->data['dc:date'])){
  212. $tmp['pubDate']['value'] = date("r",$data->data['dc:date']);
  213. }
  214. if(!empty($data->data['creator'][0]->name))
  215. $tmp['dc:creator']['value'] = $data->data['creator'][0]->name;
  216. if(!empty($data->data['category'][0]))
  217. $tmp['category']['value'] = $data->data['category'][0];
  218. $tmp['guid']['value'] = @$data->data['guid']['data'];
  219. $tmp['guid']['attributes']['isPermaLink'] = @$data->data['guid']['permalink'];
  220. if(!empty($data->data['description']))
  221. $tmp['description']['value'] = $data->data['description'];
  222. $tmp['wfw:commentRss']['value'] = $data->data['title'];
  223. if(!empty($data->data['encoded'])){
  224. $tmp['encoded']['value'] = $data->data['encoded'];
  225. if(preg_match("/(<img.*?src=\"(.*?)\".*?\/>)/s", $tmp['encoded']['value'], $matches)){
  226. $tmp['img']['tag'] = $matches[1];
  227. $tmp['img']['url'] = $matches[2];
  228. }else{
  229. $tmp['img']['tag'] = '';
  230. }
  231. }
  232. $feed['Items'][] = $tmp;
  233. }
  234. }else{
  235. $feed['Items'] = array();
  236. }*/
  237. return $feed;
  238. }
  239. }
  240. ?>