function testGetChannelInfo() { $r = new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $expected = array('title' => 'Test', 'link' => 'http://pear.php.net/', 'description' => 'This is a test channel for XML_RSS'); $actual = $r->getChannelInfo(); $this->assertEquals($expected, $actual); }
/** * リソースリクエスト実行 * * リモートURLにアクセスしてRSSだったら配列に、 * そうでなかったらHTTP Body文字列をリソースとして扱います。 * * @return BEAR_Ro * @throws BEAR_Resource_Execute_Exception */ public function request() { $reqMethod = array(); $reqMethod[BEAR_Resource::METHOD_CREATE] = HTTP_Request2::METHOD_POST; $reqMethod[BEAR_Resource::METHOD_READ] = HTTP_Request2::METHOD_GET; $reqMethod[BEAR_Resource::METHOD_UPDATE] = HTTP_Request2::METHOD_PUT; $reqMethod[BEAR_Resource::METHOD_DELETE] = HTTP_Request2::METHOD_DELETE; assert(isset($reqMethod[$this->_config['method']])); try { // 引数以降省略可能 config で proxy とかも設定可能 $request = new HTTP_Request2($this->_config['uri'], $reqMethod[$this->_config['method']]); $request->setHeader("user-agent", 'BEAR/' . BEAR::VERSION); $request->setConfig("follow_redirects", true); if ($this->_config['method'] === BEAR_Resource::METHOD_CREATE || $this->_config['method'] === BEAR_Resource::METHOD_UPDATE) { foreach ($this->_config['values'] as $key => $value) { $request->addPostParameter($key, $value); } } $response = $request->send(); $code = $response->getStatus(); $headers = $response->getHeader(); if ($code == 200) { $body = $response->getBody(); } else { $info = array('code' => $code, 'headers' => $headers); throw $this->_exception($response->getBody(), $info); } } catch (HTTP_Request2_Exception $e) { throw $this->_exception($e->getMessage()); } catch (Exception $e) { throw $this->_exception($e->getMessage()); } $rss = new XML_RSS($body, 'utf-8', 'utf-8'); PEAR::setErrorHandling(PEAR_ERROR_RETURN); // @todo Panda::setPearErrorHandling(仮称)に変更しエラーを画面化しないようにする $rss->parse(); $items = $rss->getItems(); if (is_array($items) && count($items) > 0) { $body = $items; $headers = $rss->getChannelInfo(); $headers['type'] = 'rss'; } else { $headers['type'] = 'string'; $body = array($body); } // UTF-8に $encode = mb_convert_variables('UTF-8', 'auto', $body); $ro = BEAR::factory('BEAR_Ro')->setBody($body)->setHeaders($headers); /* @var $ro BEAR_Ro */ PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array('Panda', 'onPearError')); return $ro; }
function parseRSS($filename, $showDetails, $showDescription, $path) { global $objDatabase, $_ARRAYLANG; if ($showDetails == 1) { $objResult = $objDatabase->Execute("SELECT id, FROM_UNIXTIME(xml_refresh, '%d. %M %Y %H:%i:%s') AS xml_refresh FROM " . DBPREFIX . "module_directory_dir WHERE rss_file='" . contrexx_addslashes($filename) . "'"); if ($objResult !== false) { while (!$objResult->EOF) { $this->rssRefresh = $objResult->fields['xml_refresh']; // Not used -- see below // $feedId = $objResult->fields['id']; $objResult->MoveNext(); } } } $filename = $this->mediaPath . $path . $filename; //rss class $rss = new \XML_RSS($filename); $rss->parse(); if ($showDetails == 1) { //channel info $info = $rss->getChannelInfo(); $this->rssTitle = $info['title']; //image foreach ($rss->getImages() as $img) { $this->rssImage = "<img src=" . $img['url'] . " alt='' /><br />"; } // TODO: Never used // $image = "<a href='".CONTREXX_SCRIPT_PATH."?section=Directory&linkid=$feedId' target='_blank'><img src='/images/modules/directory/rss.gif' border='0' alt='Source' /></a> "; $feeds = "<b>" . $this->rssTitle . "</b><br />" . $_ARRAYLANG['TXT_DIR_LAST_UPDATE'] . ": " . $this->rssRefresh . "<br />"; } //items $feeds .= "<ul>"; $x = 0; $limit = $this->settings['xmlLimit']['value']; foreach ($rss->getItems() as $value) { if ($x < $limit) { $feeds .= "<li><a href='" . $value['link'] . "' target='_blank'>" . $value['title'] . "</a><br />"; if ($showDescription == 1) { $feeds .= substr($value['description'], 0, 200); } $feeds .= "</li>"; $x++; } } $feeds .= "</ul>"; return $feeds; }
/** * Search keyword on OpenSearch compatible engine. * * @access public * @param string $query keyword * @return array */ function search($query) { $url = $this->_setupQuery($query); // trigger_error($url); $rss = new XML_RSS($url); array_push($rss->channelTags, 'OPENSEARCH:TOTALRESULTS', 'OPENSEARCH:STARTINDEX', 'OPENSEARCH:ITEMSPERPAGE'); $rss->parse(); $ch = $rss->getChannelInfo(); if (isset($ch['opensearch:totalresults'])) { $this->pager_param['totalResults'] = $ch['opensearch:totalresults']; } if (isset($ch['opensearch:itemsperpage'])) { $this->pager_param['itemsPerPage'] = $ch['opensearch:itemsperpage']; } if (isset($ch['opensearch:startindex'])) { $this->pager_param['startIndex'] = $ch['opensearch:startindex']; } return $rss->getItems(); }
function showNewsPreview($id) { global $objDatabase, $_ARRAYLANG; $query = "SELECT filename,\n FROM_UNIXTIME(time, '%d. %M %Y, %H:%i') AS time\n FROM " . DBPREFIX . "module_feed_news\n WHERE id = '" . $id . "'"; $objResult = $objDatabase->Execute($query); $filename = $this->feedpath . $objResult->fields['filename']; //rss class $rss = new \XML_RSS($filename); $rss->parse(); //channel info $info = $rss->getChannelInfo(); echo "<b>" . strip_tags($info['title']) . "</b><br />"; echo $_ARRAYLANG['TXT_FEED_LAST_UPDATE'] . ": " . $objResult->fields['time'] . "<br />"; //image foreach ($rss->getImages() as $img) { if ($img['url'] != '') { echo '<img src="' . strip_tags($img['url']) . '" /><br />'; } } echo '<br />'; echo '<i>' . $_ARRAYLANG['TXT_FEED_MESSAGE_IMPORTANT'] . '</i><br />'; //items foreach ($rss->getItems() as $value) { echo '<li>' . strip_tags($value['title']) . '</li>'; } }