PageRenderTime 104ms CodeModel.GetById 61ms app.highlight 10ms RepoModel.GetById 30ms 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
  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 */
 24App::import("Model","Feed.Rss",true,array(BASER_PLUGINS));
 25App::import('Vendor','Feed.simplepie', true, array(BASER_PLUGINS)); // オブジェクトのシリアライズの問題があるのでここから動かさない事
 26/**
 27 * RSS取得モデルであるRssクラスを継承したクラス
 28 *
 29 * @package baser.plugins.feed.models
 30 */
 31class 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
 50		// simplepieでフィードを取得する
 51		$feed = $this->__getSimplePie($feedUrl,$cacheExpires);
 52
 53		// 指定カテゴリで絞り込む
 54		$feed['Items'] = $this->filteringCategory($feed['Items'],$category);
 55
 56		if (isset($feed['Items']) && $limit && count($feed['Items']>$limit)) {
 57			$feed['Items'] = @array_slice($feed['Items'], 0, $limit);
 58		}
 59
 60		return $feed;
 61
 62	}
 63/**
 64 * カテゴリで抽出する
 65 *
 66 * @param array $items
 67 * @param mixed $filterCategory
 68 * @return array $items
 69 * @access public
 70 */
 71	function filteringCategory($items,$filterCategory = null) {
 72
 73		if(!$items || !$filterCategory) {
 74			return $items;
 75		}
 76
 77		$_items = array();
 78		foreach($items as $item) {
 79
 80			if(empty($item['category']['value'])) continue;
 81
 82			/* 属しているカテゴリを取得 */
 83			$category = '';
 84			switch(gettype($item['category']['value'])) {
 85				case 'object':
 86					if(get_class($item['category']['value']) == 'SimplePie_Category') {
 87						$category = $item['category']['value']->term;
 88					}
 89					break;
 90				case 'string':
 91					$category = $item['category']['value'];
 92					break;
 93			}
 94
 95			// 該当するカテゴリのみを取得
 96			if(is_array($filterCategory)) {
 97				if(in_array($category,$filterCategory)) {
 98					$_items[] = $item;
 99				}
100			}else {
101				if($category == $filterCategory) {
102					$_items[] = $item;
103				}
104			}
105
106		}
107
108		return $_items;
109
110	}
111/**
112 * SimplePieでRSSを取得する
113 *
114 * @param string RSSのURL
115 * @param string キャッシュ保持期間
116 * @return array RSSデータ
117 * @access private
118 */
119	function __getSimplePie($url,$cacheExpires = null) {
120
121		if(!$url) {
122			return false;
123		}
124		if(Configure::read('Cache.check') == false || Configure::read('debug') > 0) {
125			// キャッシュをクリア
126			clearCache($this->__createCacheHash('', $url),'views','.rss');
127		}
128
129		// キャッシュを取得
130		$cachePath = $this->cacheFolder.$this->__createCacheHash('.rss', $url);
131		$rssData = cache($cachePath, null, $cacheExpires);
132
133		if (empty($rssData)) {
134
135			$feed = new SimplePie();
136			$feed->feed_url = $url;
137			$feed->enable_cache(false);
138
139			// 一旦デバッグモードをオフに
140			$debug = Configure::read('debug');
141			Configure::write('debug',0);
142
143			$ret = $feed->init();
144
145			Configure::write('debug',$debug);
146
147			if(!$ret) {
148				return false;
149			}
150
151			$rssData = $this->__convertSimplePie($feed->get_items());
152
153			// ログインしてなければキャッシュを作成
154			if(!isset($_SESSION['Auth']['User'])) {
155				cache($cachePath, serialize($rssData));
156				chmod(CACHE.$cachePath,0666);
157			}
158
159			if ($rssData) {
160				return $rssData;
161			}
162			else {
163				return false;
164			}
165
166		}else {
167			return unserialize($rssData);
168		}
169
170	}
171/**
172 * SimplePieで取得したデータを表示用に整形する
173 * 2009/09/09	ryuring
174 *				古いバージョンのSimplePieでは、WordPress2.8.4が出力するRSSを解析できない事が判明。
175 * 				SimplePie1.2に載せ換えて対応した。
176 * TODO			このままでは、itemがない場合、RSS自体の情報が取得できないので修正が必要
177 *
178 * @param string SimplePieで取得したデータ
179 * @return array RSSデータ
180 * @access private
181 */
182	function __convertSimplePie($datas) {
183
184		if(!$datas) {
185			return null;
186		}
187
188		$simplePie = $datas[0]->get_feed();
189		$feed['Channel']['title']['value'] = $simplePie->get_title();
190		$feed['Channel']['link']['value'] = $simplePie->get_link();
191		$feed['Channel']['description']['value'] = $simplePie->get_description();
192		$feed['Channel']['pubDate']['value'] = '';
193		$feed['Channel']['language']['value'] = $simplePie->get_language();
194		$feed['Channel']['generator']['value'] = 'baserCMS';
195		$feed['Items'] = array();
196
197		foreach($datas as $data) {
198
199			$tmp = array();
200			$tmp['title']['value'] = $data->get_title();
201			$tmp['link']['value'] = $data->get_link();
202			$tmp['pubDate']['value'] = date("r",strtotime($data->get_date('Y-m-d H:i:s')));
203			$tmp['dc:creator']['value'] = $data->get_author();
204			$cat = $data->get_category();
205			if($cat) {
206				$tmp['category']['value'] = $cat->get_term();
207			} else {
208				$tmp['category']['value'] = '';
209			}
210			$tmp['guid']['value'] = $data->get_id();
211			$tmp['guid']['attributes']['isPermaLink'] = $data->get_permalink();
212			$tmp['description']['value'] = $data->get_description();
213			$tmp['wfw:commentRss']['value'] = $data->get_title();
214
215			$tmp['encoded']['value'] = $data->get_content();
216			if(preg_match("/(<img.*?src=\"(.*?)\".*?\/>)/s", $tmp['encoded']['value'], $matches)) {
217				$tmp['img']['tag'] = $matches[1];
218				$tmp['img']['url'] = $matches[2];
219			}else {
220				$tmp['img']['tag'] = '';
221			}
222
223			$feed['Items'][] = $tmp;
224
225		}
226
227		//$feed['Channel']['title']['value'] = $datas['info']['title'];
228		//$feed['Channel']['link']['value'] = $datas['info']['link']['alternate'][0];
229		/*if(!empty($datas['info']['description']))
230			$feed['Channel']['description']['value'] = $datas['info']['description'];
231		if(!empty($datas['last-modified'])){
232			$feed['Channel']['pubDate']['value'] = $datas['last-modified'];
233		}*/
234		//$feed['Channel']['generator']['value'] = 'baserCMS';
235		/*if(!empty($datas['info']['language']))
236			$feed['Channel']['language']['value'] = $datas['info']['language'];*/
237
238		/*if(!empty($datas['items'])){
239            foreach($datas['items'] as $data){
240                $tmp = array();
241                $tmp['title']['value'] = $data->data['title'];
242                $tmp['link']['value'] = $data->data['link']['alternate'][0];
243                //$tmp['comments']['value'] = '';
244                if(!empty($data->data['pubdate'])){
245                    $tmp['pubDate']['value'] = date("r",$data->data['pubdate']);
246                }elseif(!empty($data->data['dc:date'])){
247                    $tmp['pubDate']['value'] = date("r",$data->data['dc:date']);
248                }
249                if(!empty($data->data['creator'][0]->name))
250                    $tmp['dc:creator']['value'] = $data->data['creator'][0]->name;
251                if(!empty($data->data['category'][0]))
252                    $tmp['category']['value'] = $data->data['category'][0];
253                $tmp['guid']['value'] = @$data->data['guid']['data'];
254                $tmp['guid']['attributes']['isPermaLink'] = @$data->data['guid']['permalink'];
255                if(!empty($data->data['description']))
256                    $tmp['description']['value'] = $data->data['description'];
257                $tmp['wfw:commentRss']['value'] = $data->data['title'];
258
259				if(!empty($data->data['encoded'])){
260					$tmp['encoded']['value'] = $data->data['encoded'];
261					if(preg_match("/(<img.*?src=\"(.*?)\".*?\/>)/s", $tmp['encoded']['value'], $matches)){
262						$tmp['img']['tag'] = $matches[1];
263						$tmp['img']['url'] = $matches[2];
264						
265					}else{
266						$tmp['img']['tag'] = '';
267					}
268				}
269				
270				$feed['Items'][] = $tmp;
271				
272            }
273        }else{
274            $feed['Items'] = array();
275        }*/
276		return $feed;
277
278	}
279	
280}
281?>