Jak zmienić ten kod aby poprawnie działał
Kod
<?php
/*
+--------------------------------------------------+
| Author: Allan Irvine
<ai@ayrsoft.com> |
+--------------------------------------------------+
| Date: WED
03 MARCH 2004 |
+--------------------------------------------------+
| Origin: Scotland, United kingdom |
+--------------------------------------------------+
| Script: newsReader.php
|
+--------------------------------------------------+
| No License
|
| free to use for personal and commercial purposes |
+--------------------------------------------------+
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++
// CHANGES
//---------------------------------------------------
// Added a property $ampReplace, this is a
quick fix
// it is used to replace ampersands bfore php get a hold of
// the rss file, and
replace it once php has dealt with it
// I was getting lines split by an ampersand, pointed out
by
// Mathew Clark of Divergent Systems, cheers.
// I will need to address this later on as I
deem this fix
// as a bit of a kludge, not nice.
// Allan Irvine <airvine@ayrsoft.com>
// 29th
April 2004
//----------------------------------------------------
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++
class newsReader{
var $content =
array();
var $openTag = array();
var $closeTag = array();
var
$currentTag;
var $rss;
var $level;
var $startCollecting;
var $wantedElements;
var $cacheData;
var $ampReplace;
function newsReader(){
$this->rss =
xml_parser_create();
xml_set_object($this->rss, $this);
xml_parser_set_option($this->rss,XML_OPTION_CASE_FOLDING,1);
xml_set_element_handler($this->rss,_startElement,_endElement);
xml_set_character_data_handler($this->rss,_parseData);
$this->wantedElements['CHANNEL']
= array("TITLE","DESCRIPTION","LINK","IMAGES");
$this->wantedElements['IMAGE']
= array("URL");
$this->wantedElements['ITEM'] =
array("TITLE","DESCRIPTION","LINK");
}
function _findLevel($n){
if(eregi("(CHANNEL)|(IMAGE)|(ITEM)",$n,$regs)){
$this->level =
$regs[0];
}
}
function _startToCollect($n){
$this->startCollecting = (in_array($n,$this->wantedElements[$this->level]))?1:0;
}
function _startElement($t,$name,$attribs){
$this->currentTag = $name;
$this->_findLevel($name);
$this->_startToCollect($name);
if($this->startCollecting){
$this->openTag[]="<tr><td>\n";
}
}
function _endElement($t,$name){
if($this->startCollecting)
$this->closeTag[]="</td></tr>\n";
}
function _parseData($t,$cData){
$cData = str_replace($this->ampReplace,"&",$cData);// quick fix, will need to address later on
if(strlen(trim($cData))&&($this->startCollecting)){
if(eregi("link",$this->currentTag)){
$this->content[]="<A
HREF=\"".$cData."\" TARGET=\"_BLANK\">".$cData."</A>\n";
}elseif(eregi("url",$this->currentTag)){
$this->content[]="<IMG
SRC=\"".$cData."\">\n";
}else{
$this->content[]=$cData;
}
}
}
function
readNewsFeed($source){
$this->_readCacheData();
if($this->_useCache($source)){
$this->_writeCacheEntry($source);
$file = file("newsCache/".md5($source));
}else{
$file =
file($source);
}
$file = implode("\n",$file);
$this->ampReplace = md5(time());// quick fix, will need to address later on
$file = str_replace("&",$this->ampReplace,$file);// quick fix, will need to address later on
if(!xml_parse($this->rss,$file,1)){
$ln =
xml_get_current_line_number($this->rss);
$msg =
xml_error_string(xml_get_error_code($this->rss));
return ("An XML
error occurred on line $ln: $msg");
}else{
$rtn =
"<TABLE border=0>\n";
for($i=0;$i<count($this->openTag);$i++){
$rtn.= $this->openTag[$i].$this->content[$i].$this->closeTag[$i];
}
$rtn.="</TABLE>\n";
if(!$this->_useCache($source)){
$this->_writeCacheEntry($source);
}
return $rtn;
}
}
function _checkCacheDir(){
if(!is_dir("newsCache")){
mkdir("newsCache");
}
}
function _readCacheData(){
$file = file("newsCache/newsReaderCache.php");
if(strlen(trim($file[0]))){
$this->cacheData = unserialize($file[0]);
}
}
function _useCache($source){
if($key =
array_search($source,$this->cacheData)){
$sec = explode(" ",$key);
if((time() - $sec[1])>(3600)){
return 0;
}else{
return 1;
}
}else{
return 0;
}
}
function _writeCacheEntry($source){
$this->_checkCacheDir();
$this->_updateCacheArray($source);
$fp =
fopen("newsCache/newsReaderCache.php","w");
fwrite($fp,serialize($this->cacheData));
fclose($fp);
$data =
file($source);
$data = implode("\n",$data);
$fp =
fopen("newsCache/".md5($source),"w");
fwrite($fp,$data);
fclose($fp);
}
function _updateCacheArray($source){
if(is_array($this->cacheData) &&
in_array($source,$this->cacheData)){
foreach($this->cacheData as
$key=>$val){
if(trim($val) == trim($source)){
$key =microtime();
}
$new[$key]= $val;
}
$this->cacheData = $new;
}else{
$this->cacheData[microtime()] = $source;
}
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// test data below
once you are happy how it works just remove this stuff
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//bbc news
stories
$newsSources['AA'] ['<input type=text name=imie>']="$imie";
?>
<style
type=text/css><!--
td {
font-family:arial,verdana,tahoma;
font-size:12px;
background-color:#f0f0f0;
color:#000000;
}
--></style>
<?php
foreach($newsSources as
$name=>$array){
echo $name;
echo "<form method=post
action=".$_SERVER['PHP_SELF'].">\n";
echo "<select name=source>\n";
foreach($array as
$key=>$val){
$sel = ($val == $source)? " SELECTED " : "";
echo "<option
$sel value=$val>$key\n";
}
echo "</select>\n";
echo "<input type=submit name=go
value=Go>\n";
echo "</form>\n";
}
//++++++++++++++++
// script usage |
//++++++++++++++++
#$source = "http://www.newscientist.com/syndication/news.rdf";
#$go = 1;
if($go){
$feed =
new newsReader;
echo $feed->readNewsFeed($source);
}
?>
/*
+--------------------------------------------------+
| Author: Allan Irvine
<ai@ayrsoft.com> |
+--------------------------------------------------+
| Date: WED
03 MARCH 2004 |
+--------------------------------------------------+
| Origin: Scotland, United kingdom |
+--------------------------------------------------+
| Script: newsReader.php
|
+--------------------------------------------------+
| No License
|
| free to use for personal and commercial purposes |
+--------------------------------------------------+
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++
// CHANGES
//---------------------------------------------------
// Added a property $ampReplace, this is a
quick fix
// it is used to replace ampersands bfore php get a hold of
// the rss file, and
replace it once php has dealt with it
// I was getting lines split by an ampersand, pointed out
by
// Mathew Clark of Divergent Systems, cheers.
// I will need to address this later on as I
deem this fix
// as a bit of a kludge, not nice.
// Allan Irvine <airvine@ayrsoft.com>
// 29th
April 2004
//----------------------------------------------------
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++
class newsReader{
var $content =
array();
var $openTag = array();
var $closeTag = array();
var
$currentTag;
var $rss;
var $level;
var $startCollecting;
var $wantedElements;
var $cacheData;
var $ampReplace;
function newsReader(){
$this->rss =
xml_parser_create();
xml_set_object($this->rss, $this);
xml_parser_set_option($this->rss,XML_OPTION_CASE_FOLDING,1);
xml_set_element_handler($this->rss,_startElement,_endElement);
xml_set_character_data_handler($this->rss,_parseData);
$this->wantedElements['CHANNEL']
= array("TITLE","DESCRIPTION","LINK","IMAGES");
$this->wantedElements['IMAGE']
= array("URL");
$this->wantedElements['ITEM'] =
array("TITLE","DESCRIPTION","LINK");
}
function _findLevel($n){
if(eregi("(CHANNEL)|(IMAGE)|(ITEM)",$n,$regs)){
$this->level =
$regs[0];
}
}
function _startToCollect($n){
$this->startCollecting = (in_array($n,$this->wantedElements[$this->level]))?1:0;
}
function _startElement($t,$name,$attribs){
$this->currentTag = $name;
$this->_findLevel($name);
$this->_startToCollect($name);
if($this->startCollecting){
$this->openTag[]="<tr><td>\n";
}
}
function _endElement($t,$name){
if($this->startCollecting)
$this->closeTag[]="</td></tr>\n";
}
function _parseData($t,$cData){
$cData = str_replace($this->ampReplace,"&",$cData);// quick fix, will need to address later on
if(strlen(trim($cData))&&($this->startCollecting)){
if(eregi("link",$this->currentTag)){
$this->content[]="<A
HREF=\"".$cData."\" TARGET=\"_BLANK\">".$cData."</A>\n";
}elseif(eregi("url",$this->currentTag)){
$this->content[]="<IMG
SRC=\"".$cData."\">\n";
}else{
$this->content[]=$cData;
}
}
}
function
readNewsFeed($source){
$this->_readCacheData();
if($this->_useCache($source)){
$this->_writeCacheEntry($source);
$file = file("newsCache/".md5($source));
}else{
$file =
file($source);
}
$file = implode("\n",$file);
$this->ampReplace = md5(time());// quick fix, will need to address later on
$file = str_replace("&",$this->ampReplace,$file);// quick fix, will need to address later on
if(!xml_parse($this->rss,$file,1)){
$ln =
xml_get_current_line_number($this->rss);
$msg =
xml_error_string(xml_get_error_code($this->rss));
return ("An XML
error occurred on line $ln: $msg");
}else{
$rtn =
"<TABLE border=0>\n";
for($i=0;$i<count($this->openTag);$i++){
$rtn.= $this->openTag[$i].$this->content[$i].$this->closeTag[$i];
}
$rtn.="</TABLE>\n";
if(!$this->_useCache($source)){
$this->_writeCacheEntry($source);
}
return $rtn;
}
}
function _checkCacheDir(){
if(!is_dir("newsCache")){
mkdir("newsCache");
}
}
function _readCacheData(){
$file = file("newsCache/newsReaderCache.php");
if(strlen(trim($file[0]))){
$this->cacheData = unserialize($file[0]);
}
}
function _useCache($source){
if($key =
array_search($source,$this->cacheData)){
$sec = explode(" ",$key);
if((time() - $sec[1])>(3600)){
return 0;
}else{
return 1;
}
}else{
return 0;
}
}
function _writeCacheEntry($source){
$this->_checkCacheDir();
$this->_updateCacheArray($source);
$fp =
fopen("newsCache/newsReaderCache.php","w");
fwrite($fp,serialize($this->cacheData));
fclose($fp);
$data =
file($source);
$data = implode("\n",$data);
$fp =
fopen("newsCache/".md5($source),"w");
fwrite($fp,$data);
fclose($fp);
}
function _updateCacheArray($source){
if(is_array($this->cacheData) &&
in_array($source,$this->cacheData)){
foreach($this->cacheData as
$key=>$val){
if(trim($val) == trim($source)){
$key =microtime();
}
$new[$key]= $val;
}
$this->cacheData = $new;
}else{
$this->cacheData[microtime()] = $source;
}
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// test data below
once you are happy how it works just remove this stuff
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//bbc news
stories
$newsSources['AA'] ['<input type=text name=imie>']="$imie";
?>
<style
type=text/css><!--
td {
font-family:arial,verdana,tahoma;
font-size:12px;
background-color:#f0f0f0;
color:#000000;
}
--></style>
<?php
foreach($newsSources as
$name=>$array){
echo $name;
echo "<form method=post
action=".$_SERVER['PHP_SELF'].">\n";
echo "<select name=source>\n";
foreach($array as
$key=>$val){
$sel = ($val == $source)? " SELECTED " : "";
echo "<option
$sel value=$val>$key\n";
}
echo "</select>\n";
echo "<input type=submit name=go
value=Go>\n";
echo "</form>\n";
}
//++++++++++++++++
// script usage |
//++++++++++++++++
#$source = "http://www.newscientist.com/syndication/news.rdf";
#$go = 1;
if($go){
$feed =
new newsReader;
echo $feed->readNewsFeed($source);
}
?>
Jest to kod czytnika rss online.
Problem polega na tym że:
1.By wyświetlić kanał trzeba dwa razy przycisnąć „GO”
2.Obok miejsca na wpisanie adresu kanału jest przycisk do listy, którego nie powinno być
3.Nad wiadomościami rss wyswietla się jakiś komunikat: Warning: in_array(): Wrong datatype for second argument in /home/users/webmasts_rss/www/newsReader.php on line 66
Przykład możecie znaleźć tutaj http://www.rss.webmasts.avx.pl/newsReader.php